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:
parent
bd0f14c1d7
commit
06f88fe7a2
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user