You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Ilya Leviev (JIRA)" <ji...@apache.org> on 2007/05/18 17:09:16 UTC

[jira] Created: (HARMONY-3913) [drlvm][thread] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135

[drlvm][thread] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135
-----------------------------------------------------------------------------------------------------

                 Key: HARMONY-3913
                 URL: https://issues.apache.org/jira/browse/HARMONY-3913
             Project: Harmony
          Issue Type: Bug
          Components: DRLVM
         Environment: win2003
            Reporter: Ilya Leviev
         Attachments: SourceViewScreenshot-1.jpg

TC report on thread unsafe access that result in race condition that occur during concurrent execution of set_fat_lock_id and unreserve_lock functions.


Write -> Read data-race
Memory read at "thread_native_thin_monitor.c":135 conflicts with a prior memory write at "thread_native_thin_monitor.c":78


Stack Trace: 


Context
	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
	Function ExecuteMethod "em_intf.cpp":43
	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
	Function jthread_monitor_enter "thread_java_monitors.c":88
	Function unreserve_lock "thread_native_thin_monitor.c":134

1st Access
	Function vm_get_gc_thread_local "c_interface.cpp":2334
	Function m2n_free_local_handles "m2n_ia32.cpp":268
	Function hythread_self "hythread.h":465
	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
	Function hythread_suspend_enable "hythread_ext.h":370
	Function Java_java_lang_VMThreadManager_wait "java_lang_vmthreadmanager.cpp":202
	Function jthread_monitor_timed_wait "thread_java_monitors.c":308
	Function inflate_lock "thread_native_thin_monitor.c":600
	Function set_fat_lock_id "thread_native_thin_monitor.c":78


"76"	""	"     lockword&=0x7FF;"
"77"	""	"     lockword|=(monitor_id << 11) | 0x80000000;"
"78"	"*"	"     *lockword_ptr=lockword;"
"79"	""	"     apr_memory_rw_barrier();"
"80"	""	" }"


2nd Access
	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
	Function ExecuteMethod "em_intf.cpp":43
	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
	Function jthread_monitor_enter "thread_java_monitors.c":88
	Function unreserve_lock "thread_native_thin_monitor.c":135


"134"	""	" IDATA unreserve_lock(hythread_thin_monitor_t *lockword_ptr) {"
"135"	"*"	"     I_32 lockword = *lockword_ptr;"
"136"	""	"     I_32 lockword_new;"
"137"	""	"     uint16 lock_id;"



See also Source View screenshot.



Notes on Write->Read race condition.
------------------------------------
Write->Read data races occur when one thread writes a shared memory location (address) while another thread concurrently reads the same memory location.  
The shared memory location may be referred to by (variable) name, pointer, or even a function such as memcpy().  

The following example uses a variable name:

1st access by first thread

S1: sharedX = privateA

2nd access by second thread

S2: privateB = sharedX

If sharedX is a variable visible to all threads and privateA and privateB are local variables visible only to the thread where each was declared,
 concurrent execution of the above statements by multiple threads results in a "race" on the value to be read from sharedX.   

Since the order of execution among threads is unpredictable, it is unknown which value will be available in sharedX to be stored into privateB.  
This results in non-deterministic software, or software prone to produce different results each time it is executed. 
_______________________________________________________________________________________________________________________





If it not affect correctness of execution I will mark it by special API for prevention of further alarms on this race.




-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (HARMONY-3913) [drlvm][thread] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135

Posted by "Ilya Leviev (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/HARMONY-3913?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ilya Leviev updated HARMONY-3913:
---------------------------------

    Attachment: SourceViewScreenshot-1.jpg

Source View screenshot added 

