comparison src/share/vm/runtime/synchronizer.cpp @ 12316:190899198332

7195622: CheckUnhandledOops has limited usefulness now Summary: Enable CHECK_UNHANDLED_OOPS in fastdebug builds across all supported platforms. Reviewed-by: coleenp, hseigel, dholmes, stefank, twisti, ihse, rdurbin Contributed-by: lois.foltan@oracle.com
author hseigel
date Thu, 26 Sep 2013 10:25:02 -0400
parents f2110083203d
children cefad50507d8 dbcb1dd0785b 2b8e28fdf503
comparison
equal deleted inserted replaced
12315:c1fbf21c7397 12316:190899198332
152 ObjectMonitor * volatile ObjectSynchronizer::gOmInUseList = NULL ; 152 ObjectMonitor * volatile ObjectSynchronizer::gOmInUseList = NULL ;
153 int ObjectSynchronizer::gOmInUseCount = 0; 153 int ObjectSynchronizer::gOmInUseCount = 0;
154 static volatile intptr_t ListLock = 0 ; // protects global monitor free-list cache 154 static volatile intptr_t ListLock = 0 ; // protects global monitor free-list cache
155 static volatile int MonitorFreeCount = 0 ; // # on gFreeList 155 static volatile int MonitorFreeCount = 0 ; // # on gFreeList
156 static volatile int MonitorPopulation = 0 ; // # Extant -- in circulation 156 static volatile int MonitorPopulation = 0 ; // # Extant -- in circulation
157 #define CHAINMARKER ((oop)-1) 157 #define CHAINMARKER (cast_to_oop<intptr_t>(-1))
158 158
159 // ----------------------------------------------------------------------------- 159 // -----------------------------------------------------------------------------
160 // Fast Monitor Enter/Exit 160 // Fast Monitor Enter/Exit
161 // This the fast monitor enter. The interpreter and compiler use 161 // This the fast monitor enter. The interpreter and compiler use
162 // some assembly copies of this code. Make sure update those code 162 // some assembly copies of this code. Make sure update those code
508 // and calling park(). When inflation was complete the thread that accomplished inflation 508 // and calling park(). When inflation was complete the thread that accomplished inflation
509 // would detach the list and set the markword to inflated with a single CAS and 509 // would detach the list and set the markword to inflated with a single CAS and
510 // then for each thread on the list, set the flag and unpark() the thread. 510 // then for each thread on the list, set the flag and unpark() the thread.
511 // This is conceptually similar to muxAcquire-muxRelease, except that muxRelease 511 // This is conceptually similar to muxAcquire-muxRelease, except that muxRelease
512 // wakes at most one thread whereas we need to wake the entire list. 512 // wakes at most one thread whereas we need to wake the entire list.
513 int ix = (intptr_t(obj) >> 5) & (NINFLATIONLOCKS-1) ; 513 int ix = (cast_from_oop<intptr_t>(obj) >> 5) & (NINFLATIONLOCKS-1) ;
514 int YieldThenBlock = 0 ; 514 int YieldThenBlock = 0 ;
515 assert (ix >= 0 && ix < NINFLATIONLOCKS, "invariant") ; 515 assert (ix >= 0 && ix < NINFLATIONLOCKS, "invariant") ;
516 assert ((NINFLATIONLOCKS & (NINFLATIONLOCKS-1)) == 0, "invariant") ; 516 assert ((NINFLATIONLOCKS & (NINFLATIONLOCKS-1)) == 0, "invariant") ;
517 Thread::muxAcquire (InflationLocks + ix, "InflationLock") ; 517 Thread::muxAcquire (InflationLocks + ix, "InflationLock") ;
518 while (obj->mark() == markOopDesc::INFLATING()) { 518 while (obj->mark() == markOopDesc::INFLATING()) {
563 } else 563 } else
564 if (hashCode == 1) { 564 if (hashCode == 1) {
565 // This variation has the property of being stable (idempotent) 565 // This variation has the property of being stable (idempotent)
566 // between STW operations. This can be useful in some of the 1-0 566 // between STW operations. This can be useful in some of the 1-0
567 // synchronization schemes. 567 // synchronization schemes.
568 intptr_t addrBits = intptr_t(obj) >> 3 ; 568 intptr_t addrBits = cast_from_oop<intptr_t>(obj) >> 3 ;
569 value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ; 569 value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;
570 } else 570 } else
571 if (hashCode == 2) { 571 if (hashCode == 2) {
572 value = 1 ; // for sensitivity testing 572 value = 1 ; // for sensitivity testing
573 } else 573 } else
574 if (hashCode == 3) { 574 if (hashCode == 3) {
575 value = ++GVars.hcSequence ; 575 value = ++GVars.hcSequence ;
576 } else 576 } else
577 if (hashCode == 4) { 577 if (hashCode == 4) {
578 value = intptr_t(obj) ; 578 value = cast_from_oop<intptr_t>(obj) ;
579 } else { 579 } else {
580 // Marsaglia's xor-shift scheme with thread-specific state 580 // Marsaglia's xor-shift scheme with thread-specific state
581 // This is probably the best overall implementation -- we'll 581 // This is probably the best overall implementation -- we'll
582 // likely make this the default in future releases. 582 // likely make this the default in future releases.
583 unsigned t = Self->_hashStateX ; 583 unsigned t = Self->_hashStateX ;
1319 TEVENT(Inflate: overwrite stacklock) ; 1319 TEVENT(Inflate: overwrite stacklock) ;
1320 if (TraceMonitorInflation) { 1320 if (TraceMonitorInflation) {
1321 if (object->is_instance()) { 1321 if (object->is_instance()) {
1322 ResourceMark rm; 1322 ResourceMark rm;
1323 tty->print_cr("Inflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s", 1323 tty->print_cr("Inflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s",
1324 (intptr_t) object, (intptr_t) object->mark(), 1324 (void *) object, (intptr_t) object->mark(),
1325 object->klass()->external_name()); 1325 object->klass()->external_name());
1326 } 1326 }
1327 } 1327 }
1328 return m ; 1328 return m ;
1329 } 1329 }
1369 TEVENT(Inflate: overwrite neutral) ; 1369 TEVENT(Inflate: overwrite neutral) ;
1370 if (TraceMonitorInflation) { 1370 if (TraceMonitorInflation) {
1371 if (object->is_instance()) { 1371 if (object->is_instance()) {
1372 ResourceMark rm; 1372 ResourceMark rm;
1373 tty->print_cr("Inflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s", 1373 tty->print_cr("Inflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s",
1374 (intptr_t) object, (intptr_t) object->mark(), 1374 (void *) object, (intptr_t) object->mark(),
1375 object->klass()->external_name()); 1375 object->klass()->external_name());
1376 } 1376 }
1377 } 1377 }
1378 return m ; 1378 return m ;
1379 } 1379 }
1437 TEVENT (deflate_idle_monitors - scavenge1) ; 1437 TEVENT (deflate_idle_monitors - scavenge1) ;
1438 if (TraceMonitorInflation) { 1438 if (TraceMonitorInflation) {
1439 if (obj->is_instance()) { 1439 if (obj->is_instance()) {
1440 ResourceMark rm; 1440 ResourceMark rm;
1441 tty->print_cr("Deflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s", 1441 tty->print_cr("Deflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s",
1442 (intptr_t) obj, (intptr_t) obj->mark(), obj->klass()->external_name()); 1442 (void *) obj, (intptr_t) obj->mark(), obj->klass()->external_name());
1443 } 1443 }
1444 } 1444 }
1445 1445
1446 // Restore the header back to obj 1446 // Restore the header back to obj
1447 obj->release_set_mark(mid->header()); 1447 obj->release_set_mark(mid->header());