< prev index next >

src/share/vm/runtime/park.cpp

Print this page




 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 
< prev index next >