262 |
262 |
263 Monitor::~Monitor() { |
263 Monitor::~Monitor() { |
264 assert_owner(NULL); |
264 assert_owner(NULL); |
265 } |
265 } |
266 |
266 |
267 void Monitor::ClearMonitor(Monitor * m, const char *name) { |
|
268 m->_owner = NULL; |
|
269 if (name == NULL) { |
|
270 strcpy(m->_name, "UNKNOWN"); |
|
271 } else { |
|
272 strncpy(m->_name, name, MONITOR_NAME_LEN - 1); |
|
273 m->_name[MONITOR_NAME_LEN - 1] = '\0'; |
|
274 } |
|
275 } |
|
276 |
|
277 Monitor::Monitor() { |
|
278 assert(os::mutex_init_done(), "Too early!"); |
|
279 ClearMonitor(this); |
|
280 } |
|
281 |
|
282 |
|
283 // Only Threads_lock, Heap_lock and SR_lock may be safepoint_check_sometimes. |
267 // Only Threads_lock, Heap_lock and SR_lock may be safepoint_check_sometimes. |
284 bool is_sometimes_ok(const char* name) { |
268 bool is_sometimes_ok(const char* name) { |
285 return (strcmp(name, "Threads_lock") == 0 || strcmp(name, "Heap_lock") == 0 || strcmp(name, "SR_lock") == 0); |
269 return (strcmp(name, "Threads_lock") == 0 || strcmp(name, "Heap_lock") == 0 || strcmp(name, "SR_lock") == 0); |
286 } |
270 } |
287 |
271 |
288 Monitor::Monitor(int Rank, const char * name, bool allow_vm_block, |
272 Monitor::Monitor(int Rank, const char * name, bool allow_vm_block, |
289 SafepointCheckRequired safepoint_check_required) { |
273 SafepointCheckRequired safepoint_check_required) : _owner(NULL) { |
290 assert(os::mutex_init_done(), "Too early!"); |
274 assert(os::mutex_init_done(), "Too early!"); |
291 ClearMonitor(this, name); |
275 if (name == NULL) { |
|
276 strcpy(_name, "UNKNOWN"); |
|
277 } else { |
|
278 strncpy(_name, name, MONITOR_NAME_LEN - 1); |
|
279 _name[MONITOR_NAME_LEN - 1] = '\0'; |
|
280 } |
292 #ifdef ASSERT |
281 #ifdef ASSERT |
293 _allow_vm_block = allow_vm_block; |
282 _allow_vm_block = allow_vm_block; |
294 _rank = Rank; |
283 _rank = Rank; |
295 NOT_PRODUCT(_safepoint_check_required = safepoint_check_required;) |
284 _safepoint_check_required = safepoint_check_required; |
296 |
285 |
297 assert(_safepoint_check_required != Monitor::_safepoint_check_sometimes || is_sometimes_ok(name), |
286 assert(_safepoint_check_required != Monitor::_safepoint_check_sometimes || is_sometimes_ok(name), |
298 "Lock has _safepoint_check_sometimes %s", name); |
287 "Lock has _safepoint_check_sometimes %s", name); |
299 #endif |
288 #endif |
300 } |
289 } |
301 |
290 |
302 Mutex::Mutex(int Rank, const char * name, bool allow_vm_block, |
291 Mutex::Mutex(int Rank, const char * name, bool allow_vm_block, |
303 SafepointCheckRequired safepoint_check_required) { |
292 SafepointCheckRequired safepoint_check_required) : |
304 ClearMonitor((Monitor *) this, name); |
293 Monitor(Rank, name, allow_vm_block, safepoint_check_required) {} |
305 #ifdef ASSERT |
|
306 _allow_vm_block = allow_vm_block; |
|
307 _rank = Rank; |
|
308 NOT_PRODUCT(_safepoint_check_required = safepoint_check_required;) |
|
309 |
|
310 assert(_safepoint_check_required != Monitor::_safepoint_check_sometimes || is_sometimes_ok(name), |
|
311 "Lock has _safepoint_check_sometimes %s", name); |
|
312 #endif |
|
313 } |
|
314 |
294 |
315 bool Monitor::owned_by_self() const { |
295 bool Monitor::owned_by_self() const { |
316 return _owner == Thread::current(); |
296 return _owner == Thread::current(); |
317 } |
297 } |
318 |
298 |