]> git.meshlink.io Git - catta/commitdiff
* hide some more files
authorLennart Poettering <lennart@poettering.net>
Sat, 16 Jul 2005 20:14:34 +0000 (20:14 +0000)
committerLennart Poettering <lennart@poettering.net>
Sat, 16 Jul 2005 20:14:34 +0000 (20:14 +0000)
* make sure not to run a time event twice in the same main loop iteration
* add new test timeeventq-test

git-svn-id: file:///home/lennart/svn/public/avahi/trunk@167 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe

avahi-core/Makefile.am
avahi-core/avahi-test.c
avahi-core/timeeventq-test.c [new file with mode: 0644]
avahi-core/timeeventq.c
avahi-core/timeeventq.h

index 0c6b1e2f3161150eee0ca6f6eb36ca4adc8f690b..7abc497dc120784b92e28da7b6b3f6ac6fe5f00d 100644 (file)
@@ -44,7 +44,8 @@ noinst_PROGRAMS = \
        avahi-test \
        conformance-test \
        avahi-reflector \
-       dns-test
+       dns-test \
+       timeeventq-test
 
 libavahi_core_la_SOURCES = \
        timeeventq.c timeeventq.h\
@@ -105,6 +106,13 @@ dns_test_SOURCES = \
 dns_test_CFLAGS = $(AM_CFLAGS)
 dns_test_LDADD = $(AM_LDADD) $(STATIC_COMMON_LDADD)
 
+timeeventq_test_SOURCES = \
+       timeeventq-test.c \
+       timeeventq.h timeeventq.c \
+       prioq.h prioq.c
+timeeventq_test_CFLAGS = $(AM_CFLAGS)
+timeeventq_test_LDADD = $(AM_LDADD) $(STATIC_COMMON_LDADD)
+
 valgrind: avahi-test
        libtool --mode=execute valgrind ./avahi-test
 
index 9bd4e2ca923bbc61d56437e33b43f4757f804d6d..61d3ea16f6af8d5e06043169b1cda704706da731 100644 (file)
@@ -235,11 +235,11 @@ int main(int argc, char *argv[]) {
 
     dsb = avahi_dns_server_browser_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "local", AVAHI_DNS_SERVER_RESOLVE, AVAHI_PROTO_UNSPEC, dsb_callback, NULL);
 
-    loop = g_main_loop_new(NULL, FALSE);
     
     g_timeout_add(1000*5, dump_timeout, server);
     g_timeout_add(1000*60, quit_timeout, loop);     
     
+    loop = g_main_loop_new(NULL, FALSE);
     g_main_loop_run(loop);
     g_main_loop_unref(loop);
 