> [drlvm][thread] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135
> -----------------------------------------------------------------------------------------------------
>
>                 Key: HARMONY-3913
>                 URL: https://issues.apache.org/jira/browse/HARMONY-3913
>             Project: Harmony
>          Issue Type: Bug
>          Components: DRLVM
>         Environment: win2003
>            Reporter: Ilya Leviev
>         Attachments: SourceViewScreenshot-1.jpg
>
>
> TC report on thread unsafe access that result in race condition that occur during concurrent execution of set_fat_lock_id and unreserve_lock functions.
> Write -> Read data-race
> Memory read at "thread_native_thin_monitor.c":135 conflicts with a prior memory write at "thread_native_thin_monitor.c":78
> Stack Trace: 
> Context
> 	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
> 	Function ExecuteMethod "em_intf.cpp":43
> 	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
> 	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
> 	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function jthread_monitor_enter "thread_java_monitors.c":88
> 	Function unreserve_lock "thread_native_thin_monitor.c":134
> 1st Access
> 	Function vm_get_gc_thread_local "c_interface.cpp":2334
> 	Function m2n_free_local_handles "m2n_ia32.cpp":268
> 	Function hythread_self "hythread.h":465
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function hythread_suspend_enable "hythread_ext.h":370
> 	Function Java_java_lang_VMThreadManager_wait "java_lang_vmthreadmanager.cpp":202
> 	Function jthread_monitor_timed_wait "thread_java_monitors.c":308
> 	Function inflate_lock "thread_native_thin_monitor.c":600
> 	Function set_fat_lock_id "thread_native_thin_monitor.c":78
> "76"	""	"     lockword&=0x7FF;"
> "77"	""	"     lockword|=(monitor_id << 11) | 0x80000000;"
> "78"	"*"	"     *lockword_ptr=lockword;"
> "79"	""	"     apr_memory_rw_barrier();"
> "80"	""	" }"
> 2nd Access
> 	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
> 	Function ExecuteMethod "em_intf.cpp":43
> 	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
> 	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
> 	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function jthread_monitor_enter "thread_java_monitors.c":88
> 	Function unreserve_lock "thread_native_thin_monitor.c":135
> "134"	""	" IDATA unreserve_lock(hythread_thin_monitor_t *lockword_ptr) {"
> "135"	"*"	"     I_32 lockword = *lockword_ptr;"
> "136"	""	"     I_32 lockword_new;"
> "137"	""	"     uint16 lock_id;"
> See also Source View screenshot.
> Notes on Write->Read race condition.
> ------------------------------------
> Write->Read data races occur when one thread writes a shared memory location (address) while another thread concurrently reads the same memory location.  
> The shared memory location may be referred to by (variable) name, pointer, or even a function such as memcpy().  
> The following example uses a variable name:
> 1st access by first thread
> S1: sharedX = privateA
> 2nd access by second thread
> S2: privateB = sharedX
> If sharedX is a variable visible to all threads and privateA and privateB are local variables visible only to the thread where each was declared,
>  concurrent execution of the above statements by multiple threads results in a "race" on the value to be read from sharedX.   
> Since the order of execution among threads is unpredictable, it is unknown which value will be available in sharedX to be stored into privateB.  
> This results in non-deterministic software, or software prone to produce different results each time it is executed. 
> _______________________________________________________________________________________________________________________
> If it not affect correctness of execution I will mark it by special API for prevention of further alarms on this race.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Closed: (HARMONY-3913) [drlvm][thread][tc] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135

Posted by "weldon washburn (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/HARMONY-3913?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

weldon washburn closed HARMONY-3913.
------------------------------------

    Resolution: Won't Fix

> [drlvm][thread][tc] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135
> ---------------------------------------------------------------------------------------------------------
>
>                 Key: HARMONY-3913
>                 URL: https://issues.apache.org/jira/browse/HARMONY-3913
>             Project: Harmony
>          Issue Type: Bug
>          Components: DRLVM
>         Environment: win2003
>            Reporter: Ilya Leviev
>            Priority: Minor
>         Attachments: SourceViewScreenshot-1.jpg
>
>
> TC report on thread unsafe access that result in race condition that occur during concurrent execution of set_fat_lock_id and unreserve_lock functions.
> Write -> Read data-race
> Memory read at "thread_native_thin_monitor.c":135 conflicts with a prior memory write at "thread_native_thin_monitor.c":78
> Stack Trace: 
> Context
> 	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
> 	Function ExecuteMethod "em_intf.cpp":43
> 	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
> 	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
> 	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function jthread_monitor_enter "thread_java_monitors.c":88
> 	Function unreserve_lock "thread_native_thin_monitor.c":134
> 1st Access
> 	Function vm_get_gc_thread_local "c_interface.cpp":2334
> 	Function m2n_free_local_handles "m2n_ia32.cpp":268
> 	Function hythread_self "hythread.h":465
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function hythread_suspend_enable "hythread_ext.h":370
> 	Function Java_java_lang_VMThreadManager_wait "java_lang_vmthreadmanager.cpp":202
> 	Function jthread_monitor_timed_wait "thread_java_monitors.c":308
> 	Function inflate_lock "thread_native_thin_monitor.c":600
> 	Function set_fat_lock_id "thread_native_thin_monitor.c":78
> "76"	""	"     lockword&=0x7FF;"
> "77"	""	"     lockword|=(monitor_id << 11) | 0x80000000;"
> "78"	"*"	"     *lockword_ptr=lockword;"
> "79"	""	"     apr_memory_rw_barrier();"
> "80"	""	" }"
> 2nd Access
> 	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
> 	Function ExecuteMethod "em_intf.cpp":43
> 	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
> 	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
> 	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function jthread_monitor_enter "thread_java_monitors.c":88
> 	Function unreserve_lock "thread_native_thin_monitor.c":135
> "134"	""	" IDATA unreserve_lock(hythread_thin_monitor_t *lockword_ptr) {"
> "135"	"*"	"     I_32 lockword = *lockword_ptr;"
> "136"	""	"     I_32 lockword_new;"
> "137"	""	"     uint16 lock_id;"
> See also Source View screenshot.
> Notes on Write->Read race condition.
> ------------------------------------
> Write->Read data races occur when one thread writes a shared memory location (address) while another thread concurrently reads the same memory location.  
> The shared memory location may be referred to by (variable) name, pointer, or even a function such as memcpy().  
> The following example uses a variable name:
> 1st access by first thread
> S1: sharedX = privateA
> 2nd access by second thread
> S2: privateB = sharedX
> If sharedX is a variable visible to all threads and privateA and privateB are local variables visible only to the thread where each was declared,
>  concurrent execution of the above statements by multiple threads results in a "race" on the value to be read from sharedX.   
> Since the order of execution among threads is unpredictable, it is unknown which value will be available in sharedX to be stored into privateB.  
> This results in non-deterministic software, or software prone to produce different results each time it is executed. 
> _______________________________________________________________________________________________________________________
> If it not affect correctness of execution I will mark it by special API for prevention of further alarms on this race.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (HARMONY-3913) [drlvm][thread][tc] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135

