From: Zhemzhitsky Sergey <sergey_zhemzhit...@sberbank-cib.ru>
Date: Thu, 11 Oct 2012 12:21:12 +0000
Local: Thurs, Oct 11 2012 8:21 am
Subject: Re: [erlang-questions] Port Driver. erl_drv_thread_join and ErlDrvTid reuse.
Thanks a lot for clarification.
I'm doing erl_drv_thread_join() only once and only for threads created by erl_drv_thread_create().
The error only happens from time to time in the following scenario:
1. Erlang process, I send messages from the ddriver to, dies for some reason
Here two things happen:
6.1 (*stop)(ErlDrvData drv_data) executes as linked process has been killed by driver_failure_atom
When (*stop)(ErlDrvData drv_data) executes erl_drv_thread_join is called for all the threads started in the driver.
So something wrong happens that leads to tid reuse.
From: Rickard Green [mailto:rick...@erlang.org]
Sent: Wednesday, October 10, 2012 11:13 PM
To: Zhemzhitsky Sergey
Cc: Erlang Questions
>>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?
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.