summaryrefslogtreecommitdiff
path: root/evrpc.c
diff options
context:
space:
mode:
authorShuo Chen <giantchen@gmail.com>2010-04-14 14:27:29 -0400
committerNick Mathewson <nickm@torproject.org>2010-04-14 14:27:29 -0400
commit755fbf16c3ce94bfa09e1bf5da27ccdfc1e7e725 (patch)
tree7818e3b475a31ac3d6677051a73af7632cd735d2 /evrpc.c
parent07edf784fab4e25c31eef3fdcccec3975e2741db (diff)
downloadlibevent-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.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/evrpc.c b/evrpc.c
index b5e4ca8c..ba72e24d 100644
--- a/evrpc.c
+++ b/evrpc.c
@@ -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,