[q-lang-cvs] q/modules/clib clib.c,1.85,1.86
Brought to you by:
agraef
From: Albert G. <ag...@us...> - 2008-02-22 07:47:55
|
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; |