How to know if all pending tevent_req requests have completed?

Stefan Metzmacher metze at samba.org
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 samba.org> 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.

metze

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20170223/1da1807b/signature.sig>


More information about the samba-technical mailing list