Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 6 Jan 2005 13:03:45 GMT
From:      David Xu <davidxu@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 68384 for review
Message-ID:  <200501061303.j06D3j7S012314@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=68384

Change 68384 by davidxu@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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200501061303.j06D3j7S012314>