4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _SIGEV_THREAD_H
28 #define _SIGEV_THREAD_H
30 #pragma ident "%Z%%M% %I% %E% SMI"
41 #include <semaphore.h>
42 #include <thread_pool.h>
44 #define SIGEV_THREAD_TERM 1
46 typedef enum {TIMER
= 1, MQ
, AIO
} subsystem_t
; /* Calling sub-system */
49 void (*std_func
)(union sigval
); /* User-defined notification function */
50 union sigval std_arg
; /* Parameter of user-defined notification fct */
51 } sigev_thread_data_t
;
53 typedef struct thread_communication_data
{
54 struct thread_communication_data
*tcd_next
;
55 struct sigevent tcd_notif
; /* encapsulates usr fct and usr vals */
56 pthread_attr_t tcd_user_attr
; /* copy of caller's attributes */
57 pthread_attr_t
*tcd_attrp
; /* NULL if caller passed NULL */
58 int tcd_port
; /* port this spawner is controlling */
59 thread_t tcd_server_id
; /* thread id of server thread */
60 subsystem_t tcd_subsystem
; /* event generating subsystem */
61 tpool_t
*tcd_poolp
; /* worker thread pool */
62 /* for creation/termination synchronization protocol */
65 /* subsystem-specific data */
68 int overruns
; /* number of overruns */
71 int msg_enabled
; /* notification enabled */
72 int msg_closing
; /* mq_close() is waiting */
73 sem_t
*msg_avail
; /* wait for message available */
74 void *msg_object
; /* mqd_t */
75 void *msg_userval
; /* notification user value */
78 } thread_communication_data_t
;
80 #define tcd_overruns tcd_object.timer.overruns
82 #define tcd_msg_enabled tcd_object.mqueue.msg_enabled
83 #define tcd_msg_closing tcd_object.mqueue.msg_closing
84 #define tcd_msg_avail tcd_object.mqueue.msg_avail
85 #define tcd_msg_object tcd_object.mqueue.msg_object
86 #define tcd_msg_userval tcd_object.mqueue.msg_userval
88 /* Generic functions common to all entities */
89 extern thread_communication_data_t
*setup_sigev_handler(
90 const struct sigevent
*, subsystem_t
);
91 extern void free_sigev_handler(thread_communication_data_t
*);
92 extern int launch_spawner(thread_communication_data_t
*);
93 extern void tcd_teardown(thread_communication_data_t
*);
95 /* Additional functions for different entities */
96 extern void *timer_spawner(void *);
97 extern int del_sigev_timer(timer_t
);
98 extern int sigev_timer_getoverrun(timer_t
);
99 extern void *mqueue_spawner(void *);
100 extern void del_sigev_mq(thread_communication_data_t
*);
101 extern void *aio_spawner(void *);
103 /* Private interfaces elsewhere in libc */
104 extern int pthread_attr_clone(pthread_attr_t
*, const pthread_attr_t
*);
105 extern int pthread_attr_equal(const pthread_attr_t
*, const pthread_attr_t
*);
106 extern int _port_dispatch(int, int, int, int, uintptr_t, void *);
108 extern thread_communication_data_t
*sigev_aio_tcd
;
110 extern int timer_max
;
111 extern thread_communication_data_t
**timer_tcd
;
117 #endif /* _SIGEV_THREAD_H */