1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-28 01:58:17 +03:00

tevent: add tevent_loop_set_nesting_hook()

This is an ugly hack to let the s4 server work arround
some bugs related to nested events and uid changing.

metze
This commit is contained in:
Stefan Metzmacher 2009-03-12 10:23:30 +01:00
parent a3d5d8378c
commit 7142ef49bd
3 changed files with 50 additions and 1 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -238,6 +238,8 @@ struct tevent_context {
struct {
bool allowed;
uint32_t level;
tevent_nesting_hook hook_fn;
void *hook_private;
} nesting;
};