diff options
author | Stefan Metzmacher <metze@samba.org> | 2009-03-12 09:51:33 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-03-12 12:14:18 +0100 |
commit | 06f88fe7a2f9ce93f8cdbec0910cc8471c12b1c3 (patch) | |
tree | 7633f8ab8db558ee6f1b449e6e5f58db27397e54 | |
parent | bd0f14c1d782b6afe9455e61819caeb2d480af1e (diff) | |
download | samba-06f88fe7a2f9ce93f8cdbec0910cc8471c12b1c3.tar.gz samba-06f88fe7a2f9ce93f8cdbec0910cc8471c12b1c3.tar.bz2 samba-06f88fe7a2f9ce93f8cdbec0910cc8471c12b1c3.zip |
tevent: don't allow nested tevent_loop_once() anymore
Incompatible caller should use tevent_loop_allow_nesting()
function.
metze
-rw-r--r-- | lib/tevent/tevent.c | 37 | ||||
-rw-r--r-- | lib/tevent/tevent.h | 11 | ||||
-rw-r--r-- | lib/tevent/tevent_internal.h | 6 |
3 files changed, 53 insertions, 1 deletions
diff --git a/lib/tevent/tevent.c b/lib/tevent/tevent.c index d7db303d87..a6bac6097d 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 1870f695b5..6794627947 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 151a34fc42..475d00661a 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; }; |