]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
merge relevant lib code from samba4
authorAndrew Tridgell <tridge@samba.org>
Sat, 5 May 2007 07:46:54 +0000 (17:46 +1000)
committerAndrew Tridgell <tridge@samba.org>
Sat, 5 May 2007 07:46:54 +0000 (17:46 +1000)
(This used to be ctdb commit 8076a7c7e12da6d59bae31a2e4a0267d87c7b1b3)

ctdb/lib/events/config.m4
ctdb/lib/events/events_aio.c
ctdb/lib/events/events_epoll.c
ctdb/lib/events/events_internal.h
ctdb/lib/events/events_select.c
ctdb/lib/events/events_standard.c
ctdb/lib/events/events_timed.c
ctdb/lib/tdb/Makefile.in
ctdb/lib/tdb/configure.ac

index c65ff91b1744e46681df5df1bdc8a6b0994a9f32..180b58cbc6a37a25b2f932509c62a3f7547e0015 100644 (file)
@@ -5,6 +5,7 @@ AC_CHECK_HEADERS(sys/epoll.h)
 AC_CHECK_FUNCS(epoll_create)
 if test x"$ac_cv_header_sys_epoll_h" = x"yes" -a x"$ac_cv_func_epoll_create" = x"yes";then
        SMB_ENABLE(EVENTS_EPOLL,YES)
+       AC_DEFINE(HAVE_EVENTS_EPOLL, 1, [Whether epoll is available])
 
        # check for native Linux AIO interface
        AC_CHECK_HEADERS(libaio.h)
index 3504df19cb141ae0b778cfd849cc6932ab99df14..204b74933251ddb6a19af271433f3a188a336adb 100644 (file)
@@ -250,7 +250,8 @@ static int aio_event_loop(struct aio_event_context *aio_ev, struct timeval *tval
        }
 
        if (ret == 0 && tvalp) {
-               common_event_loop_timer(aio_ev->ev);
+               /* we don't care about a possible delay here */
+               common_event_loop_timer_delay(aio_ev->ev);
                return 0;
        }
 
@@ -436,10 +437,8 @@ static int aio_event_loop_once(struct event_context *ev)
                                                           struct aio_event_context);
        struct timeval tval;
 
-       tval = common_event_loop_delay(ev);
-
+       tval = common_event_loop_timer_delay(ev);
        if (timeval_is_zero(&tval)) {
-               common_event_loop_timer(ev);
                return 0;
        }
 
index 16976977ca3f9634758f8a672521c6c8af795bfd..b553b6fd492016e1c0f401adc677e5337f28ee4a 100644 (file)
@@ -235,7 +235,8 @@ static int epoll_event_loop(struct epoll_event_context *epoll_ev, struct timeval
        }
 
        if (ret == 0 && tvalp) {
-               common_event_loop_timer(epoll_ev->ev);
+               /* we don't care about a possible delay here */
+               common_event_loop_timer_delay(epoll_ev->ev);
                return 0;
        }
 
@@ -383,10 +384,8 @@ static int epoll_event_loop_once(struct event_context *ev)
                                                           struct epoll_event_context);
        struct timeval tval;
 
-       tval = common_event_loop_delay(ev);
-
+       tval = common_event_loop_timer_delay(ev);
        if (timeval_is_zero(&tval)) {
-               common_event_loop_timer(ev);
                return 0;
        }
 
index 04b92df550574a7d254c7e5f8be68f6bb5398b61..fb15665c0a44fb48c7f4137d81585e9d17828b20 100644 (file)
@@ -117,8 +117,7 @@ bool event_register_backend(const char *name, const struct event_ops *ops);
 
 struct timed_event *common_event_add_timed(struct event_context *, TALLOC_CTX *,
                                           struct timeval, event_timed_handler_t, void *);
-void common_event_loop_timer(struct event_context *);
-struct timeval common_event_loop_delay(struct event_context *);
+struct timeval common_event_loop_timer_delay(struct event_context *);
 
 struct signal_event *common_event_add_signal(struct event_context *ev, 
                                             TALLOC_CTX *mem_ctx,
index 32efa485cf9f8fe7a00ef415a57abf25fc324877..55b477bfa798932efcab81a0443fe5ce6e31e30c 100644 (file)
@@ -223,7 +223,8 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru
        }
 
        if (selrtn == 0 && tvalp) {
-               common_event_loop_timer(select_ev->ev);
+               /* we don't care about a possible delay here */
+               common_event_loop_timer_delay(select_ev->ev);
                return 0;
        }
 
@@ -257,10 +258,8 @@ static int select_event_loop_once(struct event_context *ev)
                                                           struct select_event_context);
        struct timeval tval;
 
-       tval = common_event_loop_delay(ev);
-
+       tval = common_event_loop_timer_delay(ev);
        if (timeval_is_zero(&tval)) {
-               common_event_loop_timer(ev);
                return 0;
        }
 
index dfad0e66b3a8bf02431832f4d1f95d19f9144956..799b19813ac58d3af082bfcf59ebbd578b03b734 100644 (file)
@@ -248,7 +248,8 @@ static int epoll_event_loop(struct std_event_context *std_ev, struct timeval *tv
        }
 
        if (ret == 0 && tvalp) {
-               common_event_loop_timer(std_ev->ev);
+               /* we don't care about a possible delay here */
+               common_event_loop_timer_delay(std_ev->ev);
                return 0;
        }
 
@@ -476,7 +477,8 @@ static int std_event_loop_select(struct std_event_context *std_ev, struct timeva
        }
 
        if (selrtn == 0 && tvalp) {
-               common_event_loop_timer(std_ev->ev);
+               /* we don't care about a possible delay here */
+               common_event_loop_timer_delay(std_ev->ev);
                return 0;
        }
 
