]> granicus.if.org Git - libevent/commitdiff
support freeing of evrpc base
authorNiels Provos <provos@gmail.com>
Wed, 23 May 2007 05:31:33 +0000 (05:31 +0000)
committerNiels Provos <provos@gmail.com>
Wed, 23 May 2007 05:31:33 +0000 (05:31 +0000)
svn:r356

evrpc.c
evrpc.h
test/regress.c
test/regress_rpc.c

diff --git a/evrpc.c b/evrpc.c
index 0d3e014dad5d3c57a296d8f796297859ab427b30..e221150bc593f30b41a4fca3c4c51fae17680807 100644 (file)
--- a/evrpc.c
+++ b/evrpc.c
@@ -82,7 +82,13 @@ evrpc_init(struct evhttp *http_server)
 void
 evrpc_free(struct evrpc_base *base)
 {
+       struct evrpc *rpc;
+       
+       while ((rpc = TAILQ_FIRST(&base->registered_rpcs)) != NULL) {
+               assert(evrpc_unregister_rpc(base, rpc->uri));
+       }
 
+       free(base);
 }
 
 static void evrpc_pool_schedule(struct evrpc_pool *pool);
diff --git a/evrpc.h b/evrpc.h
index 5ec5ff84c57057745d741d071aeec59192d29cb7..2cb9745705910d1e7d9557e9649ca274b21bf61e 100644 (file)
--- a/evrpc.h
+++ b/evrpc.h
@@ -211,6 +211,9 @@ struct evhttp;
 /* functions to start up the rpc system */
 struct evrpc_base *evrpc_init(struct evhttp *server);
 
+/* frees the base - for now, you are responsible for making sure that no rpcs are ongoing */
+void evrpc_free(struct evrpc_base *);
+
 /* this macro is used to register RPCs with the HTTP Server */
 #define EVRPC_REGISTER(base, name, request, reply, callback, cbarg) \
   do { \
index dbf0fe02e7ba60c44901d957102bfebed5df0b8b..455604d57b4f889fd6e959e9a871ad03675fc62e 100644 (file)
@@ -1079,16 +1079,16 @@ main (int argc, char **argv)
 
        test_want_only_once();
 
+       evtag_test();
+
+       rpc_test();
+
 #ifndef WIN32
        test_signal_dealloc();
        test_signal_pipeloss();
        test_signal_switchbase();
 #endif
        
-       evtag_test();
-
-       rpc_test();
-
        return (0);
 }
 
index 7a346ac4c9f971c67f4123e7d361c5e858c1d7cc..b90f865478bb5800af600abff647722713cb6f2a 100644 (file)
@@ -133,6 +133,8 @@ rpc_teardown(struct evrpc_base *base)
 {
        assert(EVRPC_UNREGISTER(base, Message) == 0);
        assert(EVRPC_UNREGISTER(base, NeverReply) == 0);
+
+       evrpc_free(base);
 }
 
 static void