summaryrefslogtreecommitdiff
path: root/source4/lib/messaging
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-06-05 07:30:44 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:17:38 -0500
commitd934cb71d0bd2d6ad7a2908cc3c3802cb37e922c (patch)
tree36a447ccc0070eec4bf8a0b61271e6d2fba03a1a /source4/lib/messaging
parentbf1ffa283caef6a3c98b5cc7f5bc8205c2818b06 (diff)
downloadsamba-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/messaging')
-rw-r--r--source4/lib/messaging/irpc.h5
-rw-r--r--source4/lib/messaging/messaging.c21
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;
}