Update of /cvsroot/q-lang/q/modules/clib
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv23116
Modified Files:
clib.c
Log Message:
add timed try for mutex and semaphore
Index: clib.c
===================================================================
RCS file: /cvsroot/q-lang/q/modules/clib/clib.c,v
retrieving revision 1.85
retrieving revision 1.86
diff -C2 -d -r1.85 -r1.86
*** clib.c 23 Jan 2008 05:24:32 -0000 1.85
--- clib.c 22 Feb 2008 07:47:51 -0000 1.86
***************
*** 5773,5789 ****
my_mutex_t *mut;
my_sem_t *sem;
! if (argc == 1)
! if (isobj(argv[0], type(Mutex), (void**)&mut)) {
check_mut(mut);
! if (pthread_mutex_trylock(&mut->mut))
return __FAIL;
else
return mkvoid;
! } else if (isobj(argv[0], type(Semaphore), (void**)&sem)) {
int res;
expr val;
check_sem(sem);
release_lock();
! res = sem_trywait(sem->semp);
if (!res) {
pthread_mutex_lock(&sem->mut);
--- 5773,5817 ----
my_mutex_t *mut;
my_sem_t *sem;
! if (argc == 1) {
! int n;
! expr x = argv[0], *v;
! double t;
! struct timespec tspec;
! bool tset = 0;
! if (istuple(x, &n, &v) && n == 2 &&
! (isfloat(v[1], &t) || ismpz_float(v[1], &t))) {
! double ip, fp;
! unsigned long secs;
! unsigned long nsecs;
! fp = modf(t/1e3, &ip);
! if (ip > LONG_MAX) { ip = (double)LONG_MAX; fp = 0.0; }
! secs = (unsigned long)ip;
! nsecs = (unsigned long)(fp*1e9);
! tspec.tv_sec = secs; tspec.tv_nsec = nsecs;
! x = v[0];
! tset = 1;
! }
! if (isobj(x, type(Mutex), (void**)&mut)) {
! int res;
check_mut(mut);
! if (tset) {
! release_lock();
! res = pthread_mutex_timedlock(&mut->mut, &tspec);
! acquire_lock();
! } else
! res = pthread_mutex_trylock(&mut->mut);
! if (res)
return __FAIL;
else
return mkvoid;
! } else if (isobj(x, type(Semaphore), (void**)&sem)) {
int res;
expr val;
check_sem(sem);
release_lock();
! if (tset)
! res = sem_timedwait(sem->semp, &tspec);
! else
! res = sem_trywait(sem->semp);
if (!res) {
pthread_mutex_lock(&sem->mut);
***************
*** 5803,5807 ****
} else
return __FAIL;
! else
#endif
return __FAIL;
--- 5831,5835 ----
} else
return __FAIL;
! } else
#endif
return __FAIL;
|