summaryrefslogtreecommitdiffstats
path: root/lib/libthread_db
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2008-03-22 05:40:44 +0000
committerdavidxu <davidxu@FreeBSD.org>2008-03-22 05:40:44 +0000
commit3367c267b34ad2829e2902ae8f45beef27b57591 (patch)
treebfbdb34de01a9c74bbd17a60a23c773ab5c8aaf7 /lib/libthread_db
parent085cbdfe5d7e4a21819dfad6f4687bdad50ec2d6 (diff)
downloadFreeBSD-src-3367c267b34ad2829e2902ae8f45beef27b57591.zip
FreeBSD-src-3367c267b34ad2829e2902ae8f45beef27b57591.tar.gz
Use linker set to collection all target operations.
Diffstat (limited to 'lib/libthread_db')
-rw-r--r--lib/libthread_db/libc_r_db.c3
-rw-r--r--lib/libthread_db/libpthread_db.c3
-rw-r--r--lib/libthread_db/libthr_db.c3
-rw-r--r--lib/libthread_db/thread_db.c26
4 files changed, 22 insertions, 13 deletions
diff --git a/lib/libthread_db/libc_r_db.c b/lib/libthread_db/libc_r_db.c
index 10f7df1..f186639 100644
--- a/lib/libthread_db/libc_r_db.c
+++ b/lib/libthread_db/libc_r_db.c
@@ -28,6 +28,7 @@
__FBSDID("$FreeBSD$");
#include <machine/setjmp.h>
+#include <sys/linker_set.h>
#include <proc_service.h>
#include <stdlib.h>
#include <string.h>
@@ -346,3 +347,5 @@ struct ta_ops libc_r_db_ops = {
.to_thr_setxmmregs = libc_r_db_thr_setxmmregs,
#endif
};
+
+DATA_SET(__ta_ops, libc_r_db_ops);
diff --git a/lib/libthread_db/libpthread_db.c b/lib/libthread_db/libpthread_db.c
index 021410c..53d6abb 100644
--- a/lib/libthread_db/libpthread_db.c
+++ b/lib/libthread_db/libpthread_db.c
@@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$");
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
+#include <sys/linker_set.h>
#include <sys/kse.h>
#include <sys/ptrace.h>
#include <proc_service.h>
@@ -1147,3 +1148,5 @@ struct ta_ops libpthread_db_ops = {
.to_thr_setxmmregs = pt_thr_setxmmregs,
#endif
};
+
+DATA_SET(__ta_ops, libpthread_db_ops);
diff --git a/lib/libthread_db/libthr_db.c b/lib/libthread_db/libthr_db.c
index 148da14..07b8763 100644
--- a/lib/libthread_db/libthr_db.c
+++ b/lib/libthread_db/libthr_db.c
@@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
+#include <sys/linker_set.h>
#include <sys/ptrace.h>
#include <thread_db.h>
#include <unistd.h>
@@ -791,3 +792,5 @@ struct ta_ops libthr_db_ops = {
.to_thr_setxmmregs = pt_thr_setxmmregs,
#endif
};
+
+DATA_SET(__ta_ops, libthr_db_ops);
diff --git a/lib/libthread_db/thread_db.c b/lib/libthread_db/thread_db.c
index dc14a36..dcfde691 100644
--- a/lib/libthread_db/thread_db.c
+++ b/lib/libthread_db/thread_db.c
@@ -31,6 +31,8 @@ __FBSDID("$FreeBSD$");
#include <stddef.h>
#include <thread_db.h>
#include <unistd.h>
+#include <sys/cdefs.h>
+#include <sys/linker_set.h>
#include "thread_db_int.h"
@@ -41,24 +43,20 @@ struct td_thragent
static TAILQ_HEAD(, td_thragent) proclist = TAILQ_HEAD_INITIALIZER(proclist);
-extern struct ta_ops libpthread_db_ops;
-extern struct ta_ops libthr_db_ops;
-
-static struct ta_ops *ops[] = {
- &libpthread_db_ops,
- &libthr_db_ops,
-};
+SET_DECLARE(__ta_ops, struct ta_ops);
td_err_e
td_init(void)
{
td_err_e ret, tmp;
+ struct ta_ops *ops_p, **ops_pp;
size_t i;
ret = 0;
- for (i = 0; i < sizeof(ops)/sizeof(ops[0]); i++) {
- if (ops[i]->to_init != NULL) {
- tmp = ops[i]->to_init();
+ SET_FOREACH(ops_pp, __ta_ops) {
+ ops_p = *ops_pp;
+ if (ops_p->to_init != NULL) {
+ tmp = ops_p->to_init();
if (tmp != TD_OK)
ret = tmp;
}
@@ -107,11 +105,13 @@ td_err_e
td_ta_new(struct ps_prochandle *ph, td_thragent_t **pta)
{
size_t i;
+ struct ta_ops *ops_p, **ops_pp;
- for (i = 0; i < sizeof(ops)/sizeof(ops[0]); ++i) {
- if (ops[i]->to_ta_new(ph, pta) == TD_OK) {
+ SET_FOREACH(ops_pp, __ta_ops) {
+ ops_p = *ops_pp;
+ if (ops_p->to_ta_new(ph, pta) == TD_OK) {
TAILQ_INSERT_HEAD(&proclist, *pta, ta_next);
- (*pta)->ta_ops = ops[i];
+ (*pta)->ta_ops = ops_p;
return (TD_OK);
}
}
OpenPOWER on IntegriCloud