Module Name: src
Committed By: rmind
Date: Sat Nov 3 23:42:27 UTC 2012
Modified Files:
src/lib/libpthread: pthread.c pthread_int.h
Log Message:
libpthread: replace the use of obsolete sys/tree.h interface with rbtree(9).
To generate a diff of this commit:
cvs rdiff -u -r1.138 -r1.139 src/lib/libpthread/pthread.c
cvs rdiff -u -r1.86 -r1.87 src/lib/libpthread/pthread_int.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libpthread/pthread.c
diff -u src/lib/libpthread/pthread.c:1.138 src/lib/libpthread/pthread.c:1.139
--- src/lib/libpthread/pthread.c:1.138 Sat Nov 3 03:10:35 2012
+++ src/lib/libpthread/pthread.c Sat Nov 3 23:42:27 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread.c,v 1.138 2012/11/03 03:10:35 christos Exp $ */
+/* $NetBSD: pthread.c,v 1.139 2012/11/03 23:42:27 rmind Exp $ */
/*-
* Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread.c,v 1.138 2012/11/03 03:10:35 christos Exp $");
+__RCSID("$NetBSD: pthread.c,v 1.139 2012/11/03 23:42:27 rmind Exp $");
#define __EXPOSE_STACK 1
@@ -49,6 +49,7 @@ __RCSID("$NetBSD: pthread.c,v 1.138 2012
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#include <syslog.h>
#include <ucontext.h>
@@ -59,12 +60,16 @@ __RCSID("$NetBSD: pthread.c,v 1.138 2012
#include "pthread_int.h"
pthread_rwlock_t pthread__alltree_lock = PTHREAD_RWLOCK_INITIALIZER;
-RB_HEAD(__pthread__alltree, __pthread_st) pthread__alltree;
+static rb_tree_t pthread__alltree;
-#ifndef lint
-static int pthread__cmp(struct __pthread_st *, struct __pthread_st *);
-RB_PROTOTYPE_STATIC(__pthread__alltree, __pthread_st, pt_alltree, pthread__cmp)
-#endif
+static signed int pthread__cmp(void *, const void *, const void *);
+
+static const rb_tree_ops_t pthread__alltree_ops = {
+ .rbto_compare_nodes = pthread__cmp,
+ .rbto_compare_key = pthread__cmp,
+ .rbto_node_offset = offsetof(struct __pthread_st, pt_alltree),
+ .rbto_context = NULL
+};
static void pthread__create_tramp(void *);
static void pthread__initthread(pthread_t);
@@ -176,7 +181,8 @@ pthread__init(void)
pthread_attr_init(&pthread_default_attr);
PTQ_INIT(&pthread__allqueue);
PTQ_INIT(&pthread__deadqueue);
- RB_INIT(&pthread__alltree);
+
+ rb_tree_init(&pthread__alltree, &pthread__alltree_ops);
/* Create the thread structure corresponding to main() */
pthread__initmain(&first);
@@ -185,7 +191,7 @@ pthread__init(void)
first->pt_lid = _lwp_self();
PTQ_INSERT_HEAD(&pthread__allqueue, first, pt_allq);
- RB_INSERT(__pthread__alltree, &pthread__alltree, first);
+ (void)rb_tree_insert_node(&pthread__alltree, first);
if (_lwp_ctl(LWPCTL_FEATURE_CURCPU, &first->pt_lwpctl) != 0) {
err(1, "_lwp_ctl");
@@ -458,7 +464,7 @@ pthread_create(pthread_t *thread, const
/* Add to list of all threads. */
pthread_rwlock_wrlock(&pthread__alltree_lock);
PTQ_INSERT_TAIL(&pthread__allqueue, newthread, pt_allq);
- RB_INSERT(__pthread__alltree, &pthread__alltree, newthread);
+ (void)rb_tree_insert_node(&pthread__alltree, newthread);
pthread_rwlock_unlock(&pthread__alltree_lock);
/* Will be reset by the thread upon exit. */
@@ -933,24 +939,20 @@ pthread_testcancel(void)
/*
* POSIX requires that certain functions return an error rather than
* invoking undefined behavior even when handed completely bogus
- * pthread_t values, e.g. stack garbage or (pthread_t)666. This
- * utility routine searches the list of threads for the pthread_t
- * value without dereferencing it.
+ * pthread_t values, e.g. stack garbage.
*/
int
pthread__find(pthread_t id)
{
pthread_t target;
+ int error;
pthread_rwlock_rdlock(&pthread__alltree_lock);
- /* LINTED */
- target = RB_FIND(__pthread__alltree, &pthread__alltree, id);
+ target = rb_tree_find_node(&pthread__alltree, id);
+ error = (target && target->pt_state != PT_STATE_DEAD) ? 0 : ESRCH;
pthread_rwlock_unlock(&pthread__alltree_lock);
- if (target == NULL || target->pt_state == PT_STATE_DEAD)
- return ESRCH;
-
- return 0;
+ return error;
}
@@ -1300,20 +1302,18 @@ pthread__initmain(pthread_t *newt)
pthread__main.pt_tls->tcb_pthread = &pthread__main;
}
-#ifndef lint
-static int
-pthread__cmp(struct __pthread_st *a, struct __pthread_st *b)
+static signed int
+pthread__cmp(void *ctx, const void *n1, const void *n2)
{
+ const uintptr_t const p1 = (const uintptr_t)n1;
+ const uintptr_t const p2 = (const uintptr_t)n2;
- if ((uintptr_t)a < (uintptr_t)b)
- return (-1);
- else if (a == b)
- return 0;
- else
+ if (p1 < p2)
+ return -1;
+ if (p1 > p2)
return 1;
+ return 0;
}
-RB_GENERATE_STATIC(__pthread__alltree, __pthread_st, pt_alltree, pthread__cmp)
-#endif
/* Because getenv() wants to use locks. */
char *
Index: src/lib/libpthread/pthread_int.h
diff -u src/lib/libpthread/pthread_int.h:1.86 src/lib/libpthread/pthread_int.h:1.87
--- src/lib/libpthread/pthread_int.h:1.86 Thu Aug 16 04:49:47 2012
+++ src/lib/libpthread/pthread_int.h Sat Nov 3 23:42:27 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_int.h,v 1.86 2012/08/16 04:49:47 matt Exp $ */
+/* $NetBSD: pthread_int.h,v 1.87 2012/11/03 23:42:27 rmind Exp $ */
/*-
* Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -50,7 +50,7 @@
#include "../../common/lib/libc/atomic/atomic_op_namespace.h"
#include <sys/atomic.h>
-#include <sys/tree.h>
+#include <sys/rbtree.h>
#include <limits.h>
#include <lwp.h>
@@ -126,7 +126,7 @@ struct __pthread_st {
/* LWP ID and entry on the list of all threads. */
lwpid_t pt_lid;
- RB_ENTRY(__pthread_st) pt_alltree;
+ rb_node_t pt_alltree;
PTQ_ENTRY(__pthread_st) pt_allq;
PTQ_ENTRY(__pthread_st) pt_deadq;