131 // Parker from the global free list.
132 // 8028280: using concurrent free list without memory management can leak
133 // pretty badly it turns out.
134 Thread::SpinAcquire(&ListLock, "ParkerFreeListAllocate");
135 {
136 p = FreeList;
137 if (p != NULL) {
138 FreeList = p->FreeNext;
139 }
140 }
141 Thread::SpinRelease(&ListLock);
142
143 if (p != NULL) {
144 guarantee (p->AssociatedWith == NULL, "invariant") ;
145 } else {
146 // Do this the hard way -- materialize a new Parker..
147 p = new Parker() ;
148 }
149 p->AssociatedWith = t ; // Associate p with t
150 p->FreeNext = NULL ;
151 return p ;
152 }
153
154
155 void Parker::Release (Parker * p) {
156 if (p == NULL) return ;
157 guarantee (p->AssociatedWith != NULL, "invariant") ;
158 guarantee (p->FreeNext == NULL , "invariant") ;
159 p->AssociatedWith = NULL ;
160
161 Thread::SpinAcquire(&ListLock, "ParkerFreeListRelease");
162 {
163 p->FreeNext = FreeList;
164 FreeList = p;
165 }
166 Thread::SpinRelease(&ListLock);
167 }
168
|
131 // Parker from the global free list.
132 // 8028280: using concurrent free list without memory management can leak
133 // pretty badly it turns out.
134 Thread::SpinAcquire(&ListLock, "ParkerFreeListAllocate");
135 {
136 p = FreeList;
137 if (p != NULL) {
138 FreeList = p->FreeNext;
139 }
140 }
141 Thread::SpinRelease(&ListLock);
142
143 if (p != NULL) {
144 guarantee (p->AssociatedWith == NULL, "invariant") ;
145 } else {
146 // Do this the hard way -- materialize a new Parker..
147 p = new Parker() ;
148 }
149 p->AssociatedWith = t ; // Associate p with t
150 p->FreeNext = NULL ;
151 p->_counter = 0;
152 return p ;
153 }
154
155
156 void Parker::Release (Parker * p) {
157 if (p == NULL) return ;
158 guarantee (p->AssociatedWith != NULL, "invariant") ;
159 guarantee (p->FreeNext == NULL , "invariant") ;
160
161 int status = pthread_mutex_lock(p->_mutex);
162 assert(status == 0, "invariant");
163 {
164 p->AssociatedWith = NULL;
165 }
166 pthread_mutex_unlock(p->_mutex);
167 assert(status == 0, "invariant");
168
169 Thread::SpinAcquire(&ListLock, "ParkerFreeListRelease");
170 {
171 p->FreeNext = FreeList;
172 FreeList = p;
173 }
174 Thread::SpinRelease(&ListLock);
175 }
176
|