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 } |