@@ -510,10 +512,8 @@ static int std_event_loop_once(struct event_context *ev)
                                                           struct std_event_context);
        struct timeval tval;
 
-       tval = common_event_loop_delay(ev);
-
+       tval = common_event_loop_timer_delay(ev);
        if (timeval_is_zero(&tval)) {
-               common_event_loop_timer(ev);
                return 0;
        }
 
index c85f8371c119ee1b35fd531b32e3720b6ee1ffa3..31619dcb5fddb4f47582fd340879840a29e4f192 100644 (file)
@@ -68,9 +68,7 @@ struct timed_event *common_event_add_timed(struct event_context *ev, TALLOC_CTX
        last_te = NULL;
        for (cur_te = ev->timed_events; cur_te; cur_te = cur_te->next) {
                /* if the new event comes before the current one break */
-               if (!timeval_is_zero(&cur_te->next_event) &&
-                   timeval_compare(&te->next_event,
-                                   &cur_te->next_event) < 0) {
+               if (timeval_compare(&te->next_event, &cur_te->next_event) < 0) {
                        break;
                }
 
@@ -85,17 +83,47 @@ struct timed_event *common_event_add_timed(struct event_context *ev, TALLOC_CTX
 }
 
 /*
-  a timer has gone off - call it
+  do a single event loop using the events defined in ev
+
+  return the delay untill the next timed event,
+  or zero if a timed event was triggered
 */
-void common_event_loop_timer(struct event_context *ev)
+struct timeval common_event_loop_timer_delay(struct event_context *ev)
 {
-       struct timeval t = timeval_current();
+       struct timeval current_time = timeval_zero();
        struct timed_event *te = ev->timed_events;
 
-       if (te == NULL) {
-               return;
+       if (!te) {
+               /* have a default tick time of 30 seconds. This guarantees
+                  that code that uses its own timeout checking will be
+                  able to proceeed eventually */
+               return timeval_set(30, 0);
        }
 
+       /*
+        * work out the right timeout for the next timed event
+        *
+        * avoid the syscall to gettimeofday() if the timed event should
+        * be triggered directly
+        *
+        * if there's a delay till the next timed event, we're done
+        * with just returning the delay
+        */
+       if (!timeval_is_zero(&te->next_event)) {
+               struct timeval delay;
+
+               current_time = timeval_current();
+
+               delay = timeval_until(&current_time, &te->next_event);
+               if (!timeval_is_zero(&delay)) {
+                       return delay;
+               }
+       }
+
+       /*
+        * ok, we have a timed event that we'll process ...
+        */
+
        /* deny the handler to free the event */
        talloc_set_destructor(te, common_event_timed_deny_destructor);
 
@@ -104,33 +132,21 @@ void common_event_loop_timer(struct event_context *ev)
         * handler we don't want to come across this event again -- vl */
        DLIST_REMOVE(ev->timed_events, te);
 
-       te->handler(ev, te, t, te->private_data);
+       /*
+        * If the timed event was registered for a zero current_time,
+        * then we pass a zero timeval here too! To avoid the
+        * overhead of gettimeofday() calls.
+        *
+        * otherwise we pass the current time
+        */
+       te->handler(ev, te, current_time, te->private_data);
 
        /* The destructor isn't necessary anymore, we've already removed the
         * event from the list. */
        talloc_set_destructor(te, NULL);
 
        talloc_free(te);
-}
 
-/*
-  do a single event loop using the events defined in ev 
-*/
-struct timeval common_event_loop_delay(struct event_context *ev)
-{
-       struct timeval tval;
-
-       /* work out the right timeout for all timed events */
-       if (ev->timed_events) {
-               struct timeval t = timeval_current();
-               tval = timeval_until(&t, &ev->timed_events->next_event);
-       } else {
-               /* have a default tick time of 30 seconds. This guarantees
-                  that code that uses its own timeout checking will be
-                  able to proceeed eventually */
-               tval = timeval_set(30, 0);
-       }
-       
-       return tval;
+       return timeval_zero();
 }
 
index 4a6382c104d16560b0f50734ba2000db287683de..ba98564506be7a75e4510fcf77c1c8e3f3d6a2b5 100644 (file)
@@ -19,8 +19,8 @@ EXEEXT = @EXEEXT@
 
 .PHONY: test
 
-PROGS = bin/tdbtool$(EXEEXT) bin/tdbtorture$(EXEEXT)
-PROGS_NOINSTALL = bin/tdbtest$(EXEEXT) bin/tdbdump$(EXEEXT) bin/tdbbackup$(EXEEXT)
+PROGS = bin/tdbtool$(EXEEXT) bin/tdbdump$(EXEEXT) bin/tdbbackup$(EXEEXT)
+PROGS_NOINSTALL = bin/tdbtest$(EXEEXT) bin/tdbtorture$(EXEEXT)
 ALL_PROGS = $(PROGS) $(PROGS_NOINSTALL)
 
 TDB_OBJ = @TDB_OBJ@ @LIBREPLACEOBJ@
index d3844c6ac79578c8e479be24e666378eb0ac28fe..8bfff589cc58e1d81dedeab9b9e60ff4b6eb5ee6 100644 (file)
@@ -2,7 +2,7 @@ AC_PREREQ(2.50)
 AC_DEFUN([SMB_MODULE_DEFAULT], [echo -n ""])
 AC_DEFUN([SMB_LIBRARY_ENABLE], [echo -n ""])
 AC_DEFUN([SMB_ENABLE], [echo -n ""])
-AC_INIT(tdb, 1.1)
+AC_INIT(tdb, 1.1.0)
 AC_CONFIG_SRCDIR([common/tdb.c])
 AC_CONFIG_HEADER(include/config.h)
 AC_LIBREPLACE_ALL_CHECKS