aboutsummaryrefslogtreecommitdiff
path: root/lib/librt/sigev_thread.h
diff options
context:
space:
mode:
authorDavid Xu <davidxu@FreeBSD.org>2006-03-07 08:28:07 +0000
committerDavid Xu <davidxu@FreeBSD.org>2006-03-07 08:28:07 +0000
commitc5a4f4eff221803d51d7ac37885386b87dcc2426 (patch)
tree32dd7b6f4eeded9a164d22570f864d7b56c28e9b /lib/librt/sigev_thread.h
parent8682859c8cbb7830c0fb8fcc7138e9d16e9830e0 (diff)
downloadsrc-c5a4f4eff221803d51d7ac37885386b87dcc2426.tar.gz
src-c5a4f4eff221803d51d7ac37885386b87dcc2426.zip
1. Always call user callback function in newly created thread, it seems
POSIX implies that the user callback function must be executed in clean environment. 2. Use newly introduced pthread stubs in libc.
Notes
Notes: svn path=/head/; revision=156383
Diffstat (limited to 'lib/librt/sigev_thread.h')
-rw-r--r--lib/librt/sigev_thread.h38
1 files changed, 11 insertions, 27 deletions
diff --git a/lib/librt/sigev_thread.h b/lib/librt/sigev_thread.h
index 89512f985591..7e30c2a16fd5 100644
--- a/lib/librt/sigev_thread.h
+++ b/lib/librt/sigev_thread.h
@@ -32,9 +32,8 @@
#include <sys/types.h>
#include <sys/queue.h>
-#include <setjmp.h>
-struct sigev_thread_node;
+struct sigev_thread;
struct sigev_node;
typedef uintptr_t sigev_id_t;
@@ -42,8 +41,6 @@ typedef void (*sigev_dispatch_t)(struct sigev_node *);
struct sigev_node {
LIST_ENTRY(sigev_node) sn_link;
- LIST_ENTRY(sigev_node) sn_allist;
- TAILQ_ENTRY(sigev_node) sn_actq;
int sn_type;
sigev_id_t sn_id;
sigev_dispatch_t sn_dispatch;
@@ -51,51 +48,38 @@ struct sigev_node {
void *sn_func;
int sn_flags;
int sn_gen;
- int sn_usethreadpool;
siginfo_t sn_info;
- struct sigev_thread_node * sn_tn;
+ pthread_attr_t sn_attr;
+ struct sigev_thread *sn_tn;
};
-struct sigev_thread_attr {
- int sna_policy;
- int sna_inherit;
- int sna_prio;
- size_t sna_stacksize;
- void *sna_stackaddr;
- size_t sna_guardsize;
-};
-struct sigev_thread_node {
- TAILQ_ENTRY(sigev_thread_node) tn_link;
+struct sigev_thread {
+ LIST_ENTRY(sigev_thread) tn_link;
pthread_t tn_thread;
struct sigev_node *tn_cur;
- struct sigev_thread_attr tn_sna;
int tn_refcount;
long tn_lwpid;
- jmp_buf tn_jbuf;
+ pthread_cond_t tn_cv;
};
#define SNF_WORKING 0x01
#define SNF_REMOVED 0x02
-#define SNF_ONESHOT 0x04
-#define SNF_ACTQ 0x08
-#define SNF_THREADPOOL 0x10
+#define SNF_SYNC 0x04
-#define SIGEV_SIGSERVICE (SIGTHR+1)
+#define SIGSERVICE (SIGTHR+1)
int __sigev_check_init();
struct sigev_node *__sigev_alloc(int, const struct sigevent *,
- struct sigev_node *, int usethreadpool);
+ struct sigev_node *, int);
struct sigev_node *__sigev_find(int, sigev_id_t);
void __sigev_get_sigevent(struct sigev_node *, struct sigevent *,
sigev_id_t);
int __sigev_register(struct sigev_node *);
int __sigev_delete(int, sigev_id_t);
int __sigev_delete_node(struct sigev_node *);
-int __sigev_list_lock(void);
-int __sigev_list_unlock(void);
-int __sigev_thread_list_lock(void);
-int __sigev_thread_list_unlock(void);
+void __sigev_list_lock(void);
+void __sigev_list_unlock(void);
void __sigev_free(struct sigev_node *);
#endif