r5185: make all the events data structures private to events.c. This will
authorAndrew Tridgell <tridge@samba.org>
Thu, 3 Feb 2005 02:35:52 +0000 (02:35 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:09:29 +0000 (13:09 -0500)
make it possible to add optimisations to the events code such as
keeping the next timed event in a sorted list, and using epoll for
file descriptor events.

I also removed the loop events code, as it wasn't being used anywhere,
and changed timed events to always be one-shot (as adding a new timed
event in the event handler is so easy to do if needed)
(This used to be commit d7b4b6de51342a65bf46fce772d313f92f8d73d3)

33 files changed:
source4/include/events.h
source4/ldap_server/ldap_server.c
source4/lib/basic.mk
source4/lib/events.c
source4/lib/messaging/messaging.c
source4/libcli/composite/composite.c
source4/libcli/config.mk
source4/libcli/nbt/nbtsocket.c
source4/libcli/raw/clisocket.c
source4/libcli/raw/clitransport.c
source4/libcli/raw/rawrequest.c
source4/libcli/resolve/host.c
source4/libcli/resolve/resolve.c
source4/librpc/rpc/dcerpc.c
source4/librpc/rpc/dcerpc_sock.c
source4/nbt_server/register.c
source4/ntvfs/cifs/vfs_cifs.c
source4/ntvfs/posix/pvfs_wait.c
source4/rpc_server/dcerpc_server.c
source4/rpc_server/dcerpc_sock.c
source4/rpc_server/echo/rpc_echo.c
source4/smb_server/request.c
source4/smb_server/smb_server.c
source4/smbd/process_model.c
source4/smbd/process_model.h
source4/smbd/server.c
source4/smbd/service_stream.c
source4/torture/local/messaging.c
source4/torture/nbt/query.c
source4/torture/raw/composite.c
source4/torture/rpc/echo.c
source4/torture/rpc/netlogon.c
source4/winbind/wb_server.c

index 51a78306bb07a00c3fe796cc174ef239a2b72693..ec6493232eb4a8c09158e3e321c9640b310410cf 100644 (file)
@@ -1,7 +1,9 @@
 /* 
    Unix SMB/CIFS implementation.
-   main select loop and event handling
-   Copyright (C) Andrew Tridgell 2003
+
+   generalised event loop handling
+
+   Copyright (C) Andrew Tridgell 2005
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-/*
-  please read the comments in events.c before modifying
-*/
+struct event_context;
+struct fd_event;
+struct timed_event;
 
-struct event_context { 
-       /* list of filedescriptor events */
-       struct fd_event {
-               struct event_context *event_ctx;
-               struct fd_event *next, *prev;
-               int fd;
-               uint16_t flags; /* see EVENT_FD_* flags */
-               void (*handler)(struct event_context *ev, struct fd_event *fde, 
-                               struct timeval t, uint16_t flags);
-               void *private;
-       } *fd_events;
+/* event handler types */
+typedef void (*event_fd_handler_t)(struct event_context *, struct fd_event *, 
+                                  struct timeval , uint16_t , void *);
+typedef void (*event_timed_handler_t)(struct event_context *, struct timed_event *, 
+                                     struct timeval , void *);
 
-       /* list of timed events */
-       struct timed_event {
-               struct event_context *event_ctx;
-               struct timed_event *next, *prev;
-               struct timeval next_event;
-               void (*handler)(struct event_context *ev, struct timed_event *te, 
-                               struct timeval t);
-               void *private;
-       } *timed_events;
+struct event_context *event_context_init(TALLOC_CTX *mem_ctx);
 
-       /* list of loop events - called on each select() */
-       struct loop_event {
-               struct event_context *event_ctx;
-               struct loop_event *next, *prev;
-               void (*handler)(struct event_context *ev, struct loop_event *le, 
-                               struct timeval t);
-               void *private;
-       } *loop_events;
+struct fd_event *event_add_fd(struct event_context *ev, TALLOC_CTX *mem_ctx,
+                             int fd, uint16_t flags, event_fd_handler_t handler,
+                             void *private);
 
-       /* list of signal events */
-       struct signal_event {
-               struct event_context *event_ctx;
-               struct signal_event *next, *prev;
-               int signum;
-               void (*handler)(struct event_context *ev, struct signal_event *se, int signum, void *sigarg);
-               void *private;
-       } *signal_events;
+struct timed_event *event_add_timed(struct event_context *ev, TALLOC_CTX *mem_ctx,
+                                   struct timeval next_event, 
+                                   event_timed_handler_t handler, 
+                                   void *private);
 
-       /* the maximum file descriptor number in fd_events */
-       int maxfd;
+int event_loop_once(struct event_context *ev);
+int event_loop_wait(struct event_context *ev);
 
-       /* information for exiting from the event loop */
-       struct {
-               BOOL exit_now;
-               int code;
-       } exit;
+uint16_t event_fd_flags(struct fd_event *fde);
+void event_fd_setflags(struct fd_event *fde, uint16_t flags);
 
-       /* This is the talloc parent for all concrete event structures in this
-        * event context. This makes merging easy. */
-       void *events;
+/* bits for file descriptor event flags */
+#define EVENT_FD_READ 1
+#define EVENT_FD_WRITE 2
 
-       /* this is changed by the destructors for any event type. It
-          is used to detect event destruction by event handlers,
-          which means the code that is calling all event handles
-          needs to assume that the linked list is no longer valid 
-       */
-       uint32_t destruction_count;
-};
+#define EVENT_FD_WRITEABLE(fde) \
+       event_fd_setflags(fde, event_fd_flags(fde) | EVENT_FD_WRITE)
+#define EVENT_FD_READABLE(fde) \
+       event_fd_setflags(fde, event_fd_flags(fde) | EVENT_FD_READ)
 
+#define EVENT_FD_NOT_WRITEABLE(fde) \
+       event_fd_setflags(fde, event_fd_flags(fde) & ~EVENT_FD_WRITE)
+#define EVENT_FD_NOT_READABLE(fde) \
+       event_fd_setflags(fde, event_fd_flags(fde) & ~EVENT_FD_WRITE)
 
-/* bits for fd_event.flags */
-#define EVENT_FD_READ 1
-#define EVENT_FD_WRITE 2
index 96305b1b2a6967645cb2da35c9e784c6cf3f8c86..87e46a3d51b04e0a12b9bb28375946f4d233e725 100644 (file)
@@ -415,7 +415,7 @@ static void ldapsrv_recv(struct stream_connection *conn, struct timeval t,
        }
 
        if ((ldap_conn->out_buffer.length > 0)||(ldap_conn->sasl_out_buffer.length > 0)) {
-               conn->event.fde->flags |= EVENT_FD_WRITE;
+               EVENT_FD_WRITEABLE(conn->event.fde);
        }
 
        return;
@@ -437,7 +437,7 @@ static void ldapsrv_send(struct stream_connection *conn, struct timeval t,
        }
 
        if (ldap_conn->out_buffer.length == 0 && ldap_conn->sasl_out_buffer.length == 0) {
-               conn->event.fde->flags &= ~EVENT_FD_WRITE;
+               EVENT_FD_NOT_WRITEABLE(conn->event.fde);
        }
 
        return;
index af1420c685d87c845eb3112ca6c6794e16e00185..dda79f50ad87b415862419dd1bfd26a6995946d2 100644 (file)
@@ -32,6 +32,15 @@ ADD_OBJ_FILES = \
 # End SUBSYSTEM LIBCRYPTO
 ##############################
 
+##############################
+# Start SUBSYSTEM LIBEVENTS
+[SUBSYSTEM::LIBEVENTS]
+NOPROTO = YES
+INIT_OBJ_FILES = lib/events.o
+REQUIRED_SUBSYSTEMS = LIBTALLOC
+# End SUBSYSTEM LIBEVENTS
+##############################
+
 ##############################
 # Start SUBSYSTEM LIBBASIC
 [SUBSYSTEM::LIBBASIC]
@@ -62,7 +71,6 @@ ADD_OBJ_FILES = \
                lib/pam_errors.o \
                intl/lang_tdb.o \
                lib/mutex.o \
-               lib/events.o \
                lib/server_mutex.o \
                lib/idtree.o \
                lib/unix_privs.o \
index ebfa1648853301e02b065ae19f744dc21734b415..b2e0404e34f365b3cb60fb37f51a69d2a01d5a27 100644 (file)
@@ -26,7 +26,7 @@
   register one of the possible event types and implement that event
   somewhere else.
 
-  There are 4 types of event handling that are handled in this module:
+  There are 2 types of event handling that are handled in this module:
 
   1) a file descriptor becoming readable or writeable. This is mostly
      used for network sockets, but can be used for any type of file
      like. When they are called the handler can choose to set the time
      for the next event. If next_event is not set then the event is removed.
 
