diff options
-rw-r--r-- | lib/tevent/tevent.c | 40 | ||||
-rw-r--r-- | lib/tevent/tevent.h | 9 | ||||
-rw-r--r-- | lib/tevent/tevent_internal.h | 2 |
3 files changed, 50 insertions, 1 deletions
diff --git a/lib/tevent/tevent.c b/lib/tevent/tevent.c index a6bac6097d7..e9b6b7d0558 100644 --- a/lib/tevent/tevent.c +++ b/lib/tevent/tevent.c @@ -374,6 +374,14 @@ void tevent_loop_allow_nesting(struct tevent_context *ev) ev->nesting.allowed = true; } +void tevent_loop_set_nesting_hook(struct tevent_context *ev, + tevent_nesting_hook hook, + void *private_data) +{ + ev->nesting.hook_fn = hook; + ev->nesting.hook_private = private_data; +} + static void tevent_abort_nesting(struct tevent_context *ev, const char *location) { const char *reason; @@ -393,6 +401,7 @@ static void tevent_abort_nesting(struct tevent_context *ev, const char *location int _tevent_loop_once(struct tevent_context *ev, const char *location) { int ret; + void *nesting_stack_ptr = NULL; ev->nesting.level++; @@ -402,12 +411,41 @@ int _tevent_loop_once(struct tevent_context *ev, const char *location) errno = ELOOP; return -1; } + if (ev->nesting.hook_fn) { + int ret2; + ret2 = ev->nesting.hook_fn(ev, + ev->nesting.hook_private, + ev->nesting.level, + true, + (void *)&nesting_stack_ptr, + location); + if (ret2 != 0) { + ret = ret2; + goto done; + } + } } ret = ev->ops->loop_once(ev, location); - ev->nesting.level--; + if (ev->nesting.level > 1) { + if (ev->nesting.hook_fn) { + int ret2; + ret2 = ev->nesting.hook_fn(ev, + ev->nesting.hook_private, + ev->nesting.level, + false, + (void *)&nesting_stack_ptr, + location); + if (ret2 != 0) { + ret = ret2; + goto done; + } + } + } +done: + ev->nesting.level--; return ret; } diff --git a/lib/tevent/tevent.h b/lib/tevent/tevent.h index 67946279476..bb36f397395 100644 --- a/lib/tevent/tevent.h +++ b/lib/tevent/tevent.h @@ -301,6 +301,12 @@ void tevent_queue_stop(struct tevent_queue *queue); size_t tevent_queue_length(struct tevent_queue *queue); +typedef int (*tevent_nesting_hook)(struct tevent_context *ev, + void *private_data, + uint32_t level, + bool begin, + void *stack_ptr, + const char *location); #ifdef TEVENT_DEPRECATED #ifndef _DEPRECATED_ #if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 ) @@ -310,6 +316,9 @@ size_t tevent_queue_length(struct tevent_queue *queue); #endif #endif void tevent_loop_allow_nesting(struct tevent_context *ev) _DEPRECATED_; +void tevent_loop_set_nesting_hook(struct tevent_context *ev, + tevent_nesting_hook hook, + void *private_data) _DEPRECATED_; #endif #ifdef TEVENT_COMPAT_DEFINES diff --git a/lib/tevent/tevent_internal.h b/lib/tevent/tevent_internal.h index 475d00661a0..f10485398f1 100644 --- a/lib/tevent/tevent_internal.h +++ b/lib/tevent/tevent_internal.h @@ -238,6 +238,8 @@ struct tevent_context { struct { bool allowed; uint32_t level; + tevent_nesting_hook hook_fn; + void *hook_private; } nesting; }; |