PERFORCE change 68384 for review
David Xu
davidxu at FreeBSD.org
Thu Jan 6 05:03:46 PST 2005
http://perforce.freebsd.org/chv.cgi?CH=68384
Change 68384 by davidxu at davidxu_tiger on 2005/01/06 13:03:37
add sem_destroy.
Affected files ...
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sem.c#9 edit
Differences ...
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sem.c#9 (text+ko) ====
@@ -44,6 +44,7 @@
__weak_reference(_sem_init, sem_init);
+__weak_reference(_sem_destroy, sem_destroy);
__weak_reference(_sem_getvalue, sem_getvalue);
__weak_reference(_sem_trywait, sem_trywait);
__weak_reference(_sem_wait, sem_wait);
@@ -78,6 +79,7 @@
errno = ENOSPC;
return (NULL);
}
+ umtx_init((struct umtx *)&sem->lock);
/*
* Fortunatly count and nwaiters are adjacency, so we can
* use umtx_wait to wait on it, umtx_wait needs an address
@@ -110,6 +112,29 @@
}
int
+_sem_destroy(sem_t *sem)
+{
+ int retval;
+
+ if (sem_check_validity(sem) != 0)
+ return (-1);
+
+ /*
+ * If this is a system semaphore let the kernel track it otherwise
+ * make sure there are no waiters.
+ */
+ if ((*sem)->syssem != 0)
+ retval = ksem_destroy((*sem)->semid);
+ else {
+ retval = 0;
+ (*sem)->magic = 0;
+ }
+ if (retval == 0)
+ free(*sem);
+ return (retval);
+}
+
+int
_sem_getvalue(sem_t * __restrict sem, int * __restrict sval)
{
int retval;
@@ -208,7 +233,8 @@
return (-1);
}
oldcancel = _thr_cancel_enter(curthread);
- retval = umtx_timedwait((struct umtx *)&(*sem)->count, 0, abstime);
+ retval = umtx_timedwait((struct umtx *)&(*sem)->count, 0,
+ abstime);
_thr_cancel_leave(curthread, oldcancel);
} while (retval == 0);
errno = retval;
More information about the p4-projects
mailing list