xref: /illumos-gate/usr/src/lib/libc/port/rt/sigev_thread.h (revision 1da57d551424de5a9d469760be7c4b4d4f10a755)
1f841f6adSraf /*
2f841f6adSraf  * CDDL HEADER START
3f841f6adSraf  *
4f841f6adSraf  * The contents of this file are subject to the terms of the
5f841f6adSraf  * Common Development and Distribution License (the "License").
6f841f6adSraf  * You may not use this file except in compliance with the License.
7f841f6adSraf  *
8f841f6adSraf  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9f841f6adSraf  * or http://www.opensolaris.org/os/licensing.
10f841f6adSraf  * See the License for the specific language governing permissions
11f841f6adSraf  * and limitations under the License.
12f841f6adSraf  *
13f841f6adSraf  * When distributing Covered Code, include this CDDL HEADER in each
14f841f6adSraf  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15f841f6adSraf  * If applicable, add the following below this CDDL HEADER, with the
16f841f6adSraf  * fields enclosed by brackets "[]" replaced with your own identifying
17f841f6adSraf  * information: Portions Copyright [yyyy] [name of copyright owner]
18f841f6adSraf  *
19f841f6adSraf  * CDDL HEADER END
20f841f6adSraf  */
21f841f6adSraf 
22f841f6adSraf /*
23*7257d1b4Sraf  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24f841f6adSraf  * Use is subject to license terms.
25f841f6adSraf  */
26f841f6adSraf 
27f841f6adSraf #ifndef	_SIGEV_THREAD_H
28f841f6adSraf #define	_SIGEV_THREAD_H
29f841f6adSraf 
30f841f6adSraf #ifdef	__cplusplus
31f841f6adSraf extern "C" {
32f841f6adSraf #endif
33f841f6adSraf 
34f841f6adSraf #include <signal.h>
35f841f6adSraf #include <port.h>
36f841f6adSraf #include <mqueue.h>
37f841f6adSraf #include <time.h>
38f841f6adSraf #include <limits.h>
39f841f6adSraf #include <semaphore.h>
40f841f6adSraf #include <thread_pool.h>
41f841f6adSraf 
42f841f6adSraf #define	SIGEV_THREAD_TERM	1
43f841f6adSraf 
44f841f6adSraf typedef enum {TIMER = 1, MQ, AIO} subsystem_t;	/* Calling sub-system */
45f841f6adSraf 
46f841f6adSraf typedef struct {
47f841f6adSraf 	void (*std_func)(union sigval);	/* User-defined notification function */
48f841f6adSraf 	union sigval std_arg;	/* Parameter of user-defined notification fct */
49f841f6adSraf } sigev_thread_data_t;
50f841f6adSraf 
51f841f6adSraf typedef struct thread_communication_data {
52f841f6adSraf 	struct thread_communication_data *tcd_next;
53f841f6adSraf 	struct sigevent	tcd_notif;	/* encapsulates usr fct and usr vals */
54f841f6adSraf 	pthread_attr_t	tcd_user_attr;	/* copy of caller's attributes */
55f841f6adSraf 	pthread_attr_t	*tcd_attrp;	/* NULL if caller passed NULL */
56f841f6adSraf 	int		tcd_port;	/* port this spawner is controlling */
57f841f6adSraf 	thread_t	tcd_server_id;	/* thread id of server thread */
58f841f6adSraf 	subsystem_t	tcd_subsystem;	/* event generating subsystem */
59f841f6adSraf 	tpool_t		*tcd_poolp;	/* worker thread pool */
60f841f6adSraf 	/* for creation/termination synchronization protocol */
61f841f6adSraf 	mutex_t		tcd_lock;
62f841f6adSraf 	cond_t		tcd_cv;
63f841f6adSraf 	/* subsystem-specific data */
64f841f6adSraf 	union {
65f841f6adSraf 		struct {
66f841f6adSraf 			int	overruns;	/* number of overruns */
67f841f6adSraf 		} timer;
68f841f6adSraf 		struct {
69f841f6adSraf 			int	msg_enabled;	/* notification enabled */
70f841f6adSraf 			int	msg_closing;	/* mq_close() is waiting */
71f841f6adSraf 			sem_t	*msg_avail;	/* wait for message available */
72f841f6adSraf 			void	*msg_object;	/* mqd_t */
73f841f6adSraf 			void	*msg_userval;	/* notification user value */
74f841f6adSraf 		} mqueue;
75f841f6adSraf 	} tcd_object;
76f841f6adSraf } thread_communication_data_t;
77f841f6adSraf 
78f841f6adSraf #define	tcd_overruns	tcd_object.timer.overruns
79f841f6adSraf 
80f841f6adSraf #define	tcd_msg_enabled	tcd_object.mqueue.msg_enabled
81f841f6adSraf #define	tcd_msg_closing	tcd_object.mqueue.msg_closing
82f841f6adSraf #define	tcd_msg_avail	tcd_object.mqueue.msg_avail
83f841f6adSraf #define	tcd_msg_object	tcd_object.mqueue.msg_object
84f841f6adSraf #define	tcd_msg_userval	tcd_object.mqueue.msg_userval
85f841f6adSraf 
86f841f6adSraf /* Generic functions common to all entities */
87f841f6adSraf extern thread_communication_data_t *setup_sigev_handler(
88f841f6adSraf 		const struct sigevent *, subsystem_t);
89f841f6adSraf extern void free_sigev_handler(thread_communication_data_t *);
90f841f6adSraf extern int launch_spawner(thread_communication_data_t *);
91f841f6adSraf extern void tcd_teardown(thread_communication_data_t *);
92f841f6adSraf 
93f841f6adSraf /* Additional functions for different entities */
94f841f6adSraf extern void *timer_spawner(void *);
95f841f6adSraf extern int del_sigev_timer(timer_t);
96f841f6adSraf extern int sigev_timer_getoverrun(timer_t);
97f841f6adSraf extern void *mqueue_spawner(void *);
98f841f6adSraf extern void del_sigev_mq(thread_communication_data_t *);
99f841f6adSraf extern void *aio_spawner(void *);
100f841f6adSraf 
101f841f6adSraf /* Private interfaces elsewhere in libc */
102*7257d1b4Sraf extern int pthread_attr_clone(pthread_attr_t *, const pthread_attr_t *);
103*7257d1b4Sraf extern int pthread_attr_equal(const pthread_attr_t *, const pthread_attr_t *);
104f841f6adSraf extern int _port_dispatch(int, int, int, int, uintptr_t, void *);
105f841f6adSraf 
106f841f6adSraf extern thread_communication_data_t *sigev_aio_tcd;
107f841f6adSraf 
108f841f6adSraf extern int timer_max;
109f841f6adSraf extern thread_communication_data_t **timer_tcd;
110f841f6adSraf 
111f841f6adSraf #ifdef	__cplusplus
112f841f6adSraf }
113f841f6adSraf #endif
114f841f6adSraf 
115f841f6adSraf #endif	/* _SIGEV_THREAD_H */
116