mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
messaging: Deliver messages only once
This survived an autobuild, so no subsystem strictly needs this anymore. In particular the notify subsystem has been rewritten. Why this patch? It removes some complexity from core code, and it reduces the potential memory overconsumption: Right now I'm working on a g_lock_ping_pong test. This test does a lot of messaging_filtered_read_send calls in a tight loop on a nested event context. With the current code we let the messaging_filtered_read code consume the message that arrives, but it also posts it for consumption by the main event context attached to the messaging context with its "classic" callback. This test never comes back to the main event context, so it accumulates more and more self-posted messages. That's just unnecessary, given that due to the successful autobuild nothing but the read1 test makes use of the "multicasting" of messages. Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Wed Jun 21 07:30:39 CEST 2017 on sn-devel-144
This commit is contained in:
parent
46a1ae5d71
commit
a2436b67e5
@ -1015,7 +1015,7 @@ static bool messaging_append_new_waiters(struct messaging_context *msg_ctx)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void messaging_dispatch_classic(struct messaging_context *msg_ctx,
|
||||
static bool messaging_dispatch_classic(struct messaging_context *msg_ctx,
|
||||
struct messaging_rec *rec)
|
||||
{
|
||||
struct messaging_callback *cb, *next;
|
||||
@ -1041,13 +1041,10 @@ static void messaging_dispatch_classic(struct messaging_context *msg_ctx,
|
||||
cb->fn(msg_ctx, cb->private_data, rec->msg_type,
|
||||
rec->src, &rec->buf);
|
||||
|
||||
/*
|
||||
* we continue looking for matching messages after finding
|
||||
* one. This matters for subsystems like the internal notify
|
||||
* code which register more than one handler for the same
|
||||
* message type
|
||||
*/
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1058,9 +1055,13 @@ static void messaging_dispatch_rec(struct messaging_context *msg_ctx,
|
||||
struct messaging_rec *rec)
|
||||
{
|
||||
size_t i;
|
||||
bool consumed;
|
||||
|
||||
if (ev == msg_ctx->event_ctx) {
|
||||
messaging_dispatch_classic(msg_ctx, rec);
|
||||
consumed = messaging_dispatch_classic(msg_ctx, rec);
|
||||
if (consumed) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!messaging_append_new_waiters(msg_ctx)) {
|
||||
@ -1102,12 +1103,7 @@ static void messaging_dispatch_rec(struct messaging_context *msg_ctx,
|
||||
if ((ev == state->ev) &&
|
||||
state->filter(rec, state->private_data)) {
|
||||
messaging_filtered_read_done(req, rec);
|
||||
|
||||
/*
|
||||
* Only the first one gets the fd-array
|
||||
*/
|
||||
rec->num_fds = 0;
|
||||
rec->fds = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
i += 1;
|
||||
|
@ -122,7 +122,7 @@ bool run_messaging_read1(int dummy)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for (i=0; i<3; i++) {
|
||||
for (i=0; i<2; i++) {
|
||||
if (tevent_loop_once(ev) != 0) {
|
||||
fprintf(stderr, "tevent_loop_once failed\n");
|
||||
goto fail;
|
||||
@ -131,8 +131,8 @@ bool run_messaging_read1(int dummy)
|
||||
|
||||
printf("%u/%u\n", count1, count2);
|
||||
|
||||
if ((count1 != 1) || (count2 != 1)){
|
||||
fprintf(stderr, "Got %u/%u msgs, expected 1 each\n",
|
||||
if ((count1 != 1) || (count2 != 0)) {
|
||||
fprintf(stderr, "Got %u/%u msgs, expected 1/0\n",
|
||||
count1, count2);
|
||||
goto fail;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user