summaryrefslogtreecommitdiff
path: root/regress/lib/libpthread
diff options
context:
space:
mode:
authorWilbern Cobb <wcobb@cvs.openbsd.org>2002-05-03 10:08:56 +0000
committerWilbern Cobb <wcobb@cvs.openbsd.org>2002-05-03 10:08:56 +0000
commit9db2fbc0badf3b9f537fd021cb3598d3d9c5f64a (patch)
treede62637fe9f7d8f84aa0b7169ee9fd5c7891f8f8 /regress/lib/libpthread
parent7547ab5140298f0718d9139ff9662ccf02fb8774 (diff)
test pthread_key_create(), pthread_key_delete(), pthread_getspecific()
and pthread_setspecific(). ok fgsch@.
Diffstat (limited to 'regress/lib/libpthread')
-rw-r--r--regress/lib/libpthread/pthread_specific/Makefile5
-rw-r--r--regress/lib/libpthread/pthread_specific/pthread_specific.c87
2 files changed, 92 insertions, 0 deletions
diff --git a/regress/lib/libpthread/pthread_specific/Makefile b/regress/lib/libpthread/pthread_specific/Makefile
new file mode 100644
index 00000000000..93bba05a419
--- /dev/null
+++ b/regress/lib/libpthread/pthread_specific/Makefile
@@ -0,0 +1,5 @@
+# $OpenBSD: Makefile,v 1.1 2002/05/03 10:08:55 wcobb Exp $
+
+PROG= pthread_specific
+
+.include <bsd.regress.mk>
diff --git a/regress/lib/libpthread/pthread_specific/pthread_specific.c b/regress/lib/libpthread/pthread_specific/pthread_specific.c
new file mode 100644
index 00000000000..16c28f2c8cb
--- /dev/null
+++ b/regress/lib/libpthread/pthread_specific/pthread_specific.c
@@ -0,0 +1,87 @@
+/* $OpenBSD: pthread_specific.c,v 1.1 2002/05/03 10:08:55 wcobb Exp $ */
+
+/*
+ * Copyright (c) 2002 CubeSoft Communications, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Neither the name of CubeSoft Communications, nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <pthread.h>
+#include <pthread_np.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "test.h"
+
+#define NTHREADS 128
+
+pthread_key_t key;
+int destroy_run = 0;
+
+void *
+run_thread(void *arg)
+{
+ int i;
+
+ fprintf(stderr, ".");
+ for (i = 0; i < 32767; i++) {
+ void *p;
+
+ p = pthread_getspecific(key);
+ if (p == NULL) {
+ CHECKr(pthread_setspecific(key, pthread_self()));
+ } else {
+ ASSERT(p == pthread_self());
+ }
+ fflush(stderr);
+ }
+
+ return (NULL);
+}
+
+void
+destroy_key(void *keyp)
+{
+ destroy_run++;
+}
+
+int
+main()
+{
+ pthread_t threads[NTHREADS];
+ int i;
+
+ CHECKr(pthread_key_create(&key, destroy_key));
+ for (i = 0; i < NTHREADS; i++) {
+ CHECKr(pthread_create(&threads[i], NULL, run_thread, NULL));
+ }
+ for (i = 0; i < NTHREADS; i++) {
+ CHECKr(pthread_join(threads[i], NULL));
+ }
+ fprintf(stderr, "\n");
+
+ CHECKr(pthread_key_delete(key));
+
+ ASSERT(destroy_run > 0);
+
+ SUCCEED;
+}