-  3) an event that happens every time through the select loop. These
-     sorts of events should be very fast, as they will occur a
-     lot. Mostly used for things like destroying a talloc context or
-     checking a signal flag.
-
-  4) an event triggered by a signal. These can be one shot or
-     repeated. You can have more than one handler registered for a
-     single signal if you want to.
-
   To setup a set of events you first need to create a event_context
   structure using the function event_context_init(); This returns a
   'struct event_context' that you use in all subsequent calls.
@@ -59,8 +50,7 @@
 
   Finally, you call event_loop_wait() to block waiting for one of the
   events to occor. In normal operation event_loop_wait() will loop
-  forever, unless you call event_loop_exit() from inside one of your
-  handler functions.
+  forever.
 
 */
 
 #include "dlinklist.h"
 #include "events.h"
 
+
+/*
+  please read the comments in events.c before modifying
+*/
+
+
+struct event_context { 
+       /* list of filedescriptor events */
+       struct fd_event {
+               struct event_context *event_ctx;
+               struct fd_event *next, *prev;
+               int fd;
+               uint16_t flags; /* see EVENT_FD_* flags */
+               event_fd_handler_t handler;
+               void *private;
+       } *fd_events;
+
+       /* list of timed events */
+       struct timed_event {
+               struct event_context *event_ctx;
+               struct timed_event *next, *prev;
+               struct timeval next_event;
+               event_timed_handler_t handler;
+               void *private;
+       } *timed_events;
+
+       /* the maximum file descriptor number in fd_events */
+       int maxfd;
+
+       /* information for exiting from the event loop */
+       int exit_code;
+
+       /* this is changed by the destructors for any event type. It
+          is used to detect event destruction by event handlers,
+          which means the code that is calling all event handles
+          needs to assume that the linked list is no longer valid 
+       */
+       uint32_t destruction_count;
+};
+
 /*
   create a event_context structure. This must be the first events
   call, and all subsequent calls pass this event_context as the first
@@ -82,20 +112,9 @@ struct event_context *event_context_init(TALLOC_CTX *mem_ctx)
        ev = talloc_zero(mem_ctx, struct event_context);
        if (!ev) return NULL;
 
-       ev->events = talloc_new(ev);
-
        return ev;
 }
 
-/*
-  destroy an events context, also destroying any remaining events
-*/
-void event_context_destroy(struct event_context *ev)
-{
-       talloc_free(ev);
-}
-
-
 /*
   recalculate the maxfd
 */
@@ -131,17 +150,25 @@ static int event_fd_destructor(void *ptr)
   add a fd based event
   return NULL on failure (memory allocation error)
 */
