pthread_rwlock_timedwrlock.c raw

   1  #include "pthread_impl.h"
   2  
   3  int __pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict rw, const struct timespec *restrict at)
   4  {
   5  	int r, t;
   6  	
   7  	r = pthread_rwlock_trywrlock(rw);
   8  	if (r != EBUSY) return r;
   9  	
  10  	int spins = 100;
  11  	while (spins-- && rw->_rw_lock && !rw->_rw_waiters) a_spin();
  12  
  13  	while ((r=__pthread_rwlock_trywrlock(rw))==EBUSY) {
  14  		if (!(r=rw->_rw_lock)) continue;
  15  		t = r | 0x80000000;
  16  		a_inc(&rw->_rw_waiters);
  17  		a_cas(&rw->_rw_lock, r, t);
  18  		r = __timedwait(&rw->_rw_lock, t, CLOCK_REALTIME, at, rw->_rw_shared^128);
  19  		a_dec(&rw->_rw_waiters);
  20  		if (r && r != EINTR) return r;
  21  	}
  22  	return r;
  23  }
  24  
  25  weak_alias(__pthread_rwlock_timedwrlock, pthread_rwlock_timedwrlock);
  26