[erlang-questions] Port Driver. erl_drv_thread_join and ErlDrvTid reuse.
Rickard Green
rickard@REDACTED
Wed Oct 10 21:12:33 CEST 2012
>>From time to time erl_drv_thread_join returns error EDEADLK=35, i.e. the current thread (scheduler thread) tries to join itself.
>
> According to the documentation “A Thread identifier may be reused very quickly after a thread has terminated. Therefore, if a thread corresponding to one of the involved thread identifiers has terminated since the thread identifier was saved, the result of erl_drv_equal_tids() might not give the expected result.”
>
> I suppose that thread terminates earlier then erl_drv_thread_join call happens, so ErlDrvTid is already reused.
>
This reuse will not cause problems for erl_drv_thread_join() as long as
it is used correctly (a tid wont be reused until after the thread has
been joined). erl_drv_thread_join() will also refuse to join threads not
created by erl_drv_thread_create(), and would in case the scheduler
thread tried to join itself fail with EINVAL.
> So the question is how to use erl_drv_thread_join properly and how to guarantee that the saved ErlDrvTid value points to the same data that was returned from erl_drv_thread_create?
>
It is important that the thread is joined once and *only* once. Are you
sure that you don't do two calls to erl_drv_thread_join() for the same
thread?
Regards,
Rickard
--
Rickard Green, Erlang/OTP, Ericsson AB.
More information about the erlang-questions
mailing list