How to know if all pending tevent_req requests have completed?

Stefan Metzmacher metze at
Thu Feb 23 19:30:56 UTC 2017

Am 23.02.2017 um 20:12 schrieb Jeremy Allison:
> On Thu, Feb 23, 2017 at 07:55:22PM +0100, Stefan Metzmacher wrote:
>> Am 23.02.2017 um 18:25 schrieb Jeremy Allison:
>>> On Thu, Feb 23, 2017 at 03:58:36PM +1100, Amitay Isaacs wrote:
>>>> On Thu, Feb 23, 2017 at 11:39 AM, Jeremy Allison <jra at> wrote:
>>>>> On Thu, Feb 23, 2017 at 11:18:41AM +1100, Amitay Isaacs wrote:
>>>>>> Hi tevent experts,
>>>>>> tevent_req_poll() allows to wait for a specific request.
>>>>>> If I want to create n requests and wait for all of them to finish, is
>>>>> there
>>>>>> an easy way to do it?
>>>>>> Here is an example computation:
>>>>>> run_event_send()
>>>>>>    ... run scripts one after the other ...
>>>>>>    if (timer expires) {
>>>>>>       run_debug_send()
>>>>>>       tevent_req_done()
>>>>>>    }
>>>>>> In this case, run_debug_send() computation is *not* hanging off the
>>>>>> run_event_send() request.
>>>>>> The calling code needs to know that run_event computation has timed out,
>>>>>> but doesn't really care whether debugging computation is over or not.
>>>>> The
>>>>>> debug program can run in the background and log useful debug information
>>>>>> without affecting the caller.
>>>>> Can't you use tevent_wakeup_send() to set a timeout on the
>>>>> tevent context, and then check the state of each req you've
>>>>> saved off in a list somewhere by using tevent_req_is_in_progress() ?
>>>> Well, the requests could created any at level, so keeping track of them
>>>> might not be feasible without layering violations.
>>>> I was really hoping that event context keeps track of active requests and I
>>>> can query the event context if the requests list (or queue) is empty or not.
>>> The event context does keep track, but different backends
>>> may do so in different ways - so there's no generic 'are
>>> any events pending' call (well, there's tevent_common_have_events(),
>>> but that's an internal tevent call meant for simple backends
>>> to use, so you can't use that :-).
>>> The layering violation is your real problem here.
>> tevent_common_have_events() is used to break out of
>> tevent_loop_wait(ev);
>> so you may just want to use that and wait for it to return.
> Isn't that an internal API though for use only by
> tevent backend implementors ?
> I thought we wouldn't want to make any external
> callers dependent on such a thing.

tevent_loop_once() and tevent_loop_wait()
are public functions.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <>

More information about the samba-technical mailing list