From 04fa5b4957d4d668be612ded509d6d6c8070d270 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 22 Nov 2011 10:10:30 +0100 Subject: [PATCH] s4:libcli/smb2: make sure only one idle event runs at a time metze --- source4/libcli/smb2/smb2.h | 1 + source4/libcli/smb2/transport.c | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/source4/libcli/smb2/smb2.h b/source4/libcli/smb2/smb2.h index e8ccdd9dc0..6d66e7a7e4 100644 --- a/source4/libcli/smb2/smb2.h +++ b/source4/libcli/smb2/smb2.h @@ -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 { diff --git a/source4/libcli/smb2/transport.c b/source4/libcli/smb2/transport.c index 01f363b0a0..55281d2b49 100644 --- a/source4/libcli/smb2/transport.c +++ b/source4/libcli/smb2/transport.c @@ -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); } -- 2.34.1