/*
 *	mqueue.h
 *
 *	POSIX Message Queue for Windows NT
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016 Naoyuki Sawa
 *
 *	* Fri Mar 18 21:34:32 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 *	  pthreads-win32にはPOSIX Message Queueが含まれていないので、追加する事にしました。
 *	  このモジュールはWin32専用です。P/ECEでは使用出来ません。	←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←注意
 *	- 以下の実装を参考にさせて頂き、より簡略化した実装にしました。
 *	  □参考資料
 *	  │「POSIX Message Queues for Win32!」(https://sourceware.org/ml/pthreads-win32/2000/msg00131.html)
 *	  主に簡略化した点は、以下の通りです。
 *	  ・オリジナル版の実装は、プロセス間でメッセージの送受信が行えるように、共有メモリを使って実装されていました。
 *	    当実装は、プロセス内のスレッド間でメッセージの送受信が行えれば充分なので、普通のメモリ確保を使用しました。
 *	  ・当実装はプロセス間通信をサポートしないので、メッセージキューの名前は無意味になり、当実装はmq_open()のname引数,及び,mode引数を無視します。
 *	    それに伴って、mq_unlink()も、何もしないダミー関数としました。
 *	  ・オリジナル版の実装は、本来の関数仕様通りに、エラーが発生した時は、エラーコードを返すようになっていました。
 *	    当実装は、エラーが発生した時に、'DIE()'で停止するようにしました。
 *	  ・mq_notify()は未対応であり、呼び出すとエラー停止します。
 *	    mq_notify()が未対応である事は、オリジナル版の実装も同じです。
 *	- 関数仕様については、以下の資料を参照しました。
 *	  □参照資料
 *	  │「Linux Programmer's Manual - MQ_OVERVIEW」(https://linuxjm.osdn.jp/html/LDP_man-pages/man7/mq_overview.7.html)
 *	  │及び、上記のページからリンクされている、各関数の説明のページ
 *	* Sat Mar 19 21:19:21 JST 2016 Naoyuki Sawa
 *	- /clip/include/sys/types.h(又は/clip/clipstdw.h)にssize_tの定義を追加した事に伴い、これまでssize_tの代りにintを使っていた部分を正式なssize_tに修正しました。
 *	  2016/03/19時点でint⇒ssize_tに修正した箇所は、getline(),getdelim(),mq_receive()です。
 */
#ifndef __mqueue_h
#define __mqueue_h
#ifdef	__cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	
 ****************************************************************************/
#ifndef O_NONBLOCK
#define O_NONBLOCK	04000		//「Linux Kernel History - Linux 0.01 - root/include/fcntl.h」(http://kernelhistory.sourcentral.org/linux-0.01/S/11.html)の値に倣う事にしました。
#endif//O_NONBLOCK
/****************************************************************************
 *	
 ****************************************************************************/
typedef struct mq_hdr*	mqd_t;		//opaque datatype
/*--------------------------------------------------------------------------*/
struct mq_attr {
	long		mq_flags;	//フラグ: 0かO_NONBLOCK
	long		mq_maxmsg;	//キューの最大メッセージ数
	long		mq_msgsize;	//最大メッセージサイズ(バイト単位)
	long		mq_curmsgs;	//キューに現在入っているメッセージ数
};
/****************************************************************************
 *	
 ****************************************************************************/
mqd_t mq_open(const char* name, int oflag, .../*mode_t mode, struct mq_attr* attr*/);
int mq_close(mqd_t mqdes);
int mq_unlink(const char* name);
int mq_send(mqd_t mqdes, const char* msg_ptr, size_t msg_len, unsigned msg_prio);
ssize_t mq_receive(mqd_t mqdes, char* msg_ptr, size_t msg_len, unsigned* msg_prio);
int mq_notify(mqd_t mqdes, const struct sigevent* notification);
int mq_setattr(mqd_t mqdes, const struct mq_attr* newattr, struct mq_attr* oldattr);
int mq_getattr(mqd_t mqdes, struct mq_attr* attr);
#ifdef	__cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__mqueue_h
