]> granicus.if.org Git - libevent/commitdiff
r15317@tombo: nickm | 2008-04-24 21:17:49 -0400
authorNick Mathewson <nickm@torproject.org>
Fri, 25 Apr 2008 01:18:18 +0000 (01:18 +0000)
committerNick Mathewson <nickm@torproject.org>
Fri, 25 Apr 2008 01:18:18 +0000 (01:18 +0000)
 Add new functions to be more threadsafe (and structure-ignorant) than event_set.

svn:r726

ChangeLog
event.c
include/event2/event.h

index 32b3bd4e733475113cb3d3f67f661e3710ef9a8c..8659e1003d0aca060501b2f98513b6cf0e7a49b3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -69,6 +69,7 @@ Changes in current version:
  o Add new thread-safe interfaces to evdns functions.
  o Make all event_tagging interfaces threadsafe.
  o Rename internal memory management functions.
+ o New functions (event_assign, event_new, event_free) for use by apps that want to be safely threadsafe, or want to remain ignorant of the contents of struct event.
 
 Changes in 1.4.0:
  o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr.
diff --git a/event.c b/event.c
index 7d4b882ceb464bfaaf157b73fb0f7fad5057bc1b..3e36f73657ee4f5b879127513777180da50ce8ab 100644 (file)
--- a/event.c
+++ b/event.c
@@ -664,6 +664,36 @@ event_base_set(struct event_base *base, struct event *ev)
        return (0);
 }
 
+int
+event_assign(struct event *ev, struct event_base *base, evutil_socket_t fd, short events, void (*cb)(evutil_socket_t, short, void *), void *arg)
+{
+       event_set(ev, fd, events, cb, arg);
+       return event_base_set(base, ev);
+}
+
+struct event *
+event_new(struct event_base *base, evutil_socket_t fd, short events, void (*cb)(evutil_socket_t, short, void *), void *arg)
+{
+       struct event *ev;
+       ev = mm_malloc(sizeof(struct event));
+       if (!ev)
+               return NULL;
+       if (event_assign(ev, base, fd, events, cb, arg) < 0) {
+               mm_free(ev);
+               return NULL;
+       }
+       return ev;
+}
+
+void
+event_free(struct event *ev)
+{
+       /* make sure that this event won't be coming back to haunt us.
+        * XXX this is safe, right? */
+       event_del(ev);
+       mm_free(ev);
+}
+
 /*
  * Set's the priority of an event - if an event is already scheduled
  * changing the priority is going to fail.
index 2644cd4b57c2d330d38b5233e1a73affafbcb618..d66295cfb4bac1279c2a72716d6df1988aebbec4 100644 (file)
@@ -285,6 +285,13 @@ int event_base_loopbreak(struct event_base *);
  */
 void event_set(struct event *, evutil_socket_t, short, void (*)(evutil_socket_t, short, void *), void *);
 
+/*XXX document this function, deprecate previous one. */
+int event_assign(struct event *, struct event_base *, evutil_socket_t, short, void (*)(evutil_socket_t, short, void *), void *);
+
+struct event *event_new(struct event_base *, evutil_socket_t, short, void (*)(evutil_socket_t, short, void *), void *);
+
+void event_free(struct event *);
+
 /**
   Schedule a one-time event (threadsafe variant)