mirror of
https://github.com/samba-team/samba.git
synced 2025-02-02 09:47:23 +03:00
s3:messages: improve tevent_create_immediate recycling
We should create the immediate event at the beginning were we have a chance to return an error, rather than ignoring a failure later. As a side effect this also reuses the immediate event after the refcount went to 0 and up again. Pair-Programmed-With: Stefan Metzmacher <metze@samba.org> Signed-off-by: Ralph Boehme <slow@samba.org> Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Volker Lendecke <vl@samba.org> Autobuild-User(master): Stefan Metzmacher <metze@samba.org> Autobuild-Date(master): Tue Apr 24 14:30:20 CEST 2018 on sn-devel-144
This commit is contained in:
parent
dfb712a03c
commit
8e5cc9732b
@ -213,6 +213,13 @@ static bool messaging_register_event_context(struct messaging_context *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (free_reg == NULL) {
|
if (free_reg == NULL) {
|
||||||
|
struct tevent_immediate *im = NULL;
|
||||||
|
|
||||||
|
im = tevent_create_immediate(ctx);
|
||||||
|
if (im == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
tmp = talloc_realloc(ctx, ctx->event_contexts,
|
tmp = talloc_realloc(ctx, ctx->event_contexts,
|
||||||
struct messaging_registered_ev,
|
struct messaging_registered_ev,
|
||||||
num_event_contexts+1);
|
num_event_contexts+1);
|
||||||
@ -222,9 +229,14 @@ static bool messaging_register_event_context(struct messaging_context *ctx,
|
|||||||
ctx->event_contexts = tmp;
|
ctx->event_contexts = tmp;
|
||||||
|
|
||||||
free_reg = &ctx->event_contexts[num_event_contexts];
|
free_reg = &ctx->event_contexts[num_event_contexts];
|
||||||
|
free_reg->im = talloc_move(ctx->event_contexts, &im);
|
||||||
}
|
}
|
||||||
|
|
||||||
*free_reg = (struct messaging_registered_ev) { .ev = ev, .refcount = 1 };
|
/*
|
||||||
|
* free_reg->im might be cached
|
||||||
|
*/
|
||||||
|
free_reg->ev = ev;
|
||||||
|
free_reg->refcount = 1;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -247,6 +259,16 @@ static bool messaging_deregister_event_context(struct messaging_context *ctx,
|
|||||||
reg->refcount -= 1;
|
reg->refcount -= 1;
|
||||||
|
|
||||||
if (reg->refcount == 0) {
|
if (reg->refcount == 0) {
|
||||||
|
/*
|
||||||
|
* The primary event context
|
||||||
|
* is never unregistered using
|
||||||
|
* messaging_deregister_event_context()
|
||||||
|
* it's only registered using
|
||||||
|
* messaging_register_event_context().
|
||||||
|
*/
|
||||||
|
SMB_ASSERT(ev != ctx->event_ctx);
|
||||||
|
SMB_ASSERT(reg->ev != ctx->event_ctx);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Not strictly necessary, just
|
* Not strictly necessary, just
|
||||||
* paranoia
|
* paranoia
|
||||||
@ -256,7 +278,14 @@ static bool messaging_deregister_event_context(struct messaging_context *ctx,
|
|||||||
/*
|
/*
|
||||||
* Do not talloc_free(reg->im),
|
* Do not talloc_free(reg->im),
|
||||||
* recycle immediates events.
|
* recycle immediates events.
|
||||||
|
*
|
||||||
|
* We just invalidate it using
|
||||||
|
* the primary event context,
|
||||||
|
* which is never unregistered.
|
||||||
*/
|
*/
|
||||||
|
tevent_schedule_immediate(reg->im,
|
||||||
|
ctx->event_ctx,
|
||||||
|
NULL, NULL);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -329,15 +358,6 @@ static bool messaging_alert_event_contexts(struct messaging_context *ctx)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reg->im == NULL) {
|
|
||||||
reg->im = tevent_create_immediate(
|
|
||||||
ctx->event_contexts);
|
|
||||||
}
|
|
||||||
if (reg->im == NULL) {
|
|
||||||
DBG_WARNING("Could not create immediate\n");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We depend on schedule_immediate to work
|
* We depend on schedule_immediate to work
|
||||||
* multiple times. Might be a bit inefficient,
|
* multiple times. Might be a bit inefficient,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user