diff --git a/avahi-core/timeeventq-test.c b/avahi-core/timeeventq-test.c
new file mode 100644 (file)
index 0000000..213488e
--- /dev/null
@@ -0,0 +1,59 @@
+/* $Id$ */
+
+/***
+  This file is part of avahi.
+  avahi is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as
+  published by the Free Software Foundation; either version 2.1 of the
+  License, or (at your option) any later version.
+  avahi is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
+  Public License for more details.
+  You should have received a copy of the GNU Lesser General Public
+  License along with avahi; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+
+#include "util.h"
+#include "timeeventq.h"
+
+static AvahiTimeEventQueue *q = NULL;
+
+void callback(AvahiTimeEvent*e, gpointer userdata) {
+    GTimeVal tv = {0, 0};
+    g_assert(e);
+    g_message("callback(%i)", GPOINTER_TO_INT(userdata));
+    avahi_elapse_time(&tv, 1000, 100);
+    avahi_time_event_queue_update(q, e, &tv);
+}
+
+int main(int argc, char *argv[]) {
+    GMainLoop *loop = NULL;
+    GTimeVal tv;
+    
+    q = avahi_time_event_queue_new(NULL, 0);
+
+    avahi_time_event_queue_add(q, avahi_elapse_time(&tv, 5000, 100), callback, GINT_TO_POINTER(1));
+    avahi_time_event_queue_add(q, avahi_elapse_time(&tv, 5000, 100), callback, GINT_TO_POINTER(2));
+
+    g_message("starting");
+    
+    loop = g_main_loop_new(NULL, FALSE);
+    g_main_loop_run(loop);
+    g_main_loop_unref(loop);
+
+    avahi_time_event_queue_free(q);
+
+    return 0;
+}
index efce7b7d1e2769be055dd1554fc9d425859b7467..60d9fe0eb1ebd7a1e1264bc246aa9094eba2b26b 100644 (file)
 
 static gint compare(gconstpointer _a, gconstpointer _b) {
     const AvahiTimeEvent *a = _a,  *b = _b;
+    gint ret;
 
-    return avahi_timeval_compare(&a->expiry, &b->expiry);
+    if ((ret = avahi_timeval_compare(&a->expiry, &b->expiry)) != 0)
+        return ret;
+
+    /* If both exevents are scheduled for the same time, put the entry
+     * that has been run earlier the last time first. */
+    return avahi_timeval_compare(&a->last_run, &b->last_run);
 }
 
 static gboolean prepare_func(GSource *source, gint *timeout) {
@@ -50,12 +56,17 @@ static gboolean prepare_func(GSource *source, gint *timeout) {
 
     g_source_get_current_time(source, &now);
 
-    if (avahi_timeval_compare(&now, &e->expiry) >= 0) {
+    if (avahi_timeval_compare(&now, &e->expiry) >= 0 &&  /* Time elapsed */
+        avahi_timeval_compare(&now, &e->last_run) != 0   /* Not yet run */) {
         *timeout = -1;
         return TRUE;
     }
 
     *timeout = (gint) (avahi_timeval_diff(&e->expiry, &now)/1000);
+
+    /* Wait at least 1 msec */
+    if (*timeout <= 0)
+        *timeout = 1;
     
     return FALSE;
 }
@@ -75,7 +86,9 @@ static gboolean check_func(GSource *source) {
 
     g_source_get_current_time(source, &now);
     
-    return avahi_timeval_compare(&now, &e->expiry) >= 0;
+    return
+        avahi_timeval_compare(&now, &e->expiry) >= 0 && /* Time elapsed */
+        avahi_timeval_compare(&now, &e->last_run) != 0;  /* Not yet run */
 }
 
 static gboolean dispatch_func(GSource *source, GSourceFunc callback, gpointer user_data) {
@@ -89,9 +102,19 @@ static gboolean dispatch_func(GSource *source, GSourceFunc callback, gpointer us
     while (q->prioq->root) {
         AvahiTimeEvent *e = q->prioq->root->data;
 
+        /* Not yet expired */
         if (avahi_timeval_compare(&now, &e->expiry) < 0)
             break;
 
+        /* Already ran */
+        if (avahi_timeval_compare(&now, &e->last_run) == 0)
+            break;
+
+        /* Make sure to move the entry away from the front */
+        e->last_run = now;
+        avahi_prio_queue_shuffle(q->prioq, e->node);
+
+        /* Run it */
         g_assert(e->callback);
         e->callback(e, e->userdata);
     }
@@ -99,6 +122,17 @@ static gboolean dispatch_func(GSource *source, GSourceFunc callback, gpointer us
     return TRUE;
 }
 
+static void fix_expiry_time(AvahiTimeEvent *e) {
+    GTimeVal now;
+    g_assert(e);
+
+    g_source_get_current_time(&e->queue->source, &now);
+
+    if (avahi_timeval_compare(&now, &e->expiry) > 0)
+        e->expiry = now;
+    
+}
+
 AvahiTimeEventQueue* avahi_time_event_queue_new(GMainContext *context, gint priority) {
     AvahiTimeEventQueue *q;
 
@@ -132,7 +166,7 @@ void avahi_time_event_queue_free(AvahiTimeEventQueue *q) {
     g_source_unref(&q->source);
 }
 
-AvahiTimeEvent* avahi_time_event_queue_add(AvahiTimeEventQueue *q, const GTimeVal *timeval, void (*callback)(AvahiTimeEvent *e, void *userdata), void *userdata) {
+AvahiTimeEvent* avahi_time_event_queue_add(AvahiTimeEventQueue *q, const GTimeVal *timeval, AvahiTimeEventCallback callback, gpointer userdata) {
     AvahiTimeEvent *e;
     
     g_assert(q);
@@ -142,10 +176,15 @@ AvahiTimeEvent* avahi_time_event_queue_add(AvahiTimeEventQueue *q, const GTimeVa
 
     e = g_new(AvahiTimeEvent, 1);
     e->queue = q;
-    e->expiry = *timeval;
     e->callback = callback;
     e->userdata = userdata;
 
+    e->expiry = *timeval;
+    fix_expiry_time(e);
+    
+    e->last_run.tv_sec = 0;
+    e->last_run.tv_usec = 0;
+
     e->node = avahi_prio_queue_put(q->prioq, e);
     
     return e;
@@ -164,8 +203,10 @@ void avahi_time_event_queue_update(AvahiTimeEventQueue *q, AvahiTimeEvent *e, co
     g_assert(q);
     g_assert(e);
     g_assert(e->queue == q);
+    g_assert(timeval);
 
     e->expiry = *timeval;
+    fix_expiry_time(e);
 
     avahi_prio_queue_shuffle(q->prioq, e->node);
 }
index a559d101029a4d643bc95b271c66480b4a6088dc..a2544ff2cbe14525badb82ea12c46136272891f7 100644 (file)
@@ -27,12 +27,15 @@ typedef struct AvahiTimeEvent AvahiTimeEvent;
 
 #include "prioq.h"
 
+typedef void (*AvahiTimeEventCallback)(AvahiTimeEvent *e, gpointer userdata);
+
 struct AvahiTimeEvent {
     AvahiTimeEventQueue *queue;
     AvahiPrioQueueNode *node;
     GTimeVal expiry;
-    void (*callback)(AvahiTimeEvent *e, void *userdata);
-    void *userdata;
+    GTimeVal last_run;
+    AvahiTimeEventCallback callback;
+    gpointer userdata;
 };
 
 struct AvahiTimeEventQueue {
@@ -43,7 +46,7 @@ struct AvahiTimeEventQueue {
 AvahiTimeEventQueue* avahi_time_event_queue_new(GMainContext *context, gint priority);
 void avahi_time_event_queue_free(AvahiTimeEventQueue *q);
 
-AvahiTimeEvent* avahi_time_event_queue_add(AvahiTimeEventQueue *q, const GTimeVal *timeval, void (*callback)(AvahiTimeEvent *e, void *userdata), void *userdata);
+AvahiTimeEvent* avahi_time_event_queue_add(AvahiTimeEventQueue *q, const GTimeVal *timeval, AvahiTimeEventCallback callback, gpointer userdata);
 void avahi_time_event_queue_remove(AvahiTimeEventQueue *q, AvahiTimeEvent *e);
 
 void avahi_time_event_queue_update(AvahiTimeEventQueue *q, AvahiTimeEvent *e, const GTimeVal *timeval);