On Wed, Dec 17, 2014 at 9:28 PM, Fedor Indutny <[email protected]> wrote:
>
> Every request, be it write/shutdown/queue_work is allocated by user and
> must be kept alive.
>

Right. So when is it safe to delete the uv_work_t? It would be most
convenient to be able to free() it during the "after" callback in my
queue.c. Is it safe to do that?

If not, how should I manage the pending uv_work_t objects? Should I keep a
list of them somewhere and mark them as "done" in the "after" callback,
then have some other means of cleaning them up later?




>
> Cheers,
> Fedor.
>
> On Thu, Dec 18, 2014 at 9:38 AM, William Ehlhardt <
> [email protected]> wrote:
>>
>> I thought about this some more. Obviously in (2), user code has to be
>> responsible for deletion, since uv_queue_work takes a pointer that could be
>> to a stack-allocated uv_work_t. So the question remains: when is it safe to
>> delete the uv_work_t?
>>
>> On Wednesday, December 17, 2014 8:31:20 PM UTC-6, William Ehlhardt wrote:
>>
>>> Hi folks,
>>>
>>> In the attached file, I delete a uv_work_t after running uv_queue_work,
>>> which causes a use-after-free crash. This is somewhat surprising behavior.
>>>
>>> 1. The documentation does not make it clear that the uv_work_t passed to
>>> uv_queue_work needs to remain alive until (presumably?) the callbacks have
>>> all completed, which leads to:
>>>
>>> 2. Since uv_queue_work spins off another thread to do the work, and
>>> since this may happen in a context where you're spinning many uv_work_t
>>> tasks off to run simultaneously, it's not clear where the uv_work_t should
>>> be deleted. Declaring it on the stack of the caller of uv_run isn't a very
>>> good solution because you can't stack-declare arbitrary numbers of
>>> uv_work_t, which you need to do if you're potentially queuing lots of
>>> background work at once. Allocating it on the heap, meanwhile, brings up
>>> the question of (A) is user code responsible for deleting the uv_work_t, or
>>> is libuv? and (B) if user code is responsible, when is it safe to delete
>>> the work_t? During the "done" callback?
>>>
>>> -William
>>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "libuv" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/libuv.
>> For more options, visit https://groups.google.com/d/optout.
>>
>  --
> You received this message because you are subscribed to a topic in the
> Google Groups "libuv" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/libuv/MBl46Ofe2Is/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/libuv.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"libuv" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/libuv.
For more options, visit https://groups.google.com/d/optout.

Reply via email to