< prev index next >
src/share/vm/gc/shared/workgroup.cpp
Print this page
*** 499,622 ****
return true;
}
return false;
}
! bool FreeIdSet::_stat_init = false;
! FreeIdSet* FreeIdSet::_sets[NSets];
! bool FreeIdSet::_safepoint;
!
! FreeIdSet::FreeIdSet(int sz, Monitor* mon) :
! _sz(sz), _mon(mon), _hd(0), _waiters(0), _index(-1), _claimed(0)
{
! _ids = NEW_C_HEAP_ARRAY(int, sz, mtInternal);
! for (int i = 0; i < sz; i++) _ids[i] = i+1;
! _ids[sz-1] = end_of_list; // end of list.
! if (_stat_init) {
! for (int j = 0; j < NSets; j++) _sets[j] = NULL;
! _stat_init = true;
! }
! // Add to sets. (This should happen while the system is still single-threaded.)
! for (int j = 0; j < NSets; j++) {
! if (_sets[j] == NULL) {
! _sets[j] = this;
! _index = j;
! break;
! }
}
! guarantee(_index != -1, "Too many FreeIdSets in use!");
}
FreeIdSet::~FreeIdSet() {
! _sets[_index] = NULL;
! FREE_C_HEAP_ARRAY(int, _ids);
}
! void FreeIdSet::set_safepoint(bool b) {
! _safepoint = b;
! if (b) {
! for (int j = 0; j < NSets; j++) {
! if (_sets[j] != NULL && _sets[j]->_waiters > 0) {
! Monitor* mon = _sets[j]->_mon;
! mon->lock_without_safepoint_check();
! mon->notify_all();
! mon->unlock();
! }
! }
! }
! }
!
! #define FID_STATS 0
!
! int FreeIdSet::claim_par_id() {
! #if FID_STATS
! thread_t tslf = thr_self();
! tty->print("claim_par_id[%d]: sz = %d, claimed = %d\n", tslf, _sz, _claimed);
! #endif
MutexLockerEx x(_mon, Mutex::_no_safepoint_check_flag);
! while (!_safepoint && _hd == end_of_list) {
_waiters++;
- #if FID_STATS
- if (_waiters > 5) {
- tty->print("claim_par_id waiting[%d]: %d waiters, %d claimed.\n",
- tslf, _waiters, _claimed);
- }
- #endif
_mon->wait(Mutex::_no_safepoint_check_flag);
_waiters--;
}
! if (_hd == end_of_list) {
! #if FID_STATS
! tty->print("claim_par_id[%d]: returning EOL.\n", tslf);
! #endif
! return -1;
! } else {
! int res = _hd;
_hd = _ids[res];
_ids[res] = claimed; // For debugging.
_claimed++;
- #if FID_STATS
- tty->print("claim_par_id[%d]: returning %d, claimed = %d.\n",
- tslf, res, _claimed);
- #endif
return res;
- }
}
! bool FreeIdSet::claim_perm_id(int i) {
! assert(0 <= i && i < _sz, "Out of range.");
! MutexLockerEx x(_mon, Mutex::_no_safepoint_check_flag);
! int prev = end_of_list;
! int cur = _hd;
! while (cur != end_of_list) {
! if (cur == i) {
! if (prev == end_of_list) {
! _hd = _ids[cur];
! } else {
! _ids[prev] = _ids[cur];
! }
! _ids[cur] = claimed;
! _claimed++;
! return true;
! } else {
! prev = cur;
! cur = _ids[cur];
! }
! }
! return false;
!
! }
!
! void FreeIdSet::release_par_id(int id) {
MutexLockerEx x(_mon, Mutex::_no_safepoint_check_flag);
assert(_ids[id] == claimed, "Precondition.");
_ids[id] = _hd;
_hd = id;
_claimed--;
! #if FID_STATS
! tty->print("[%d] release_par_id(%d), waiters =%d, claimed = %d.\n",
! thr_self(), id, _waiters, _claimed);
! #endif
! if (_waiters > 0)
! // Notify all would be safer, but this is OK, right?
_mon->notify_all();
}
--- 499,542 ----
return true;
}
return false;
}
! FreeIdSet::FreeIdSet(uint size, Monitor* mon) :
! _size(size), _mon(mon), _hd(0), _waiters(0), _claimed(0)
{
! guarantee(size != 0, "must be");
! _ids = NEW_C_HEAP_ARRAY(uint, size, mtGC);
! for (uint i = 0; i < size - 1; i++) {
! _ids[i] = i+1;
}
! _ids[size-1] = end_of_list; // end of list.
}
FreeIdSet::~FreeIdSet() {
! FREE_C_HEAP_ARRAY(uint, _ids);
}
! uint FreeIdSet::claim_par_id() {
MutexLockerEx x(_mon, Mutex::_no_safepoint_check_flag);
! while (_hd == end_of_list) {
_waiters++;
_mon->wait(Mutex::_no_safepoint_check_flag);
_waiters--;
}
! uint res = _hd;
_hd = _ids[res];
_ids[res] = claimed; // For debugging.
_claimed++;
return res;
}
! void FreeIdSet::release_par_id(uint id) {
MutexLockerEx x(_mon, Mutex::_no_safepoint_check_flag);
assert(_ids[id] == claimed, "Precondition.");
_ids[id] = _hd;
_hd = id;
_claimed--;
! if (_waiters > 0) {
_mon->notify_all();
+ }
}
< prev index next >