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