Mercurial > hg > truffle
comparison src/share/vm/runtime/synchronizer.cpp @ 12873:4e7f99b70d9d
Merge
author | adlertz |
---|---|
date | Wed, 09 Oct 2013 05:03:34 -0700 |
parents | 190899198332 |
children | cefad50507d8 dbcb1dd0785b 2b8e28fdf503 |
comparison
equal
deleted
inserted
replaced
12872:98692a2d36d7 | 12873:4e7f99b70d9d |
---|---|
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()); |