< prev index next >

src/hotspot/share/services/mallocSiteTable.cpp

Print this page




 218 }
 219 
 220 void MallocSiteTable::shutdown() {
 221   AccessLock locker(&_access_count);
 222   locker.exclusiveLock();
 223   reset();
 224 }
 225 
 226 bool MallocSiteTable::walk_malloc_site(MallocSiteWalker* walker) {
 227   assert(walker != NULL, "NuLL walker");
 228   AccessLock locker(&_access_count);
 229   if (locker.sharedLock()) {
 230     NOT_PRODUCT(_peak_count = MAX2(_peak_count, _access_count);)
 231     return walk(walker);
 232   }
 233   return false;
 234 }
 235 
 236 
 237 void MallocSiteTable::AccessLock::exclusiveLock() {
 238   jint target;
 239   jint val;
 240 
 241   assert(_lock_state != ExclusiveLock, "Can only call once");
 242   assert(*_lock >= 0, "Can not content exclusive lock");
 243 
 244   // make counter negative to block out shared locks
 245   do {
 246     val = *_lock;
 247     target = _MAGIC_ + *_lock;
 248   } while (Atomic::cmpxchg(target, _lock, val) != val);
 249 
 250   // wait for all readers to exit
 251   while (*_lock != _MAGIC_) {
 252 #ifdef _WINDOWS
 253     os::naked_short_sleep(1);
 254 #else
 255     os::naked_yield();
 256 #endif
 257   }
 258   _lock_state = ExclusiveLock;
 259 }


 218 }
 219 
 220 void MallocSiteTable::shutdown() {
 221   AccessLock locker(&_access_count);
 222   locker.exclusiveLock();
 223   reset();
 224 }
 225 
 226 bool MallocSiteTable::walk_malloc_site(MallocSiteWalker* walker) {
 227   assert(walker != NULL, "NuLL walker");
 228   AccessLock locker(&_access_count);
 229   if (locker.sharedLock()) {
 230     NOT_PRODUCT(_peak_count = MAX2(_peak_count, _access_count);)
 231     return walk(walker);
 232   }
 233   return false;
 234 }
 235 
 236 
 237 void MallocSiteTable::AccessLock::exclusiveLock() {
 238   int target;
 239   int val;
 240 
 241   assert(_lock_state != ExclusiveLock, "Can only call once");
 242   assert(*_lock >= 0, "Can not content exclusive lock");
 243 
 244   // make counter negative to block out shared locks
 245   do {
 246     val = *_lock;
 247     target = _MAGIC_ + *_lock;
 248   } while (Atomic::cmpxchg(target, _lock, val) != val);
 249 
 250   // wait for all readers to exit
 251   while (*_lock != _MAGIC_) {
 252 #ifdef _WINDOWS
 253     os::naked_short_sleep(1);
 254 #else
 255     os::naked_yield();
 256 #endif
 257   }
 258   _lock_state = ExclusiveLock;
 259 }
< prev index next >