diff options
author | Shuo Chen <giantchen@gmail.com> | 2010-04-14 14:27:29 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-04-14 14:27:29 -0400 |
commit | 755fbf16c3ce94bfa09e1bf5da27ccdfc1e7e725 (patch) | |
tree | 7818e3b475a31ac3d6677051a73af7632cd735d2 /evrpc.c | |
parent | 07edf784fab4e25c31eef3fdcccec3975e2741db (diff) | |
download | libevent-755fbf16c3ce94bfa09e1bf5da27ccdfc1e7e725.tar.gz |
Add void* arguments to request_new and reply_new evrpc hooks
This makes evprc setup more extensible, and helps with Shuo Chen's
work on implementing Google protocol buffers rpc on top of Libevent 2
evrpc.
This patch breaks binary compatibility with previous versions of
Libevent, since it changes struct evrpc and the signature of
evrpc_register_generic(). Since all compliant code should be calling
evrpc_register_generic via EVRPC_REGISTER, it shouldn't break source
compatibility.
(Code by Shuo Chen; commit message by Nick)
Diffstat (limited to 'evrpc.c')
-rw-r--r-- | evrpc.c | 18 |
1 files changed, 10 insertions, 8 deletions
@@ -339,7 +339,7 @@ evrpc_request_cb_closure(void *arg, enum EVRPC_HOOK_RESULT hook_res) goto error; /* let's check that we can parse the request */ - rpc_state->request = rpc->request_new(); + rpc_state->request = rpc->request_new(rpc->request_new_arg); if (rpc_state->request == NULL) goto error; @@ -351,7 +351,7 @@ evrpc_request_cb_closure(void *arg, enum EVRPC_HOOK_RESULT hook_res) /* at this point, we have a well formed request, prepare the reply */ - rpc_state->reply = rpc->reply_new(); + rpc_state->reply = rpc->reply_new(rpc->reply_new_arg); if (rpc_state->reply == NULL) goto error; @@ -1081,9 +1081,9 @@ error: /** Takes a request object and fills it in with the right magic */ static struct evrpc * evrpc_register_object(const char *name, - void *(*req_new)(void), void (*req_free)(void *), + void *(*req_new)(void*), void *req_new_arg, void (*req_free)(void *), int (*req_unmarshal)(void *, struct evbuffer *), - void *(*rpl_new)(void), void (*rpl_free)(void *), + void *(*rpl_new)(void*), void *rpl_new_arg, void (*rpl_free)(void *), int (*rpl_complete)(void *), void (*rpl_marshal)(struct evbuffer *, void *)) { @@ -1096,9 +1096,11 @@ evrpc_register_object(const char *name, return (NULL); } rpc->request_new = req_new; + rpc->request_new_arg = req_new_arg; rpc->request_free = req_free; rpc->request_unmarshal = req_unmarshal; rpc->reply_new = rpl_new; + rpc->reply_new_arg = rpl_new_arg; rpc->reply_free = rpl_free; rpc->reply_complete = rpl_complete; rpc->reply_marshal = rpl_marshal; @@ -1108,15 +1110,15 @@ evrpc_register_object(const char *name, int evrpc_register_generic(struct evrpc_base *base, const char *name, void (*callback)(struct evrpc_req_generic *, void *), void *cbarg, - void *(*req_new)(void), void (*req_free)(void *), + void *(*req_new)(void *), void *req_new_arg, void (*req_free)(void *), int (*req_unmarshal)(void *, struct evbuffer *), - void *(*rpl_new)(void), void (*rpl_free)(void *), + void *(*rpl_new)(void *), void *rpl_new_arg, void (*rpl_free)(void *), int (*rpl_complete)(void *), void (*rpl_marshal)(struct evbuffer *, void *)) { struct evrpc* rpc = - evrpc_register_object(name, req_new, req_free, req_unmarshal, - rpl_new, rpl_free, rpl_complete, rpl_marshal); + evrpc_register_object(name, req_new, req_new_arg, req_free, req_unmarshal, + rpl_new, rpl_new_arg, rpl_free, rpl_complete, rpl_marshal); if (rpc == NULL) return (-1); evrpc_register_rpc(base, rpc, |