Bug and patch - Heavy device io can hang

Sergey Nazarkin snazarkin at azul.com
Thu May 31 14:06:47 UTC 2018


Craig, 

The patch looks OK (at least for the moment, the whole signal/wait subsystem requires refactoring).  Have you signed Oracle Contributed Agreement (http://openjdk.java.net/contribute/)?


Sergey Nazarkin




> On 25 May 2018, at 18:32, Sergey Nazarkin <snazarkin at azul.com> wrote:
> 
> Hi, Craig!
> 
> Thanks for the fix. I’ll take a look on Monday
> 
> 
> Sergey Nazarkin
> 
> 
> 
> 
>> On 25 May 2018, at 07:57, Craig White <cwhite102 at gmail.com> wrote:
>> 
>> I'm not sure if this library is being maintained or not, but I found it was
>> quite useful to get some boards going with a pi!
>> 
>> 
>> 
>> I ran into a hang situation with heavy writes to an I2C device, and traced
>> the issue to improper mutex/condition code in dio_common.cpp.
>> 
>> It was very reproducible and evident that the waitForCondition method could
>> miss the signal from generateSignal() and just get stuck there waiting.
>> 
>> 
>> 
>> Craig
>> 
>> 
>> 
>> Here's a patch to fix the issue:
>> 
>> 
>> 
>> 
>> 
>> @@ -279,4 +279,10 @@
>> 
>>        if (sig != NULL) {
>> 
>>            javautil_list_add(signals, sig);
>> 
>> +            // Need to lock the mutex associated with the condition
>> 
>> +            // otherwise we could miss the signal
>> 
>> +            // This is done while holding the 'master' signalMutex
>> 
>> +
>> javacall_os_mutex_lock(javacall_os_cond_get_mutex(sig->condition));
>> 
>> +
>> 
>> +            // Now release the master lock
>> 
>>            javacall_os_mutex_unlock(signalMutex);
>> 
>> @@ -282,2 +288,4 @@
>> 
>>            javacall_os_mutex_unlock(signalMutex);
>> 
>> +
>> 
>> +            // Wait on the condition (releases the condition mutex while
>> waiting)
>> 
>>            javacall_os_cond_wait(sig->condition, timeout);
>> 
>> @@ -283,4 +291,9 @@
>> 
>>            javacall_os_cond_wait(sig->condition, timeout);
>> 
>> +            // Technically, this should be in a loop for spurious wakes,
>> but
>> 
>> +            // I'm not familiar enough with the code for what the loop
>> would check
>> 
>> +
>> 
>> +            // Unlock the condition mutex
>> 
>> +
>> javacall_os_mutex_unlock(javacall_os_cond_get_mutex(sig->condition));
>> 
>>        }
>> 
>>    } else {
>> 
>>        javacall_os_mutex_unlock(signalMutex);
>> 
>> @@ -313,4 +326,9 @@
>> 
>>    signal* sig = findTarget(signalType, signalTarget);
>> 
>>    if (sig != NULL) {
>> 
>>        sig->parameter = signalParameter;
>> 
>> +        
>> 
>> +        // Need to lock the mutex associated with the condition
>> 
>> +        // or waitForSignal could miss the signal
>> 
>> +        javacall_os_mutex_lock( javacall_os_cond_get_mutex(sig->condition)
>> );
>> 
>> +
>> 
>>        javacall_os_cond_signal(sig->condition);
>> 
>> @@ -316,4 +334,6 @@
>> 
>>        javacall_os_cond_signal(sig->condition);
>> 
>> +        
>> 
>> +        javacall_os_mutex_unlock(
>> javacall_os_cond_get_mutex(sig->condition) );
>> 
>>    } else {
>> 
>>        // signal is being sent before wait started
>> 
>>        // create the signal and add it to the list
>> 
>> 
> 



More information about the dio-dev mailing list