diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-06-05 07:30:44 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:17:38 -0500 |
commit | d934cb71d0bd2d6ad7a2908cc3c3802cb37e922c (patch) | |
tree | 36a447ccc0070eec4bf8a0b61271e6d2fba03a1a /source4/lib | |
parent | bf1ffa283caef6a3c98b5cc7f5bc8205c2818b06 (diff) | |
download | samba-d934cb71d0bd2d6ad7a2908cc3c3802cb37e922c.tar.gz samba-d934cb71d0bd2d6ad7a2908cc3c3802cb37e922c.tar.bz2 samba-d934cb71d0bd2d6ad7a2908cc3c3802cb37e922c.zip |
r7295: added an irpc benchmark. It gets about 16k messages/sec on my laptop,
compared to about 20k messages/sec for the raw messaging layer. I
think that is quite acceptable given the extra functionality.
(This used to be commit a05d38d1d91f1f54d3e3794a596b468992594852)
Diffstat (limited to 'source4/lib')
-rw-r--r-- | source4/lib/messaging/irpc.h | 5 | ||||
-rw-r--r-- | source4/lib/messaging/messaging.c | 21 |
2 files changed, 18 insertions, 8 deletions
diff --git a/source4/lib/messaging/irpc.h b/source4/lib/messaging/irpc.h index a483c78c70..93cadddd34 100644 --- a/source4/lib/messaging/irpc.h +++ b/source4/lib/messaging/irpc.h @@ -28,7 +28,7 @@ struct irpc_message { }; /* don't allow calls to take too long */ -#define IRPC_CALL_TIMEOUT 10 +#define IRPC_CALL_TIMEOUT 20 /* the server function type */ @@ -44,6 +44,9 @@ typedef NTSTATUS (*irpc_function_t)(struct irpc_message *, void *r); #define IRPC_CALL(msg_ctx, server_id, pipename, funcname, ptr) \ irpc_call(msg_ctx, server_id, &dcerpc_table_ ## pipename, DCERPC_ ## funcname, ptr) +#define IRPC_CALL_SEND(msg_ctx, server_id, pipename, funcname, ptr) \ + irpc_call_send(msg_ctx, server_id, &dcerpc_table_ ## pipename, DCERPC_ ## funcname, ptr) + /* a pending irpc call diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c index b605fa0494..be89c97e5b 100644 --- a/source4/lib/messaging/messaging.c +++ b/source4/lib/messaging/messaging.c @@ -315,7 +315,7 @@ NTSTATUS messaging_send(struct messaging_context *msg, uint32_t server, if (msg->pending == NULL) { EVENT_FD_WRITEABLE(msg->event.fde); } - DLIST_ADD(msg->pending, rec); + DLIST_ADD_END(msg->pending, rec, struct messaging_rec *); return NT_STATUS_OK; } @@ -426,20 +426,27 @@ struct irpc_list { */ NTSTATUS irpc_register(struct messaging_context *msg_ctx, const struct dcerpc_interface_table *table, - int call, irpc_function_t fn) + int callnum, irpc_function_t fn) { struct irpc_list *irpc; - irpc = talloc(msg_ctx, struct irpc_list); - NT_STATUS_HAVE_NO_MEMORY(irpc); + /* override an existing handler, if any */ + for (irpc=msg_ctx->irpc; irpc; irpc=irpc->next) { + if (irpc->table == table && irpc->callnum == callnum) { + break; + } + } + if (irpc == NULL) { + irpc = talloc(msg_ctx, struct irpc_list); + NT_STATUS_HAVE_NO_MEMORY(irpc); + DLIST_ADD(msg_ctx->irpc, irpc); + } irpc->table = table; - irpc->callnum = call; + irpc->callnum = callnum; irpc->fn = fn; GUID_from_string(irpc->table->uuid, &irpc->uuid); - DLIST_ADD(msg_ctx->irpc, irpc); - return NT_STATUS_OK; } |