s4:libcli/smb2: make sure only one idle event runs at a time
authorStefan Metzmacher <metze@samba.org>
Tue, 22 Nov 2011 09:10:30 +0000 (10:10 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 29 Nov 2011 15:00:08 +0000 (16:00 +0100)
metze

source4/libcli/smb2/smb2.h
source4/libcli/smb2/transport.c

index e8ccdd9dc0e458896c94dd5801dcd9d22fe043c0..6d66e7a7e405380f093339c6d682b144ea367100 100644 (file)
@@ -75,6 +75,7 @@ struct smb2_transport {
                void (*func)(struct smb2_transport *, void *);
                void *private_data;
                unsigned int period;
+               struct tevent_timer *te;
        } idle;
 
        struct {
index 01f363b0a09c0c301f0129f376f011a4dda3baea..55281d2b49a25d20a903fb27c61efc283cb83828 100644 (file)
@@ -438,12 +438,16 @@ static void idle_handler(struct tevent_context *ev,
 {
        struct smb2_transport *transport = talloc_get_type(private_data,
                                                           struct smb2_transport);
-       struct timeval next = timeval_add(&t, 0, transport->idle.period);
-       tevent_add_timer(transport->ev,
-                        transport,
-                        next,
-                        idle_handler, transport);
+       struct timeval next;
+
        transport->idle.func(transport, transport->idle.private_data);
+
+       next = timeval_current_ofs_usec(transport->idle.period);
+       transport->idle.te = tevent_add_timer(transport->ev,
+                                             transport,
+                                             next,
+                                             idle_handler,
+                                             transport);
 }
 
 /*
@@ -455,12 +459,15 @@ void smb2_transport_idle_handler(struct smb2_transport *transport,
                                 uint64_t period,
                                 void *private_data)
 {
+       TALLOC_FREE(transport->idle.te);
+
        transport->idle.func = idle_func;
        transport->idle.private_data = private_data;
        transport->idle.period = period;
 
-       tevent_add_timer(transport->ev,
-                        transport,
-                        timeval_current_ofs(0, period),
-                        idle_handler, transport);
+       transport->idle.te = tevent_add_timer(transport->ev,
+                                             transport,
+                                             timeval_current_ofs_usec(period),
+                                             idle_handler,
+                                             transport);
 }