1 #ifndef __LWP_MESSAGES_H__
2 #define __LWP_MESSAGES_H__
3 
4 #include <gctypes.h>
5 #include <limits.h>
6 #include <string.h>
7 #include <lwp_threadq.h>
8 
9 //#define _LWPMQ_DEBUG
10 
11 #define LWP_MQ_FIFO							0
12 #define LWP_MQ_PRIORITY						1
13 
14 #define LWP_MQ_STATUS_SUCCESSFUL			0
15 #define LWP_MQ_STATUS_INVALID_SIZE			1
16 #define LWP_MQ_STATUS_TOO_MANY				2
17 #define LWP_MQ_STATUS_UNSATISFIED			3
18 #define LWP_MQ_STATUS_UNSATISFIED_NOWAIT	4
19 #define LWP_MQ_STATUS_DELETED				5
20 #define LWP_MQ_STATUS_TIMEOUT				6
21 #define LWP_MQ_STATUS_UNSATISFIED_WAIT		7
22 
23 #define LWP_MQ_SEND_REQUEST					INT_MAX
24 #define LWP_MQ_SEND_URGENT					INT_MIN
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
30 typedef void (*mq_notifyhandler)(void *);
31 
32 typedef struct _mqbuffer {
33 	u32 size;
34 	u32 buffer[1];
35 } mq_buffer;
36 
37 typedef struct _mqbuffercntrl {
38 	lwp_node node;
39 	u32 prio;
40 	mq_buffer contents;
41 } mq_buffercntrl;
42 
43 //the following struct is extensible
44 typedef struct _mqattr {
45 	u32 mode;
46 } mq_attr;
47 
48 typedef struct _mqcntrl {
49 	lwp_thrqueue wait_queue;
50 	mq_attr attr;
51 	u32 max_pendingmsgs;
52 	u32 num_pendingmsgs;
53 	u32 max_msgsize;
54 	lwp_queue pending_msgs;
55 	mq_buffer *msq_buffers;
56 	mq_notifyhandler notify_handler;
57 	void *notify_arg;
58 	lwp_queue inactive_msgs;
59 } mq_cntrl;
60 
61 u32 __lwpmq_initialize(mq_cntrl *mqueue,mq_attr *attrs,u32 max_pendingmsgs,u32 max_msgsize);
62 void __lwpmq_close(mq_cntrl *mqueue,u32 status);
63 u32 __lwpmq_seize(mq_cntrl *mqueue,u32 id,void *buffer,u32 *size,u32 wait,u64 timeout);
64 u32 __lwpmq_submit(mq_cntrl *mqueue,u32 id,void *buffer,u32 size,u32 type,u32 wait,u64 timeout);
65 u32 __lwpmq_broadcast(mq_cntrl *mqueue,void *buffer,u32 size,u32 id,u32 *count);
66 void __lwpmq_msg_insert(mq_cntrl *mqueue,mq_buffercntrl *msg,u32 type);
67 u32 __lwpmq_flush(mq_cntrl *mqueue);
68 u32 __lwpmq_flush_support(mq_cntrl *mqueue);
69 void __lwpmq_flush_waitthreads(mq_cntrl *mqueue);
70 
71 #ifdef LIBOGC_INTERNAL
72 #include <libogc/lwp_messages.inl>
73 #endif
74 
75 #ifdef __cplusplus
76 	}
77 #endif
78 
79 #endif
80