Posted by "weldon washburn (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/HARMONY-3913?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

weldon washburn updated HARMONY-3913:
-------------------------------------

    Priority: Minor  (was: Major)

> [drlvm][thread][tc] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135
> ---------------------------------------------------------------------------------------------------------
>
>                 Key: HARMONY-3913
>                 URL: https://issues.apache.org/jira/browse/HARMONY-3913
>             Project: Harmony
>          Issue Type: Bug
>          Components: DRLVM
>         Environment: win2003
>            Reporter: Ilya Leviev
>            Priority: Minor
>         Attachments: SourceViewScreenshot-1.jpg
>
>
> TC report on thread unsafe access that result in race condition that occur during concurrent execution of set_fat_lock_id and unreserve_lock functions.
> Write -> Read data-race
> Memory read at "thread_native_thin_monitor.c":135 conflicts with a prior memory write at "thread_native_thin_monitor.c":78
> Stack Trace: 
> Context
> 	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
> 	Function ExecuteMethod "em_intf.cpp":43
> 	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
> 	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
> 	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function jthread_monitor_enter "thread_java_monitors.c":88
> 	Function unreserve_lock "thread_native_thin_monitor.c":134
> 1st Access
> 	Function vm_get_gc_thread_local "c_interface.cpp":2334
> 	Function m2n_free_local_handles "m2n_ia32.cpp":268
> 	Function hythread_self "hythread.h":465
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function hythread_suspend_enable "hythread_ext.h":370
> 	Function Java_java_lang_VMThreadManager_wait "java_lang_vmthreadmanager.cpp":202
> 	Function jthread_monitor_timed_wait "thread_java_monitors.c":308
> 	Function inflate_lock "thread_native_thin_monitor.c":600
> 	Function set_fat_lock_id "thread_native_thin_monitor.c":78
> "76"	""	"     lockword&=0x7FF;"
> "77"	""	"     lockword|=(monitor_id << 11) | 0x80000000;"
> "78"	"*"	"     *lockword_ptr=lockword;"
> "79"	""	"     apr_memory_rw_barrier();"
> "80"	""	" }"
> 2nd Access
> 	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
> 	Function ExecuteMethod "em_intf.cpp":43
> 	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
> 	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
> 	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function jthread_monitor_enter "thread_java_monitors.c":88
> 	Function unreserve_lock "thread_native_thin_monitor.c":135
> "134"	""	" IDATA unreserve_lock(hythread_thin_monitor_t *lockword_ptr) {"
> "135"	"*"	"     I_32 lockword = *lockword_ptr;"
> "136"	""	"     I_32 lockword_new;"
> "137"	""	"     uint16 lock_id;"
> See also Source View screenshot.
> Notes on Write->Read race condition.
> ------------------------------------
> Write->Read data races occur when one thread writes a shared memory location (address) while another thread concurrently reads the same memory location.  
> The shared memory location may be referred to by (variable) name, pointer, or even a function such as memcpy().  
> The following example uses a variable name:
> 1st access by first thread
> S1: sharedX = privateA
> 2nd access by second thread
> S2: privateB = sharedX
> If sharedX is a variable visible to all threads and privateA and privateB are local variables visible only to the thread where each was declared,
>  concurrent execution of the above statements by multiple threads results in a "race" on the value to be read from sharedX.   
> Since the order of execution among threads is unpredictable, it is unknown which value will be available in sharedX to be stored into privateB.  
> This results in non-deterministic software, or software prone to produce different results each time it is executed. 
> _______________________________________________________________________________________________________________________
> If it not affect correctness of execution I will mark it by special API for prevention of further alarms on this race.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (HARMONY-3913) [drlvm][tc][thread] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135

