File:  [DragonFly] / src / sys / sys / msgport.h
Revision 1.13: download - view: text, annotated - select for diffs
Sat Mar 6 01:58:57 2004 UTC (10 years, 7 months ago) by hsu
Branches: MAIN
CVS tags: HEAD
Dispatch upper-half protocol request handling.

    1: /*
    2:  * SYS/MSGPORT.H
    3:  *
    4:  *	Implements LWKT messages and ports.
    5:  * 
    6:  * $DragonFly: src/sys/sys/msgport.h,v 1.13 2004/03/06 01:58:57 hsu Exp $
    7:  */
    8: 
    9: #ifndef _SYS_MSGPORT_H_
   10: #define _SYS_MSGPORT_H_
   11: 
   12: #ifndef _SYS_QUEUE_H_
   13: #include <sys/queue.h>		/* TAILQ_* macros */
   14: #endif
   15: #ifndef _SYS_STDINT_H_
   16: #include <sys/stdint.h>
   17: #endif
   18: 
   19: struct lwkt_msg;
   20: struct lwkt_port;
   21: struct thread;
   22: 
   23: typedef struct lwkt_msg		*lwkt_msg_t;
   24: typedef struct lwkt_port	*lwkt_port_t;
   25: 
   26: typedef TAILQ_HEAD(lwkt_msg_queue, lwkt_msg) lwkt_msg_queue;
   27: 
   28: /*
   29:  * The standard message and port structure for communications between
   30:  * threads.  See kern/lwkt_msgport.c for documentation on how messages and
   31:  * ports work.
   32:  *
   33:  * NOTE! 64-bit-align this structure.
   34:  */
   35: typedef struct lwkt_msg {
   36:     TAILQ_ENTRY(lwkt_msg) ms_node;	/* link node (not always used) */
   37:     union {
   38: 	struct lwkt_msg *ms_next;	/* chaining / cache */
   39: 	union sysunion	*ms_sysunnext;	/* chaining / cache */
   40: 	struct lwkt_msg	*ms_umsg;	/* user message (UVA address) */
   41:     } opaque;
   42:     lwkt_port_t ms_target_port;		/* current target or relay port */
   43:     lwkt_port_t	ms_reply_port;		/* asynch replies returned here */
   44:     int		ms_unused1;
   45:     int		ms_cmd;			/* message command */
   46:     int		ms_flags;		/* message flags */
   47: #define ms_copyout_start	ms_msgsize
   48:     int		ms_msgsize;		/* size of message */
   49:     int		ms_error;		/* positive error code or 0 */
   50:     union {
   51: 	void	*ms_resultp;		/* misc pointer data or result */
   52: 	int	ms_result;		/* standard 'int'eger result */
   53: 	long	ms_lresult;		/* long result */
   54: 	int	ms_fds[2];		/* two int bit results */
   55: 	__int32_t ms_result32;		/* 32 bit result */
   56: 	__int64_t ms_result64;		/* 64 bit result */
   57: 	__off_t	ms_offset;		/* off_t result */
   58:     } u;
   59: #define ms_copyout_end	ms_pad[0]
   60:     int		ms_pad[2];		/* future use */
   61: } lwkt_msg;
   62: 
   63: #define ms_copyout_size	(offsetof(struct lwkt_msg, ms_copyout_end) - offsetof(struct lwkt_msg, ms_copyout_start))
   64: 
   65: #define MSGF_DONE	0x0001		/* asynch message is complete */
   66: #define MSGF_REPLY	0x0002		/* asynch message has been returned */
   67: #define MSGF_QUEUED	0x0004		/* message has been queued sanitychk */
   68: #define MSGF_ASYNC	0x0008		/* sync/async hint */
   69: #define MSGF_ABORTED	0x0010		/* message was aborted flag */
   70: 
   71: #define MSG_CMD_CDEV	0x00010000
   72: #define MSG_CMD_VFS	0x00020000
   73: #define MSG_CMD_SYSCALL	0x00030000
   74: #define MSG_CMD_NETMSG	0x00040000
   75: #define MSG_SUBCMD_MASK	0x0000FFFF
   76: 
   77: #ifdef _KERNEL
   78: #ifdef MALLOC_DECLARE
   79: MALLOC_DECLARE(M_LWKTMSG);
   80: #endif
   81: #endif
   82: 
   83: typedef struct lwkt_port {
   84:     lwkt_msg_queue	mp_msgq;
   85:     int			mp_flags;
   86:     int			mp_refs;	/* references to port structure */
   87:     struct thread	*mp_td;
   88:     int			(*mp_putport)(lwkt_port_t, lwkt_msg_t);
   89:     void *		(*mp_waitport)(lwkt_port_t, lwkt_msg_t);
   90:     void		(*mp_replyport)(lwkt_port_t, lwkt_msg_t);
   91:     void		(*mp_abortport)(lwkt_port_t, lwkt_msg_t);
   92: } lwkt_port;
   93: 
   94: #define MSGPORTF_WAITING	0x0001
   95: 
   96: /*
   97:  * These functions are good for userland as well as the kernel.  The 
   98:  * messaging function support for userland is provided by the kernel's
   99:  * kern/lwkt_msgport.c.  The port functions are provided by userland.
  100:  */
  101: extern void lwkt_initport(lwkt_port_t, struct thread *);
  102: extern void lwkt_initmsg_td(lwkt_msg_t, struct thread *);
  103: extern void lwkt_sendmsg(lwkt_port_t, lwkt_msg_t);
  104: extern int lwkt_domsg(lwkt_port_t, lwkt_msg_t);
  105: extern void *lwkt_getport(lwkt_port_t);
  106: 
  107: #endif