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