Posted by "Ilya Leviev (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/HARMONY-3913?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ilya Leviev updated HARMONY-3913:
---------------------------------

    Summary: [drlvm][tc][thread] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135  (was: [drlvm][thread] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135)

> [drlvm][tc][thread] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135
> ---------------------------------------------------------------------------------------------------------
>
>                 Key: HARMONY-3913
>                 URL: https://issues.apache.org/jira/browse/HARMONY-3913
>             Project: Harmony
>          Issue Type: Bug
>          Components: DRLVM
>         Environment: win2003
>            Reporter: Ilya Leviev
>         Attachments: SourceViewScreenshot-1.jpg
>
>
> TC report on thread unsafe access that result in race condition that occur during concurrent execution of set_fat_lock_id and unreserve_lock functions.
> Write -> Read data-race
> Memory read at "thread_native_thin_monitor.c":135 conflicts with a prior memory write at "thread_native_thin_monitor.c":78
> Stack Trace: 
> Context
> 	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
> 	Function ExecuteMethod "em_intf.cpp":43
> 	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
> 	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
> 	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function jthread_monitor_enter "thread_java_monitors.c":88
> 	Function unreserve_lock "thread_native_thin_monitor.c":134
> 1st Access
> 	Function vm_get_gc_thread_local "c_interface.cpp":2334
> 	Function m2n_free_local_handles "m2n_ia32.cpp":268
> 	Function hythread_self "hythread.h":465
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function hythread_suspend_enable "hythread_ext.h":370
> 	Function Java_java_lang_VMThreadManager_wait "java_lang_vmthreadmanager.cpp":202
> 	Function jthread_monitor_timed_wait "thread_java_monitors.c":308
> 	Function inflate_lock "thread_native_thin_monitor.c":600
> 	Function set_fat_lock_id "thread_native_thin_monitor.c":78
> "76"	""	"     lockword&=0x7FF;"
> "77"	""	"     lockword|=(monitor_id << 11) | 0x80000000;"
> "78"	"*"	"     *lockword_ptr=lockword;"
> "79"	""	"     apr_memory_rw_barrier();"
> "80"	""	" }"
> 2nd Access
> 	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
> 	Function ExecuteMethod "em_intf.cpp":43
> 	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
> 	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
> 	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function jthread_monitor_enter "thread_java_monitors.c":88
> 	Function unreserve_lock "thread_native_thin_monitor.c":135
> "134"	""	" IDATA unreserve_lock(hythread_thin_monitor_t *lockword_ptr) {"
> "135"	"*"	"     I_32 lockword = *lockword_ptr;"
> "136"	""	"     I_32 lockword_new;"
> "137"	""	"     uint16 lock_id;"
> See also Source View screenshot.
> Notes on Write->Read race condition.
> ------------------------------------
> Write->Read data races occur when one thread writes a shared memory location (address) while another thread concurrently reads the same memory location.  
> The shared memory location may be referred to by (variable) name, pointer, or even a function such as memcpy().  
> The following example uses a variable name:
> 1st access by first thread
> S1: sharedX = privateA
> 2nd access by second thread
> S2: privateB = sharedX
> If sharedX is a variable visible to all threads and privateA and privateB are local variables visible only to the thread where each was declared,
>  concurrent execution of the above statements by multiple threads results in a "race" on the value to be read from sharedX.   
> Since the order of execution among threads is unpredictable, it is unknown which value will be available in sharedX to be stored into privateB.  
> This results in non-deterministic software, or software prone to produce different results each time it is executed. 
> _______________________________________________________________________________________________________________________
> If it not affect correctness of execution I will mark it by special API for prevention of further alarms on this race.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (HARMONY-3913) [drlvm][thread][tc] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135