-struct fd_event *event_add_fd(struct event_context *ev, struct fd_event *e0, 
-                             TALLOC_CTX *mem_ctx) 
+struct fd_event *event_add_fd(struct event_context *ev, TALLOC_CTX *mem_ctx,
+                             int fd, uint16_t flags, event_fd_handler_t handler,
+                             void *private)
 {
-       struct fd_event *e = talloc(ev->events, struct fd_event);
+       struct fd_event *e = talloc(ev, struct fd_event);
        if (!e) return NULL;
-       *e = *e0;
-       DLIST_ADD(ev->fd_events, e);
+
        e->event_ctx = ev;
+       e->fd        = fd;
+       e->flags     = flags;
+       e->handler   = handler;
+       e->private   = private;
+
+       DLIST_ADD(ev->fd_events, e);
+
        if (e->fd > ev->maxfd) {
                ev->maxfd = e->fd;
        }
+
        talloc_set_destructor(e, event_fd_destructor);
        if (mem_ctx) {
                talloc_steal(mem_ctx, e);
@@ -150,69 +177,58 @@ struct fd_event *event_add_fd(struct event_context *ev, struct fd_event *e0,
 }
 
 
-static int event_timed_destructor(void *ptr)
+/*
+  return the fd event flags
+*/
+uint16_t event_fd_flags(struct fd_event *fde)
 {
-       struct timed_event *te = talloc_get_type(ptr, struct timed_event);
-       DLIST_REMOVE(te->event_ctx->timed_events, te);
-       te->event_ctx->destruction_count++;
-       return 0;
+       return fde->flags;
 }
 
 /*
-  add a timed event
-  return NULL on failure (memory allocation error)
+  set the fd event flags
 */
-struct timed_event *event_add_timed(struct event_context *ev, struct timed_event *e0,
-                                   TALLOC_CTX *mem_ctx) 
+void event_fd_setflags(struct fd_event *fde, uint16_t flags)
 {
-       struct timed_event *e = talloc(ev->events, struct timed_event);
-       if (!e) return NULL;
-       *e = *e0;
-       e->event_ctx = ev;
-       DLIST_ADD(ev->timed_events, e);
-       talloc_set_destructor(e, event_timed_destructor);
-       if (mem_ctx) {
-               talloc_steal(mem_ctx, e);
-       }
-       return e;
+       fde->flags = flags;
 }
 
-static int event_loop_destructor(void *ptr)
+/*
+  destroy a timed event
+*/
+static int event_timed_destructor(void *ptr)
 {
-       struct loop_event *le = talloc_get_type(ptr, struct loop_event);
-       DLIST_REMOVE(le->event_ctx->loop_events, le);
-       le->event_ctx->destruction_count++;
+       struct timed_event *te = talloc_get_type(ptr, struct timed_event);
+       DLIST_REMOVE(te->event_ctx->timed_events, te);
+       te->event_ctx->destruction_count++;
        return 0;
 }
 
 /*
-  add a loop event
+  add a timed event
   return NULL on failure (memory allocation error)
 */
-struct loop_event *event_add_loop(struct event_context *ev, struct loop_event *e0,
-                                 TALLOC_CTX *mem_ctx)
+struct timed_event *event_add_timed(struct event_context *ev, TALLOC_CTX *mem_ctx,
+                                   struct timeval next_event, 
+                                   event_timed_handler_t handler, 
+                                   void *private) 
 {
-       struct loop_event *e = talloc(ev->events, struct loop_event);
+       struct timed_event *e = talloc(ev, struct timed_event);
        if (!e) return NULL;
-       *e = *e0;
-       e->event_ctx = ev;
-       DLIST_ADD(ev->loop_events, e);
-       talloc_set_destructor(e, event_loop_destructor);
+
+       e->event_ctx  = ev;
+       e->next_event = next_event;
+       e->handler    = handler;
+       e->private    = private;
+
+       DLIST_ADD(ev->timed_events, e);
+       talloc_set_destructor(e, event_timed_destructor);
        if (mem_ctx) {
                talloc_steal(mem_ctx, e);
        }
        return e;
 }
 
-/*
-  tell the event loop to exit with the specified code
-*/
-void event_loop_exit(struct event_context *ev, int code)
-{
-       ev->exit.exit_now = True;
-       ev->exit.code = code;
-}
-
 /*
   do a single event loop using the events defined in ev this function
 */
@@ -220,23 +236,11 @@ int event_loop_once(struct event_context *ev)
 {
        fd_set r_fds, w_fds;
        struct fd_event *fe;
-       struct loop_event *le;
        struct timed_event *te, *te_next;
        int selrtn;
-       struct timeval tval, t, *tvalp=NULL;
+       struct timeval tval, t, *tvalp;
        uint32_t destruction_count = ev->destruction_count;
 
-       t = timeval_current();
-
-       /* the loop events are called on each loop. Be careful to allow the 
-          event to remove itself */
-       for (le=ev->loop_events;le;) {
-               struct loop_event *next = le->next;
-               le->handler(ev, le, t);
-               if (destruction_count != ev->destruction_count) break;
-               le = next;
-       }
-
        FD_ZERO(&r_fds);
        FD_ZERO(&w_fds);
 
@@ -252,9 +256,8 @@ int event_loop_once(struct event_context *ev)
                fe = next;
        }
 
-       /* start with a reasonable max timeout */
-       tval.tv_sec = 0;
-       tval.tv_usec = 0;
+       tvalp = NULL;
+       t = timeval_current();
                
        /* work out the right timeout for all timed events */
        for (te=ev->timed_events;te;te=te_next) {
@@ -301,7 +304,7 @@ int event_loop_once(struct event_context *ev)
                           the event, so this must be a bug. This is a
                           fatal error. */
                        DEBUG(0,("EBADF on event_loop_once - exiting\n"));
-                       ev->exit.code = EBADF;
+                       ev->exit_code = EBADF;
                        return -1;
                }
                
@@ -314,7 +317,7 @@ int event_loop_once(struct event_context *ev)
                                if (FD_ISSET(fe->fd, &r_fds)) flags |= EVENT_FD_READ;
                                if (FD_ISSET(fe->fd, &w_fds)) flags |= EVENT_FD_WRITE;
                                if (flags) {
-                                       fe->handler(ev, fe, t, flags);
+                                       fe->handler(ev, fe, t, flags, fe->private);
                                        if (destruction_count != ev->destruction_count) {
                                                break;
                                        }
@@ -328,7 +331,7 @@ int event_loop_once(struct event_context *ev)
                struct timed_event *next = te->next;
                if (timeval_compare(&te->next_event, &t) >= 0) {
                        te->next_event = timeval_zero();
-                       te->handler(ev, te, t);
+                       te->handler(ev, te, t, te->private);
                        if (destruction_count != ev->destruction_count) {
                                break;
                        }
@@ -348,16 +351,14 @@ int event_loop_once(struct event_context *ev)
 */
 int event_loop_wait(struct event_context *ev)
 {
-       ZERO_STRUCT(ev->exit);
+       ev->exit_code = 0;
        ev->maxfd = EVENT_INVALID_MAXFD;
 
-       ev->exit.exit_now = False;
-
-       while (ev->fd_events && !ev->exit.exit_now) {
+       while (ev->fd_events && ev->exit_code == 0) {
                if (event_loop_once(ev) != 0) {
                        break;
                }
        }
 
-       return ev->exit.code;
+       return ev->exit_code;
 }
index 09d30027b0a75bb3402f566e719ad60a04866db3..53b6f434f067e392dac81bc8c53f2c3428b60143 100644 (file)
@@ -122,9 +122,9 @@ static void messaging_dispatch(struct messaging_context *msg, struct messaging_r
   handle IO for a single message
 */
 static void messaging_recv_handler(struct event_context *ev, struct fd_event *fde, 
-                                  struct timeval t, uint16_t flags)
+                                  struct timeval t, uint16_t flags, void *private)
 {
-       struct messaging_rec *rec = fde->private;
+       struct messaging_rec *rec = talloc_get_type(private, struct messaging_rec);
        struct messaging_context *msg = rec->msg;
        NTSTATUS status;
 
@@ -192,12 +192,12 @@ static void messaging_recv_handler(struct event_context *ev, struct fd_event *fd
   handle a new incoming connection
 */
 static void messaging_listen_handler(struct event_context *ev, struct fd_event *fde, 
-                                    struct timeval t, uint16_t flags)
+                                    struct timeval t, uint16_t flags, void *private)
 {
-       struct messaging_context *msg = fde->private;
+       struct messaging_context *msg = talloc_get_type(private, 
+                                                       struct messaging_context);
        struct messaging_rec *rec;
        NTSTATUS status;
-       struct fd_event fde2;
 
        rec = talloc(msg, struct messaging_rec);
        if (rec == NULL) {
@@ -210,17 +210,12 @@ static void messaging_listen_handler(struct event_context *ev, struct fd_event *
        }
        talloc_steal(rec, rec->sock);
 
-       rec->msg = msg;
-       rec->ndone = 0;
+       rec->msg           = msg;
+       rec->ndone         = 0;
        rec->header.length = 0;
-       rec->path = msg->path;
-
-       fde2.private    = rec;
-       fde2.fd         = socket_get_fd(rec->sock);
-       fde2.flags      = EVENT_FD_READ;
-       fde2.handler    = messaging_recv_handler;
-
-       rec->fde        = event_add_fd(msg->event.ev, &fde2, rec);
+       rec->path          = msg->path;
+       rec->fde           = event_add_fd(msg->event.ev, rec, socket_get_fd(rec->sock), 
+                                         EVENT_FD_READ, messaging_recv_handler, rec);
 }
 
 /*
@@ -262,9 +257,9 @@ void messaging_deregister(struct messaging_context *msg, uint32_t msg_type, void
   handle IO for sending a message
 */
 static void messaging_send_handler(struct event_context *ev, struct fd_event *fde, 
-                                  struct timeval t, uint16_t flags)
+                                  struct timeval t, uint16_t flags, void *private)
 {
-       struct messaging_rec *rec = fde->private;
+       struct messaging_rec *rec = talloc_get_type(private, struct messaging_rec);
        NTSTATUS status;
 
        if (rec->ndone < sizeof(rec->header)) {
@@ -330,17 +325,18 @@ static NTSTATUS try_connect(struct messaging_rec *rec)
   when the servers listen queue is full we use this to backoff the message
 */
 static void messaging_backoff_handler(struct event_context *ev, struct timed_event *te, 
-                                     struct timeval t)
+                                     struct timeval t, void *private)
 {
-       struct messaging_rec *rec = te->private;
+       struct messaging_rec *rec = talloc_get_type(private, struct messaging_rec);
        struct messaging_context *msg = rec->msg;
        NTSTATUS status;
-       struct fd_event fde;
 
        status = try_connect(rec);
        if (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
                /* backoff again */
-               te->next_event = timeval_add(&t, 0, MESSAGING_BACKOFF);
+               event_add_timed(msg->event.ev, rec, 
+                               timeval_add(&t, 0, MESSAGING_BACKOFF),
+                               messaging_backoff_handler, rec);
                return;
        }
 
@@ -351,14 +347,8 @@ static void messaging_backoff_handler(struct event_context *ev, struct timed_eve
                return;
        }
 
-       fde.private     = rec;
-       fde.fd          = socket_get_fd(rec->sock);
-       fde.flags       = EVENT_FD_WRITE;
-       fde.handler     = messaging_send_handler;
-
-       rec->fde        = event_add_fd(msg->event.ev, &fde, rec);
-
-       messaging_send_handler(msg->event.ev, rec->fde, timeval_zero(), EVENT_FD_WRITE);
+       rec->fde = event_add_fd(msg->event.ev, rec, socket_get_fd(rec->sock),
+                               EVENT_FD_WRITE, messaging_send_handler, rec);
 }
 
 
@@ -369,7 +359,6 @@ NTSTATUS messaging_send(struct messaging_context *msg, uint32_t server, uint32_t
 {
        struct messaging_rec *rec;
        NTSTATUS status;
-       struct fd_event fde;
 
        rec = talloc(msg, struct messaging_rec);
        if (rec == NULL) {
@@ -401,11 +390,9 @@ NTSTATUS messaging_send(struct messaging_context *msg, uint32_t server, uint32_t
        status = try_connect(rec);
        if (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
                /* backoff on this message - the servers listen queue is full */
-               struct timed_event te;
-               te.next_event = timeval_current_ofs(0, MESSAGING_BACKOFF);
-               te.handler = messaging_backoff_handler;
-               te.private = rec;
-               event_add_timed(msg->event.ev, &te, rec);
+               event_add_timed(msg->event.ev, rec, 
+                               timeval_current_ofs(0, MESSAGING_BACKOFF),
+                               messaging_backoff_handler, rec);
                return NT_STATUS_OK;
        }
 
@@ -414,14 +401,8 @@ NTSTATUS messaging_send(struct messaging_context *msg, uint32_t server, uint32_t
                return status;
        }
 
-       fde.private     = rec;
-       fde.fd          = socket_get_fd(rec->sock);
-       fde.flags       = EVENT_FD_WRITE;
-       fde.handler     = messaging_send_handler;
-
-       rec->fde        = event_add_fd(msg->event.ev, &fde, rec);
-
-       messaging_send_handler(msg->event.ev, rec->fde, timeval_zero(), EVENT_FD_WRITE);
+       rec->fde = event_add_fd(msg->event.ev, rec, socket_get_fd(rec->sock),
+                               EVENT_FD_WRITE, messaging_send_handler, rec);
 
        return NT_STATUS_OK;
 }
@@ -458,7 +439,6 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, uint32_t server_id
 {
        struct messaging_context *msg;
        NTSTATUS status;
-       struct fd_event fde;
 
        msg = talloc(mem_ctx, struct messaging_context);
        if (msg == NULL) {
@@ -491,13 +471,9 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, uint32_t server_id
                return NULL;
        }
 
-       fde.private     = msg;
-       fde.fd          = socket_get_fd(msg->sock);
-       fde.flags       = EVENT_FD_READ;
-       fde.handler     = messaging_listen_handler;
-
        msg->event.ev   = talloc_reference(msg, ev);
-       msg->event.fde  = event_add_fd(ev, &fde, msg);
+       msg->event.fde  = event_add_fd(ev, msg, socket_get_fd(msg->sock), 
+                                      EVENT_FD_READ, messaging_listen_handler, msg);
 
        talloc_set_destructor(msg, messaging_destructor);
        
index 998631204d1b68feca2b6ad2c74166314f66c69a..e08543a94bf14e7f91ea14165c2087e55320c82c 100644 (file)
@@ -22,6 +22,7 @@
 */
 
 #include "includes.h"
+#include "events.h"
 #include "libcli/raw/libcliraw.h"
 #include "libcli/composite/composite.h"
 
index 8458eb780d59416481b9e839d236407ca3b6d056..038b8e0ccbef518ea9c3504b6c22fca385958d32 100644 (file)
@@ -14,6 +14,7 @@ REQUIRED_SUBSYSTEMS = RPC_NDR_LSA
 [SUBSYSTEM::LIBCLI_COMPOSITE_BASE]
 ADD_OBJ_FILES = \
        libcli/composite/composite.o
+REQUIRED_SUBSYSTEMS = LIBEVENTS
 
 [SUBSYSTEM::LIBCLI_COMPOSITE]
 ADD_OBJ_FILES = \
@@ -31,7 +32,7 @@ ADD_OBJ_FILES = \
        libcli/nbt/namequery.o \
        libcli/nbt/nameregister.o \
        libcli/nbt/namerefresh.o
-REQUIRED_SUBSYSTEMS = LIBNDR_RAW NDR_NBT SOCKET LIBCLI_COMPOSITE_BASE
+REQUIRED_SUBSYSTEMS = LIBNDR_RAW NDR_NBT SOCKET LIBCLI_COMPOSITE_BASE LIBEVENTS
 
 [SUBSYSTEM::LIBCLI_RESOLVE]
 ADD_OBJ_FILES = \
index 3d1397e019a9b9dd39a753a31476500bd2028796..8e6fda1ece0ac0651f78b2d67c3af0a4ee00ac01 100644 (file)
@@ -49,11 +49,11 @@ static int nbt_name_request_destructor(void *ptr)
                req->te = NULL;
        }
        if (req->nbtsock->send_queue == NULL) {
-               req->nbtsock->fde->flags &= ~EVENT_FD_WRITE;
+               EVENT_FD_NOT_WRITEABLE(req->nbtsock->fde);
        }
        if (req->nbtsock->num_pending == 0 && 
            req->nbtsock->incoming.handler == NULL) {
-               req->nbtsock->fde->flags &= ~EVENT_FD_READ;
+               EVENT_FD_NOT_READABLE(req->nbtsock->fde);
        }
        return 0;
 }
@@ -86,12 +86,12 @@ static void nbt_name_socket_send(struct nbt_name_socket *nbtsock)
                        talloc_free(req);
                } else {
                        req->state = NBT_REQUEST_WAIT;
-                       nbtsock->fde->flags |= EVENT_FD_READ;
+                       EVENT_FD_READABLE(nbtsock->fde);
                        nbtsock->num_pending++;
                }
        }
 
-       nbtsock->fde->flags &= ~EVENT_FD_WRITE;
+       EVENT_FD_NOT_WRITEABLE(nbtsock->fde);
        talloc_free(tmp_ctx);
        return;
 
@@ -210,9 +210,9 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
   handle fd events on a nbt_name_socket
 */
 static void nbt_name_socket_handler(struct event_context *ev, struct fd_event *fde,
-                                   struct timeval t, uint16_t flags)
+                                   struct timeval t, uint16_t flags, void *private)
 {
-       struct nbt_name_socket *nbtsock = talloc_get_type(fde->private, 
+       struct nbt_name_socket *nbtsock = talloc_get_type(private, 
                                                          struct nbt_name_socket);
        if (flags & EVENT_FD_WRITE) {
                nbt_name_socket_send(nbtsock);
@@ -231,7 +231,6 @@ struct nbt_name_socket *nbt_name_socket_init(TALLOC_CTX *mem_ctx,
 {
        struct nbt_name_socket *nbtsock;
        NTSTATUS status;
-       struct fd_event fde;
 
        nbtsock = talloc(mem_ctx, struct nbt_name_socket);
        if (nbtsock == NULL) goto failed;
@@ -255,11 +254,9 @@ struct nbt_name_socket *nbt_name_socket_init(TALLOC_CTX *mem_ctx,
        nbtsock->num_pending = 0;
        nbtsock->incoming.handler = NULL;
 
-       fde.fd = socket_get_fd(nbtsock->sock);
-       fde.flags = 0;
-       fde.handler = nbt_name_socket_handler;
-       fde.private = nbtsock;
-       nbtsock->fde = event_add_fd(nbtsock->event_ctx, &fde, nbtsock);
+       nbtsock->fde = event_add_fd(nbtsock->event_ctx, nbtsock, 
+                                   socket_get_fd(nbtsock->sock), 0,
+                                   nbt_name_socket_handler, nbtsock);
        
        return nbtsock;
 
@@ -272,9 +269,9 @@ failed:
   handle a request timeout
 */
 static void nbt_name_socket_timeout(struct event_context *ev, struct timed_event *te,
-                                   struct timeval t)
+                                   struct timeval t, void *private)
 {
-       struct nbt_name_request *req = talloc_get_type(te->private, 
+       struct nbt_name_request *req = talloc_get_type(private, 
                                                       struct nbt_name_request);
        nbt_name_request_destructor(req);
        if (req->num_replies == 0) {
@@ -299,7 +296,6 @@ struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
                                               BOOL allow_multiple_replies)
 {
        struct nbt_name_request *req;
-       struct timed_event te;
        int id;
        NTSTATUS status;
 
@@ -335,10 +331,8 @@ struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
        request->name_trn_id = id;
        req->name_trn_id     = id;
 
-       te.next_event = timeout;
-       te.handler = nbt_name_socket_timeout;
-       te.private = req;
-       req->te = event_add_timed(nbtsock->event_ctx, &te, req);
+       req->te = event_add_timed(nbtsock->event_ctx, req, timeout,
+                                 nbt_name_socket_timeout, req);
        
        talloc_set_destructor(req, nbt_name_request_destructor);        
 
@@ -358,7 +352,7 @@ struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
                NDR_PRINT_DEBUG(nbt_name_packet, request);
        }
 
-       nbtsock->fde->flags |= EVENT_FD_WRITE;
+       EVENT_FD_WRITEABLE(nbtsock->fde);
 
        return req;
 
@@ -403,7 +397,7 @@ NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock,
 
        DLIST_ADD_END(nbtsock->send_queue, req, struct nbt_name_request *);
 
-       nbtsock->fde->flags |= EVENT_FD_WRITE;
+       EVENT_FD_WRITEABLE(nbtsock->fde);
 
        return NT_STATUS_OK;
 
@@ -442,7 +436,7 @@ NTSTATUS nbt_set_incoming_handler(struct nbt_name_socket *nbtsock,
 {
        nbtsock->incoming.handler = handler;
        nbtsock->incoming.private = private;
-       nbtsock->fde->flags |= EVENT_FD_READ;
+       EVENT_FD_READABLE(nbtsock->fde);
        return NT_STATUS_OK;
 }
 
index 78a096fb8fbec466d03ba61cff08f3e9d558a538..f9e662714b45ede8da05f8322f9ecbe21df44357 100644 (file)
@@ -65,16 +65,17 @@ struct smbcli_socket *smbcli_sock_init(TALLOC_CTX *mem_ctx,
 }
 
 static NTSTATUS smbcli_sock_connect_one(struct smbcli_socket *sock, 
-                                       const char *hostaddr, int port);
+                                       const char *hostaddr, int port, 
+                                       struct composite_context *c);
 
 /*
   handle socket write events during an async connect. These happen when the OS
   has either completed the connect() or has returned an error
 */
 static void smbcli_sock_connect_handler(struct event_context *ev, struct fd_event *fde, 
-                                       struct timeval t, uint16_t flags)
+                                       struct timeval t, uint16_t flags, void *private)
 {
-       struct composite_context *c = talloc_get_type(fde->private, struct composite_context);
+       struct composite_context *c = talloc_get_type(private, struct composite_context);
        struct clisocket_connect *conn = talloc_get_type(c->private, struct clisocket_connect);
        int i;
        
@@ -94,10 +95,9 @@ static void smbcli_sock_connect_handler(struct event_context *ev, struct fd_even
                conn->port_num = i;
                c->status = smbcli_sock_connect_one(conn->sock, 
                                                    conn->dest_host, 
-                                                   conn->iports[i]);
+                                                   conn->iports[i], c);
                if (NT_STATUS_IS_OK(c->status) ||
                    NT_STATUS_EQUAL(c->status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
-                       conn->sock->event.fde->private = c;
                        return;
                }
        }
@@ -113,9 +113,9 @@ static void smbcli_sock_connect_handler(struct event_context *ev, struct fd_even
   try to connect to the given address/port
 */
 static NTSTATUS smbcli_sock_connect_one(struct smbcli_socket *sock, 
-                                       const char *hostaddr, int port)
+                                       const char *hostaddr, int port,
+                                       struct composite_context *c)
 {
-       struct fd_event fde;
        NTSTATUS status;
 
        if (sock->sock) {
@@ -133,15 +133,11 @@ static NTSTATUS smbcli_sock_connect_one(struct smbcli_socket *sock,
 
        /* we initially look for write - see the man page on
           non-blocking connect */
-       fde.fd = socket_get_fd(sock->sock);
-       fde.flags = EVENT_FD_WRITE;
-       fde.handler = smbcli_sock_connect_handler;
-       fde.private = sock;
-
-       sock->event.fde = event_add_fd(sock->event.ctx, &fde, sock);
+       sock->event.fde = event_add_fd(sock->event.ctx, sock, socket_get_fd(sock->sock), 
+                                      EVENT_FD_WRITE, smbcli_sock_connect_handler, c);
 
        sock->port = port;
-       set_blocking(fde.fd, False);
+       set_blocking(socket_get_fd(sock->sock), False);
 
        return socket_connect(sock->sock, NULL, 0, hostaddr, port, 0);
 }
@@ -200,10 +196,9 @@ struct composite_context *smbcli_sock_connect_send(struct smbcli_socket *sock,
                conn->sock->port = conn->iports[i];
                c->status = smbcli_sock_connect_one(sock, 
                                                    conn->dest_host, 
-                                                   conn->iports[i]);
+                                                   conn->iports[i], c);
                if (NT_STATUS_IS_OK(c->status) ||
                    NT_STATUS_EQUAL(c->status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
-                       sock->event.fde->private = c;
                        return c;
                }
        }
index 1904618be93da8e28ae7c754485356a019db0b7c..21303a34aa826af894defeeea4fd435cd3844a68 100644 (file)
@@ -33,11 +33,13 @@ static void smbcli_transport_process_send(struct smbcli_transport *transport);
 /*
   an event has happened on the socket
 */
-static void smbcli_transport_event_handler(struct event_context *ev, struct fd_event *fde, 
-                                          struct timeval t, uint16_t flags)
+static void smbcli_transport_event_handler(struct event_context *ev, 
+                                          struct fd_event *fde, 
+                                          struct timeval t, 
+                                          uint16_t flags, void *private)
 {
-       struct smbcli_transport *transport = fde->private;
-
+       struct smbcli_transport *transport = talloc_get_type(private,
+                                                            struct smbcli_transport);
        if (flags & EVENT_FD_READ) {
                smbcli_transport_process_recv(transport);
                return;
@@ -87,9 +89,13 @@ struct smbcli_transport *smbcli_transport_init(struct smbcli_socket *sock,
 
        /* take over event handling from the socket layer - it only
           handles events up until we are connected */
-       transport->socket->event.fde->handler = smbcli_transport_event_handler;
-       transport->socket->event.fde->private = transport;
-       transport->socket->event.fde->flags = EVENT_FD_READ;
+       talloc_free(transport->socket->event.fde);
+       transport->socket->event.fde = event_add_fd(transport->socket->event.ctx,
+                                                   transport->socket,
+                                                   socket_get_fd(transport->socket->sock),
+                                                   EVENT_FD_READ,
+                                                   smbcli_transport_event_handler,
+                                                   transport);
 
        talloc_set_destructor(transport, transport_destructor);
 
@@ -132,7 +138,8 @@ void smbcli_transport_dead(struct smbcli_transport *transport)
 */
 static void smbcli_transport_write_enable(struct smbcli_transport *transport)
 {
-       transport->socket->event.fde->flags |= EVENT_FD_WRITE;
+       struct fd_event *fde = transport->socket->event.fde;
+       EVENT_FD_WRITEABLE(fde);
 }
 
 /*
@@ -140,7 +147,8 @@ static void smbcli_transport_write_enable(struct smbcli_transport *transport)
 */
 static void smbcli_transport_write_disable(struct smbcli_transport *transport)
 {
-       transport->socket->event.fde->flags &= ~EVENT_FD_WRITE;
+       struct fd_event *fde = transport->socket->event.fde;
+       EVENT_FD_NOT_WRITEABLE(fde);
 }
 
 /*
@@ -296,10 +304,15 @@ again:
 }
 
 static void idle_handler(struct event_context *ev, 
-                        struct timed_event *te, struct timeval t)
+                        struct timed_event *te, struct timeval t, void *private)
 {
-       struct smbcli_transport *transport = te->private;
-       te->next_event = timeval_add(&te->next_event, 0, transport->idle.period);
+       struct smbcli_transport *transport = talloc_get_type(private,
+                                                            struct smbcli_transport);
+       struct timeval next = timeval_add(&t, 0, transport->idle.period);
+       transport->socket->event.te = event_add_timed(transport->socket->event.ctx, 
+                                                     transport,
+                                                     next,
+                                                     idle_handler, transport);
        transport->idle.func(transport, transport->idle.private);
 }
 
@@ -312,7 +325,6 @@ void smbcli_transport_idle_handler(struct smbcli_transport *transport,
                                   uint64_t period,
                                   void *private)
 {
-       struct timed_event te;
        transport->idle.func = idle_func;
        transport->idle.private = private;
        transport->idle.period = period;
@@ -321,11 +333,10 @@ void smbcli_transport_idle_handler(struct smbcli_transport *transport,
                talloc_free(transport->socket->event.te);
        }
 
-       te.next_event = timeval_current_ofs(0, period);
-       te.handler = idle_handler;
-       te.private = transport;
        transport->socket->event.te = event_add_timed(transport->socket->event.ctx, 
-                                                     &te, transport);
+                                                     transport,
+                                                     timeval_current_ofs(0, period),
+                                                     idle_handler, transport);
 }
 
 /*
index 7dbe6b346819cc631e9c2285c8c0b3e13f7e84c1..420ce0a3a20d7c4feef37886e35df673e3aafce5 100644 (file)
@@ -26,6 +26,7 @@
 #include "includes.h"
 #include "libcli/raw/libcliraw.h"
 #include "dlinklist.h"
+#include "events.h"
 
 /* we over allocate the data buffer to prevent too many realloc calls */
 #define REQ_OVER_ALLOCATION 0
index 9bf278154d947f1d91b62eaa2347e650f47c4ca1..977c804a4accdfefbd77f5c422cbce1d863529b9 100644 (file)
@@ -83,9 +83,9 @@ static void run_child(struct composite_context *c, int fd)
   handle a read event on the pipe
 */
 static void pipe_handler(struct event_context *ev, struct fd_event *fde, 
-                        struct timeval t, uint16_t flags)
+                        struct timeval t, uint16_t flags, void *private)
 {
-       struct composite_context *c = talloc_get_type(fde->private, struct composite_context);
+       struct composite_context *c = talloc_get_type(private, struct composite_context);
        struct host_state *state = talloc_get_type(c->private, struct host_state);
        char address[128];
        int ret;
@@ -136,7 +136,6 @@ struct composite_context *resolve_name_host_send(struct nbt_name *name,
        struct host_state *state;
        NTSTATUS status;
        int fd[2] = { -1, -1 };
-       struct fd_event fde;
        int ret;
 
        c = talloc_zero(NULL, struct composite_context);
@@ -161,11 +160,8 @@ struct composite_context *resolve_name_host_send(struct nbt_name *name,
 
        /* we need to put the child in our event context so
           we know when the gethostbyname() has finished */
-       fde.fd = state->child_fd;
-       fde.flags = EVENT_FD_READ;
-       fde.handler = pipe_handler;
-       fde.private = c;
-       state->fde = event_add_fd(c->event_ctx, &fde, state);
+       state->fde = event_add_fd(c->event_ctx, state, state->child_fd, EVENT_FD_READ, 
+                                 pipe_handler, c);
        if (state->fde == NULL) {
                close(fd[0]);
                close(fd[1]);
index eb35a7cb996f40dbae5f431082e34a7a8725deda..e2e94625619f378a7de0122b093525b63323bce3 100644 (file)
@@ -21,6 +21,7 @@
 */
 
 #include "includes.h"
+#include "events.h"
 #include "libcli/raw/libcliraw.h"
 #include "libcli/composite/composite.h"
 
index 04a13b0100efc19982fbb75242e62a0857ed0032..da87ca73868c12d4e546da6a6329dcf92ffec7a0 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "includes.h"
 #include "dlinklist.h"
+#include "events.h"
 #include "librpc/gen_ndr/ndr_epmapper.h"
 #include "librpc/gen_ndr/ndr_dcerpc.h"
 
index 9fae7232ec94fcd25faa1734794cc07b741dc819..df4591d20e2c5b586dc2828aa639fc27b117f4a5 100644 (file)
@@ -74,7 +74,7 @@ static void sock_dead(struct dcerpc_connection *p, NTSTATUS status)
                p->transport.recv_data(p, NULL, status);
        }
 
-       sock->fde->flags &= ~(EVENT_FD_WRITE | EVENT_FD_READ);
+       talloc_free(sock->fde);
 }
 
 /*
@@ -109,7 +109,7 @@ static void sock_process_send(struct dcerpc_connection *p)
        }
 
        if (sock->pending_send == NULL) {
-               sock->fde->flags &= ~EVENT_FD_WRITE;
+               EVENT_FD_NOT_WRITEABLE(sock->fde);
        }
 }
 
@@ -184,7 +184,7 @@ static void sock_process_recv(struct dcerpc_connection *p)
        sock->recv.received = 0;
        sock->recv.pending_count--;
        if (sock->recv.pending_count == 0) {
-               sock->fde->flags &= ~EVENT_FD_READ;
+               EVENT_FD_NOT_READABLE(sock->fde);
        }
 }
 
@@ -192,9 +192,9 @@ static void sock_process_recv(struct dcerpc_connection *p)
   called when a IO is triggered by the events system
 */
 static void sock_io_handler(struct event_context *ev, struct fd_event *fde, 
-                           struct timeval t, uint16_t flags)
+                           struct timeval t, uint16_t flags, void *private)
 {
-       struct dcerpc_connection *p = fde->private;
+       struct dcerpc_connection *p = talloc_get_type(private, struct dcerpc_connection);
        struct sock_private *sock = p->transport.private;
 
        if (flags & EVENT_FD_WRITE) {
@@ -220,7 +220,7 @@ static NTSTATUS sock_send_read(struct dcerpc_connection *p)
 
        sock->recv.pending_count++;
        if (sock->recv.pending_count == 1) {
-               sock->fde->flags |= EVENT_FD_READ;
+               EVENT_FD_READABLE(sock->fde);
        }
        return NT_STATUS_OK;
 }
@@ -250,7 +250,7 @@ static NTSTATUS sock_send_request(struct dcerpc_connection *p, DATA_BLOB *data,
 
        DLIST_ADD_END(sock->pending_send, blob, struct sock_blob *);
 
-       sock->fde->flags |= EVENT_FD_WRITE;
+       EVENT_FD_WRITEABLE(sock->fde);
 
        if (trigger_read) {
                sock_send_read(p);
@@ -299,7 +299,6 @@ static NTSTATUS dcerpc_pipe_open_socket(struct dcerpc_connection *c,
 {
        struct sock_private *sock;
        struct socket_context *socket_ctx;
-       struct fd_event fde;
        NTSTATUS status;
 
        sock = talloc(c, struct sock_private);
@@ -342,12 +341,8 @@ static NTSTATUS dcerpc_pipe_open_socket(struct dcerpc_connection *c,
        sock->recv.data = data_blob(NULL, 0);
        sock->recv.pending_count = 0;
 
-       fde.fd = socket_get_fd(sock->sock);
-       fde.flags = 0;
-       fde.handler = sock_io_handler;
-       fde.private = c;
-
-       sock->fde = event_add_fd(sock->event_ctx, &fde, sock);
+       sock->fde = event_add_fd(sock->event_ctx, sock, socket_get_fd(sock->sock), 
+                                0, sock_io_handler, c);
 
        c->transport.private = sock;
 
index 6b75c992a99fdc3ce22fcb0375a5f89efd905948..6f308a0ba938ea0595ef751bb46200cef4e79600 100644 (file)
@@ -72,9 +72,9 @@ static void refresh_completion_handler(struct nbt_name_request *req)
   handle name refresh timer events
 */
 static void name_refresh_handler(struct event_context *ev, struct timed_event *te, 
-                                struct timeval t)
+                                struct timeval t, void *private)
 {
-       struct nbt_iface_name *iname = talloc_get_type(te->private, struct nbt_iface_name);
+       struct nbt_iface_name *iname = talloc_get_type(private, struct nbt_iface_name);
        struct nbt_interface *iface = iname->iface;
        struct nbt_name_refresh io;
        struct nbt_name_request *req;
@@ -101,17 +101,15 @@ static void name_refresh_handler(struct event_context *ev, struct timed_event *t
 */
 static void nbt_start_refresh_timer(struct nbt_iface_name *iname)
 {
-       struct timed_event te;
        uint32_t refresh_time;
        uint32_t max_refresh_time = lp_parm_int(-1, "nbtd", "max_refresh_time", 7200);
 
        refresh_time = MIN(max_refresh_time, iname->ttl/2);
        
-       te.next_event = timeval_current_ofs(refresh_time, 0);
-       te.handler    = name_refresh_handler;
-       te.private    = iname;
-
-       event_add_timed(iname->iface->nbtsrv->task->event_ctx, &te, iname);
+       event_add_timed(iname->iface->nbtsrv->task->event_ctx, 
+                       iname, 
+                       timeval_current_ofs(refresh_time, 0),
+                       name_refresh_handler, iname);
 }
 
 
index c4ed9c172aee0c994905f152db5dc5534bd15db8..9d873722f9f2c8f8f57d3a704845d51a7ca6d696 100644 (file)
@@ -65,14 +65,12 @@ static BOOL oplock_handler(struct smbcli_transport *transport, uint16_t tid, uin
   a handler for read events on a connection to a backend server
 */
 static void cifs_socket_handler(struct event_context *ev, struct fd_event *fde, 
-                               struct timeval t, uint16_t flags)
+                               struct timeval t, uint16_t flags, void *private)
 {
-       struct cvfs_private *private = fde->private;
-       struct smbsrv_tcon *tcon = private->tcon;
+       struct cvfs_private *cvfs = talloc_get_type(private, struct cvfs_private);
+       struct smbsrv_tcon *tcon = cvfs->tcon;
        
-       DEBUG(5,("cifs_socket_handler event on fd %d\n", fde->fd));
-       
-       if (!smbcli_transport_process(private->transport)) {
+       if (!smbcli_transport_process(cvfs->transport)) {
                /* the connection to our server is dead */
                talloc_free(tcon);
        }
@@ -90,6 +88,7 @@ static NTSTATUS cvfs_connect(struct ntvfs_module_context *ntvfs,
        const char *host, *user, *pass, *domain, *remote_share;
        struct smb_composite_connect io;
        struct composite_context *creq;
+       struct fd_event *fde;
 
        /* Here we need to determine which server to connect to.
         * For now we use parametric options, type cifs.
@@ -144,8 +143,16 @@ static NTSTATUS cvfs_connect(struct ntvfs_module_context *ntvfs,
        /* we need to receive oplock break requests from the server */
        smbcli_oplock_handler(private->transport, oplock_handler, private);
 
-       private->transport->socket->event.fde->handler = cifs_socket_handler;
-       private->transport->socket->event.fde->private = private;
+       /* take over event handling for this socket */
+       talloc_free(private->transport->socket->event.fde);
+       fde = event_add_fd(private->transport->socket->event.ctx,
+                          private,
+                          socket_get_fd(private->transport->socket->sock),
+                          EVENT_FD_READ | EVENT_FD_WRITE,
+                          cifs_socket_handler,
+                          private);
+       private->transport->socket->event.fde = fde;
+
 
        private->map_generic = lp_parm_bool(req->tcon->service, 
                                            "cifs", "mapgeneric", False);
index 276b1d4e9a5280844a7c20c46a181ca1e3718588..7a8e6700c51066f89e7f7669fab229fe8baa9967 100644 (file)
@@ -86,9 +86,9 @@ static void pvfs_wait_dispatch(struct messaging_context *msg, void *private, uin
   receive a timeout on a message wait
 */
 static void pvfs_wait_timeout(struct event_context *ev, 
-                             struct timed_event *te, struct timeval t)
+                             struct timed_event *te, struct timeval t, void *private)
 {
-       struct pvfs_wait *pwait = te->private;
+       struct pvfs_wait *pwait = talloc_get_type(private, struct pvfs_wait);
        struct smbsrv_request *req = pwait->req;
 
        pwait->reason = PVFS_WAIT_TIMEOUT;
@@ -124,7 +124,6 @@ static int pvfs_wait_destructor(void *ptr)
                        void (*fn)(void *, enum pvfs_wait_notice),
                        void *private)
 {
-       struct timed_event te;
        struct pvfs_wait *pwait;
 
        pwait = talloc(pvfs, struct pvfs_wait);
@@ -141,10 +140,8 @@ static int pvfs_wait_destructor(void *ptr)
        pwait->pvfs = pvfs;
 
        /* setup a timer */
-       te.next_event = end_time;
-       te.handler = pvfs_wait_timeout;
-       te.private = pwait;
-       pwait->te = event_add_timed(pwait->ev, &te, pwait);
+       pwait->te = event_add_timed(pwait->ev, pwait, end_time, 
+                                   pvfs_wait_timeout, pwait);
 
        /* register with the messaging subsystem for this message
           type */
index c21ab3d88378889498c7cfc4f1870b394177954d..51902ecb87c914342df9da279fd5029b524d5841 100644 (file)
@@ -878,7 +878,7 @@ NTSTATUS dcesrv_reply(struct dcesrv_call_state *call)
        if (call->conn->call_list && call->conn->call_list->replies) {
                if (call->conn->srv_conn &&
                    call->conn->srv_conn->event.fde) {
-                       call->conn->srv_conn->event.fde->flags |= EVENT_FD_WRITE;
+                       EVENT_FD_WRITEABLE(call->conn->srv_conn->event.fde);
                }
        }
 
index ef5e7c269aa4f07ea5ba0f7e996186465a028271..67b9065507392b7a48efc706ed5e70fc523030e7 100644 (file)
@@ -112,7 +112,7 @@ void dcesrv_sock_recv(struct stream_connection *conn, struct timeval t, uint16_t
        }
 
        if (dce_conn->call_list && dce_conn->call_list->replies) {
-               conn->event.fde->flags |= EVENT_FD_WRITE;
+               EVENT_FD_WRITEABLE(conn->event.fde);
        }
 }
 
@@ -128,7 +128,7 @@ void dcesrv_sock_send(struct stream_connection *conn, struct timeval t, uint16_t
        }
 
        if (!dce_conn->call_list || !dce_conn->call_list->replies) {
-               conn->event.fde->flags &= ~EVENT_FD_WRITE;
+               EVENT_FD_NOT_WRITEABLE(conn->event.fde);
        }
 }
 
index 009fa1aa6d8e2b2aaaa3dddd895cfaeba4747df2..f78d1d231d4fb670fa60d04b54ef78d1f11657f3 100644 (file)
@@ -119,9 +119,11 @@ struct echo_TestSleep_private {
        struct echo_TestSleep *r;
 };
 
-static void echo_TestSleep_handler(struct event_context *ev, struct timed_event *te, struct timeval t)
+static void echo_TestSleep_handler(struct event_context *ev, struct timed_event *te, 
+                                  struct timeval t, void *private)
 {
-       struct echo_TestSleep_private *p = te->private;
+       struct echo_TestSleep_private *p = talloc_get_type(private, 
+                                                          struct echo_TestSleep_private);
        struct echo_TestSleep *r = p->r;
        NTSTATUS status;
 
@@ -136,7 +138,6 @@ static void echo_TestSleep_handler(struct event_context *ev, struct timed_event
 
 static long echo_TestSleep(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct echo_TestSleep *r)
 {
-       struct timed_event te;
        struct echo_TestSleep_private *p;
 
        if (!(dce_call->state_flags & DCESRV_CALL_STATE_FLAG_MAY_ASYNC)) {
@@ -154,11 +155,9 @@ static long echo_TestSleep(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_c
        p->dce_call     = dce_call;
        p->r            = r;
 
-       te.handler      = echo_TestSleep_handler;
-       te.private      = p;
-       te.next_event   = timeval_add(&dce_call->time, r->in.seconds, 0);
-
-       event_add_timed(dce_call->event_ctx, &te, p);
+       event_add_timed(dce_call->event_ctx, p, 
+                       timeval_add(&dce_call->time, r->in.seconds, 0),
+                       echo_TestSleep_handler, p);
 
        dce_call->state_flags |= DCESRV_CALL_STATE_FLAG_ASYNC;
        return 0;
index 26988bf20567c9ffe40f364ffa979418214a55cf..c6847889f7caf1e0569a13d80dc2f4d49db6352a 100644 (file)
@@ -300,7 +300,7 @@ void req_send_reply_nosign(struct smbsrv_request *req)
           ready for write events */
        DLIST_ADD_END(req->smb_conn->pending_send, req, struct smbsrv_request *);
 
-       req->smb_conn->connection->event.fde->flags |= EVENT_FD_WRITE;
+       EVENT_FD_WRITEABLE(req->smb_conn->connection->event.fde);
 }
 
 /*
index 1537bf6a4763f38df08f9e516487015cebe2a67f..5220df034c545d474a2611e932f98c820a85a0f5 100644 (file)
@@ -662,7 +662,7 @@ static void smbsrv_recv(struct stream_connection *conn, struct timeval t, uint16
 
        status = receive_smb_request(smb_conn, t);
        if (NT_STATUS_IS_ERR(status)) {
-               conn->event.fde->flags = 0;
+               talloc_free(conn->event.fde);
                smbsrv_terminate_connection(smb_conn, nt_errstr(status));
                return;
        }
@@ -710,7 +710,7 @@ static void smbsrv_send(struct stream_connection *conn, struct timeval t, uint16
        /* if no more requests are pending to be sent then
           we should stop select for write */
        if (smb_conn->pending_send == NULL) {
-               conn->event.fde->flags &= ~EVENT_FD_WRITE;
+               EVENT_FD_NOT_WRITEABLE(conn->event.fde);
        }
 }
 
index 16a0075d2d5c4cf114b69d85b5dde10660d9e237..f4e21e7e1456c6d2df80507841633c64c15f8f9f 100644 (file)
@@ -105,9 +105,7 @@ const struct process_model_critical_sizes *process_model_version(void)
 {
        static const struct process_model_critical_sizes critical_sizes = {
                PROCESS_MODEL_VERSION,
-               sizeof(struct model_ops),
-               sizeof(struct event_context),
-               sizeof(struct fd_event)
+               sizeof(struct model_ops)
        };
 
        return &critical_sizes;
index 2e064f42772ed04187c33632816ba9f205028529..137f2add9111d1a564715a7061f5e785ac330325 100644 (file)
@@ -58,6 +58,4 @@ struct model_ops {
 struct process_model_critical_sizes {
        int interface_version;
        int sizeof_model_ops;
-       int sizeof_event_context;
-       int sizeof_fd_event;
 };
index 57f835970ee77c34aa60384f407af38f7e80da5f..bdc7d3212cbe11e1175ab643678df5b204be85ac 100644 (file)
@@ -24,6 +24,7 @@
 */
 
 #include "includes.h"
+#include "events.h"
 #include "version.h"
 #include "dynconfig.h"
 #include "lib/cmdline/popt_common.h"
index d832cc233db8fcb60d194315a7afafaef747926f..60a4c5feca2430b6c3074ac99c649ff5a402138a 100644 (file)
@@ -61,9 +61,9 @@ void stream_terminate_connection(struct stream_connection *srv_conn, const char
   the select loop has indicated that a stream is ready for IO
 */
 static void stream_io_handler(struct event_context *ev, struct fd_event *fde, 
-                             struct timeval t, uint16_t flags)
+                             struct timeval t, uint16_t flags, void *private)
 {
-       struct stream_connection *conn = talloc_get_type(fde->private, 
+       struct stream_connection *conn = talloc_get_type(private, 
                                                         struct stream_connection);
        if (flags & EVENT_FD_WRITE) {
                conn->ops->send_handler(conn, t, flags);
@@ -85,7 +85,6 @@ static void stream_new_connection(struct event_context *ev,
                                  uint32_t server_id, void *private)
 {
        struct stream_socket *stream_socket = talloc_get_type(private, struct stream_socket);
-       struct fd_event fde;
        struct stream_connection *srv_conn;
 
        srv_conn = talloc_zero(ev, struct stream_connection);
@@ -96,19 +95,15 @@ static void stream_new_connection(struct event_context *ev,
 
        talloc_steal(srv_conn, sock);
 
-       fde.private     = srv_conn;
-       fde.fd          = socket_get_fd(sock);
-       fde.flags       = EVENT_FD_READ;
-       fde.handler     = stream_io_handler;
-
        srv_conn->private       = stream_socket->private;
        srv_conn->model_ops     = stream_socket->model_ops;
        srv_conn->event.ctx     = ev;
-       srv_conn->event.fde     = &fde;
        srv_conn->socket        = sock;
        srv_conn->server_id     = server_id;
        srv_conn->ops           = stream_socket->ops;
-       srv_conn->event.fde     = event_add_fd(ev, &fde, srv_conn);
+       srv_conn->event.fde     = event_add_fd(ev, srv_conn, socket_get_fd(sock),
+                                              EVENT_FD_READ, 
+                                              stream_io_handler, srv_conn);
 
        if (!socket_check_access(sock, "smbd", lp_hostsallow(-1), lp_hostsdeny(-1))) {
                stream_terminate_connection(srv_conn, "denied by access rules");
@@ -131,9 +126,9 @@ static void stream_new_connection(struct event_context *ev,
   called when someone opens a connection to one of our listening ports
 */
 static void stream_accept_handler(struct event_context *ev, struct fd_event *fde, 
-                                 struct timeval t, uint16_t flags)
+                                 struct timeval t, uint16_t flags, void *private)
 {
-       struct stream_socket *stream_socket = talloc_get_type(fde->private, struct stream_socket);
+       struct stream_socket *stream_socket = talloc_get_type(private, struct stream_socket);
 
        /* ask the process model to create us a process for this new
           connection.  When done, it calls stream_new_connection()
@@ -158,7 +153,6 @@ NTSTATUS stream_setup_socket(struct event_context *event_context,
 {
        NTSTATUS status;
        struct stream_socket *stream_socket;
-       struct fd_event fde;
        int i;
 
        stream_socket = talloc_zero(event_context, struct stream_socket);
@@ -198,13 +192,9 @@ NTSTATUS stream_setup_socket(struct event_context *event_context,
                return status;
        }
 
-       /* we are only interested in read events on the listen socket */
-       fde.fd          = socket_get_fd(stream_socket->sock);
-       fde.flags       = EVENT_FD_READ;
-       fde.private     = stream_socket;
-       fde.handler     = stream_accept_handler;
-
-       event_add_fd(event_context, &fde, stream_socket->sock);
+       event_add_fd(event_context, stream_socket->sock, 
+                    socket_get_fd(stream_socket->sock), 
+                    EVENT_FD_READ, stream_accept_handler, stream_socket);
 
        stream_socket->private          = talloc_reference(stream_socket, private);
        stream_socket->ops              = stream_ops;
index bef26040067cd397ff8b49077a91c0a8d093874a..204b6bf2991e064798bbc960f1f47fac5ae1db4a 100644 (file)
@@ -21,6 +21,7 @@
 */
 
 #include "includes.h"
+#include "events.h"
 
 enum {MY_PING=1000, MY_PONG, MY_EXIT};
 
@@ -131,7 +132,7 @@ static BOOL test_ping_speed(TALLOC_CTX *mem_ctx)
 
        talloc_free(msg_ctx);
 
-       event_context_destroy(ev);
+       talloc_free(ev);
        return ret;
 }
 
index 6afde670328fbeb2ddf1e8de66f234cb5b9bdb7b..b89a774e06e8689c2313fc1e3efcfff2053bd272 100644 (file)
@@ -21,6 +21,7 @@
 */
 
 #include "includes.h"
+#include "events.h"
 #include "libcli/nbt/libnbt.h"
 #include "librpc/gen_ndr/ndr_nbt.h"
 
index 98f33bea3e5a382553cdc173d4fed345ccbc7f8d..49de23713e91515d0b1528b63aaec13a9fb3b166 100644 (file)
@@ -21,6 +21,7 @@
 */
 
 #include "includes.h"
+#include "events.h"
 #include "libcli/raw/libcliraw.h"
 #include "libcli/composite/composite.h"
 
index ec16a7bcd98f1f9176da34205494018e4379c447..7bf3a9dcc1078150d16e6e1023f7abc6cd5c6f7f 100644 (file)
@@ -21,6 +21,7 @@
 */
 
 #include "includes.h"
+#include "events.h"
 #include "librpc/gen_ndr/ndr_echo.h"
 
 
index 34ce26801f4ed0f4dbc5ce8d45bfcf64dffa9c59..f1ed62c7d4e7cbe618b32a4a36e2e4e61cea4d69 100644 (file)
@@ -23,6 +23,7 @@
 */
 
 #include "includes.h"
+#include "events.h"
 #include "librpc/gen_ndr/ndr_netlogon.h"
 #include "auth/auth.h"
 
index 8404a1e790a057c8c9f53318a5d4694f7cf9add1..8e5f8abd3e84ee96c44bcbfee4ba5c9c4432d258 100644 (file)
@@ -89,7 +89,7 @@ static void winbind_recv(struct stream_connection *conn, struct timeval t, uint1
 
        DLIST_ADD_END(wbconn->queue, q, struct send_queue *);
 
-       conn->event.fde->flags |= EVENT_FD_WRITE;
+       EVENT_FD_WRITEABLE(conn->event.fde);
 }
 
 /*
@@ -123,7 +123,7 @@ static void winbind_send(struct stream_connection *conn, struct timeval t, uint1
                }
        }
 
-       conn->event.fde->flags &= ~EVENT_FD_WRITE;
+       EVENT_FD_NOT_WRITEABLE(conn->event.fde);
 }
 
 static const struct stream_server_ops winbind_stream_ops = {