From 06f88fe7a2f9ce93f8cdbec0910cc8471c12b1c3 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 12 Mar 2009 09:51:33 +0100 Subject: [PATCH] tevent: don't allow nested tevent_loop_once() anymore Incompatible caller should use tevent_loop_allow_nesting() function. metze --- lib/tevent/tevent.c | 37 +++++++++++++++++++++++++++++++++++- lib/tevent/tevent.h | 11 +++++++++++ lib/tevent/tevent_internal.h | 6 ++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/lib/tevent/tevent.c b/lib/tevent/tevent.c index d7db303d8790..a6bac6097d72 100644 --- a/lib/tevent/tevent.c +++ b/lib/tevent/tevent.c @@ -59,6 +59,7 @@ */ #include "replace.h" #include "system/filesys.h" +#define TEVENT_DEPRECATED 1 #include "tevent.h" #include "tevent_internal.h" #include "tevent_util.h" @@ -368,12 +369,46 @@ struct tevent_signal *_tevent_add_signal(struct tevent_context *ev, handler_name, location); } +void tevent_loop_allow_nesting(struct tevent_context *ev) +{ + ev->nesting.allowed = true; +} + +static void tevent_abort_nesting(struct tevent_context *ev, const char *location) +{ + const char *reason; + + reason = talloc_asprintf(NULL, "tevent_loop_once() nesting at %s", + location); + if (!reason) { + reason = "tevent_loop_once() nesting"; + } + + tevent_abort(ev, reason); +} + /* do a single event loop using the events defined in ev */ int _tevent_loop_once(struct tevent_context *ev, const char *location) { - return ev->ops->loop_once(ev, location); + int ret; + + ev->nesting.level++; + + if (ev->nesting.level > 1) { + if (!ev->nesting.allowed) { + tevent_abort_nesting(ev, location); + errno = ELOOP; + return -1; + } + } + + ret = ev->ops->loop_once(ev, location); + + ev->nesting.level--; + + return ret; } /* diff --git a/lib/tevent/tevent.h b/lib/tevent/tevent.h index 1870f695b570..67946279476d 100644 --- a/lib/tevent/tevent.h +++ b/lib/tevent/tevent.h @@ -301,6 +301,17 @@ void tevent_queue_stop(struct tevent_queue *queue); size_t tevent_queue_length(struct tevent_queue *queue); +#ifdef TEVENT_DEPRECATED +#ifndef _DEPRECATED_ +#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 ) +#define _DEPRECATED_ __attribute__ ((deprecated)) +#else +#define _DEPRECATED_ +#endif +#endif +void tevent_loop_allow_nesting(struct tevent_context *ev) _DEPRECATED_; +#endif + #ifdef TEVENT_COMPAT_DEFINES #define event_context tevent_context diff --git a/lib/tevent/tevent_internal.h b/lib/tevent/tevent_internal.h index 151a34fc425f..475d00661a0c 100644 --- a/lib/tevent/tevent_internal.h +++ b/lib/tevent/tevent_internal.h @@ -233,6 +233,12 @@ struct tevent_context { /* debugging operations */ struct tevent_debug_ops debug_ops; + + /* info about the nesting status */ + struct { + bool allowed; + uint32_t level; + } nesting; }; -- 2.34.1