Posted by "Ilya Leviev (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/HARMONY-3913?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ilya Leviev updated HARMONY-3913:
---------------------------------

    Summary: [drlvm][thread][tc] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135  (was: [drlvm][tc][thread] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135)

> [drlvm][thread][tc] Race conditions at "thread_native_thin_monitor.c":78 and "thread_java_monitors.c":135
> ---------------------------------------------------------------------------------------------------------
>
>                 Key: HARMONY-3913
>                 URL: https://issues.apache.org/jira/browse/HARMONY-3913
>             Project: Harmony
>          Issue Type: Bug
>          Components: DRLVM
>         Environment: win2003
>            Reporter: Ilya Leviev
>         Attachments: SourceViewScreenshot-1.jpg
>
>
> TC report on thread unsafe access that result in race condition that occur during concurrent execution of set_fat_lock_id and unreserve_lock functions.
> Write -> Read data-race
> Memory read at "thread_native_thin_monitor.c":135 conflicts with a prior memory write at "thread_native_thin_monitor.c":78
> Stack Trace: 
> Context
> 	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
> 	Function ExecuteMethod "em_intf.cpp":43
> 	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
> 	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
> 	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function jthread_monitor_enter "thread_java_monitors.c":88
> 	Function unreserve_lock "thread_native_thin_monitor.c":134
> 1st Access
> 	Function vm_get_gc_thread_local "c_interface.cpp":2334
> 	Function m2n_free_local_handles "m2n_ia32.cpp":268
> 	Function hythread_self "hythread.h":465
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function hythread_suspend_enable "hythread_ext.h":370
> 	Function Java_java_lang_VMThreadManager_wait "java_lang_vmthreadmanager.cpp":202
> 	Function jthread_monitor_timed_wait "thread_java_monitors.c":308
> 	Function inflate_lock "thread_native_thin_monitor.c":600
> 	Function set_fat_lock_id "thread_native_thin_monitor.c":78
> "76"	""	"     lockword&=0x7FF;"
> "77"	""	"     lockword|=(monitor_id << 11) | 0x80000000;"
> "78"	"*"	"     *lockword_ptr=lockword;"
> "79"	""	"     apr_memory_rw_barrier();"
> "80"	""	" }"
> 2nd Access
> 	Function void vm_execute_java_method_array(struct _jmethodID *,union jvalue *,union jvalue *) "ini.cpp":60
> 	Function ExecuteMethod "em_intf.cpp":43
> 	Function void DrlEMImpl::executeMethod(struct _jmethodID *,union jvalue *,union jvalue *) "drlemimpl.cpp":509
> 	Function void JIT_execute_method_default(void *,struct _jmethodID *,union jvalue *,union jvalue *) "ini_ia32.cpp":199
> 	Function vm_invoke_native_array_stub "ini_ia32.cpp":76
> 	Function hythread_thin_monitor_exit "thread_native_thin_monitor.c":416
> 	Function hythread_thin_monitor_try_enter "thread_native_thin_monitor.c":341
> 	Function class VM_thread * get_thread_ptr_stub(void) "thread_manager.cpp":138
> 	Function jthread_monitor_enter "thread_java_monitors.c":88
> 	Function unreserve_lock "thread_native_thin_monitor.c":135
> "134"	""	" IDATA unreserve_lock(hythread_thin_monitor_t *lockword_ptr) {"
> "135"	"*"	"     I_32 lockword = *lockword_ptr;"
> "136"	""	"     I_32 lockword_new;"
> "137"	""	"     uint16 lock_id;"
> See also Source View screenshot.
> Notes on Write->Read race condition.
> ------------------------------------
> Write->Read data races occur when one thread writes a shared memory location (address) while another thread concurrently reads the same memory location.  
> The shared memory location may be referred to by (variable) name, pointer, or even a function such as memcpy().  
> The following example uses a variable name:
> 1st access by first thread
> S1: sharedX = privateA
> 2nd access by second thread
> S2: privateB = sharedX
> If sharedX is a variable visible to all threads and privateA and privateB are local variables visible only to the thread where each was declared,
>  concurrent execution of the above statements by multiple threads results in a "race" on the value to be read from sharedX.   
> Since the order of execution among threads is unpredictable, it is unknown which value will be available in sharedX to be stored into privateB.  
> This results in non-deterministic software, or software prone to produce different results each time it is executed. 
> _______________________________________________________________________________________________________________________
> If it not affect correctness of execution I will mark it by special API for prevention of further alarms on this race.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.