Files
QNX/lib/c/dispatch/dispatch.h
2025-08-20 19:02:58 +08:00

204 lines
5.6 KiB
C

/*
* $QNXLicenseC:
* Copyright 2007, QNX Software Systems. All Rights Reserved.
*
* You must obtain a written license from and pay applicable license fees to QNX
* Software Systems before you may reproduce, modify or distribute this software,
* or any work that includes all or part of this software. Free development
* licenses are available for evaluation and non-commercial purposes. For more
* information visit http://licensing.qnx.com or email licensing@qnx.com.
*
* This file may contain contributions from others. Please review this entire
* file for other proprietary rights or license notices, as well as the QNX
* Development Suite License Guide at http://licensing.qnx.com/license-guide/
* for other information.
* $
*/
/*
* Internal definitions for the dispatch interface
*/
#define _DISPATCH_BLOCK_RECEIVE 1
#define _DISPATCH_BLOCK_SIGWAIT 2
#define _DISPATCH_BLOCK_TIMEOUT 3
#define _DPP(dpp) ((dispatch_t *)dpp)
/*
* Special-case flags
*/
#define _DISPATCH_ONLY_RESMGR 0x00000001
#define _DISPATCH_ONLY_SELECT 0x00000002
#define _DISPATCH_TIMEOUT 0x00000004
#define _VEC_VALID 0x80000000
/*
* Select interface
*/
#define SEL_REARM_ALL (-1)
#define _SELECT_ARMED 0x00010000
#define _SELECT_INVALID 0x00020000
#define _SELECT_EVENT 0x00040000
#define _SELECT_FLAG_NOREARM 0x00080000
#define _SELECT_ARM_FIRST 0x00100000
#define _SELECT_READ_EVENT (SELECT_FLAG_READ >> 4)
#define _SELECT_WRITE_EVENT (SELECT_FLAG_WRITE >> 4)
#define _SELECT_EXCEPT_EVENT (SELECT_FLAG_EXCEPT >> 4)
#define _SELECT_EVENT_MASK (_NOTIFY_COND_MASK >> 4)
#define _SELECT_SN_MASK 0x00000fff
#define _SELECT_SRVEXCEPT 0x08000000
#define _SELECT_SIGEV(index,sn) (index | (sn & _SELECT_SN_MASK) << 16)
#define _SELECT_SIGEV_SN(sigev) (_SELECT_SN_MASK & (sigev >> 16))
#define _SELECT_SIGEV_INDEX(sigev) (sigev & 0xffff)
typedef struct {
void *select_vec;
int num_elements;
int num_entries;
unsigned context_size;
unsigned msg_max_size;
pthread_mutex_t mutex;
int coid;
int code;
unsigned sernum;
unsigned flags;
dispatch_context_t *(*rearm_func)(dispatch_context_t *);
} _select_control;
typedef struct _select_vec {
unsigned flags;
int fd;
int (*func)(select_context_t *ctp, int fd, unsigned flags, void *handle);
void *handle;
} select_vec_t;
void _select_disarm(dispatch_t *dpp, int fd);
int _select_msg_handler(message_context_t *ctp, int code, unsigned flags, void *handle);
dispatch_context_t *_select_rearm_all(dispatch_context_t *ctp);
dispatch_context_t *_select_rearm_how(dispatch_context_t *ctp, int fd);
int _select_query(select_context_t *ctp, int *fd, unsigned *flags,
int (**func)(select_context_t *ctp, int fd, unsigned flags, void *handle),
void **handle, unsigned clear_event);
/*
* Resmgr interface
*/
#define _RESMGR_CROSS_ENDIAN RESMGR_FLAG_CROSS_ENDIAN
typedef struct {
int (*other_func)(resmgr_context_t *ctp, void *msg);
unsigned nparts_max;
unsigned msg_max_size;
unsigned context_size;
pthread_mutex_t mutex;
unsigned flags;
} _resmgr_control;
int _resmgr_msg_handler(message_context_t *ctp, int code, unsigned flags, void *handle);
int _resmgr_default_handler(message_context_t *ctp, int code, unsigned flags, void *handle);
/*
* Message interface
*/
#define _MESSAGE_RESMGR_ENTRY MSG_FLAG_TYPE_RESMGR
#define _MESSAGE_SELECT_ENTRY MSG_FLAG_TYPE_SELECT
#define _MESSAGE_PULSE_ENTRY MSG_FLAG_TYPE_PULSE
#define _MESSAGE_DEFAULT_ENTRY MSG_FLAG_DEFAULT_FUNC
#define _MESSAGE_CROSS_ENDIAN MSG_FLAG_CROSS_ENDIAN
typedef struct {
void *message_vec;
int num_elements;
int num_entries;
unsigned context_size;
unsigned msg_max_size;
unsigned nparts_max;
pthread_mutex_t mutex;
unsigned reserved; // flags;
} _message_control;
typedef struct _message_vec {
unsigned flags;
short lo; /* Stay unsigned, see message.c */
short high;
int (*func)(message_context_t *ctp, int code, unsigned flags, void *handle);
void *handle;
} message_vec_t;
int _message_handler(dispatch_context_t *ctp);
void _message_unblock(dispatch_context_t *ctp);
/*
* Sigwait interface
*/
#define _SIGWAIT_SIGNAL_ENTRY 0x00000001
#define _SIGWAIT_SELECT_ENTRY 0x00000002
typedef struct {
void *sigwait_vec;
int num_elements;
int num_entries;
unsigned context_size;
pthread_mutex_t mutex;
} _sigwait_control;
typedef struct _sigwait_vec {
unsigned flags;
unsigned signo;
int (*func)(sigwait_context_t *ctp, int signo, int flags, void *handle);
void *handle;
} sigwait_vec_t;
int _sigwait_handler(dispatch_context_t *ctp);
/*
* Vector "helper" functions
*/
void *_dispatch_vector_find(void *vec, int num);
void *_dispatch_vector_grow(void *vec, int new_num);
/*
* Dispatch internal structures
*/
int _dispatch_attach(dispatch_t *dpp, void *ctrl, unsigned type);
int _dispatch_set_contextsize(dispatch_t *dpp, unsigned type);
#define _DISPATCH_CHANNEL_COIDDEATH 0x40000000
#define _DISPATCH_CONTEXT_ALLOCED 0x80000000
struct _dispatch {
//enum dispatch_type type;
int (*other_func)(resmgr_context_t *ctp, void *msg);
unsigned nparts_max;
unsigned msg_max_size;
int block_type;
struct timespec timeout;
unsigned int flags;
int chid;
unsigned int context_size;
_resmgr_control *resmgr_ctrl;
_message_control *message_ctrl;
_select_control *select_ctrl;
_sigwait_control *sigwait_ctrl;
};
struct _pool_properties {
pthread_mutex_t inline_lock;
unsigned newthreads;
unsigned reserved_threads;
};
/* __SRCVERSION("dispatch.h $Rev: 153264 $"); */