1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

tevent: don't allow nested tevent_loop_once() anymore

Incompatible caller should use tevent_loop_allow_nesting()
function.

metze
This commit is contained in:
Stefan Metzmacher 2009-03-12 09:51:33 +01:00
parent bd0f14c1d7
commit 06f88fe7a2
3 changed files with 53 additions and 1 deletions

View File

@ -59,6 +59,7 @@
*/ */
#include "replace.h" #include "replace.h"
#include "system/filesys.h" #include "system/filesys.h"
#define TEVENT_DEPRECATED 1
#include "tevent.h" #include "tevent.h"
#include "tevent_internal.h" #include "tevent_internal.h"
#include "tevent_util.h" #include "tevent_util.h"
@ -368,12 +369,46 @@ struct tevent_signal *_tevent_add_signal(struct tevent_context *ev,
handler_name, location); 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 do a single event loop using the events defined in ev
*/ */
int _tevent_loop_once(struct tevent_context *ev, const char *location) 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;
} }
/* /*

View File

@ -301,6 +301,17 @@ void tevent_queue_stop(struct tevent_queue *queue);
size_t tevent_queue_length(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 #ifdef TEVENT_COMPAT_DEFINES
#define event_context tevent_context #define event_context tevent_context

View File

@ -233,6 +233,12 @@ struct tevent_context {
/* debugging operations */ /* debugging operations */
struct tevent_debug_ops debug_ops; struct tevent_debug_ops debug_ops;
/* info about the nesting status */
struct {
bool allowed;
uint32_t level;
} nesting;
}; };