pollmng.h 4.35 KB
/**    
    @file     pollmng.c
    @date     2009/3/19
    @author   오재경 freefrug@falinux.com  FALinux.Co.,Ltd.
    @brief    poll 을 관리한다.

    @modify   2010/01/04 (오재경)  poll_obj_t 구조체에서 poll_ndx 멤버변수 제거
              2010/08/18 (장길서) mingw와 함께 사용할 수 있는 코드 추가
               
    @todo    
    @bug     
    @remark   
    
    
    @warning 
*/
//
//  저작권    에프에이리눅스(주)
//            외부공개 금지
//
//----------------------------------------------------------------------------

#ifndef _POLL_MNG_H_
#define _POLL_MNG_H_

#define EMBEDDED_LINUX

#ifdef MS_WIN32
    #undef EMBEDDED_LINUX
#endif

#define POLL_MAX_COUNT             256
#define POLL_RECURSIVE_COUNT       8


/// 관리하는 함수들의 리턴값
#define POLL_NO_DESCRIPTOR        -2
#define POLL_ASYNC_ERR            -1
#define POLL_EVENTED               0
#define POLL_TIME_OUT              1
#define POLL_RECURSIVE_LIMIT_ERR  -3
                            
/// poll 로 관리되는 파일핸들의 형태
#define STYP_NONE                   0
#define STYP_TCP                    1
#define STYP_UDP                    2
#define STYP_UDS                    3
#define STYP_UART                   4
#define STYP_FILE                   5
#define STYP_FABIND                 6
#define STYP_CAN                    7
#define STYP_TIPC                   8
#define STYP_TIPC_DGRAM             9

#ifdef EMBEDDED_LINUX

	typedef int	    fd_t;

#else

	typedef HANDLE	fd_t;

#endif

/// poll 관리 객체
typedef struct poll_obj_t_ poll_obj_t;
struct poll_obj_t_
{
	fd_t   fd;
	int    type;
	int    tag;
	void  *priv;               // tcp, udp, uds 등에서 사용되는 포인터
	void  *user;               // 사용자 포인터

#ifdef  MS_WIN32

	int     is_serial;

#endif

	int    (*on_poll_in )( poll_obj_t *obj);   
	int    (*on_poll_out)( poll_obj_t *obj);   
	int    (*on_poll_err)( poll_obj_t *obj);   
	int    (*on_poll_hup)( poll_obj_t *obj);   
	
	int    (*on_timeout )( poll_obj_t *obj);   
	int    (*on_disconnect )( poll_obj_t *obj);   // tcp 에서 소켓접속이 끊어지면 호출
};

#ifdef	MS_WIN32

	#define POLLIN		0x001		/* There is data to read.  */
	#define POLLPRI		0x002		/* There is urgent data to read.  */
	#define POLLOUT		0x004		/* Writing now will not block.  */

	#define POLLERR		0x008		/* Error condition.  */
	#define POLLHUP		0x010		/* Hung up.  */

	struct pollfd{

		fd_t 		fd;			/* File descriptor to poll.  */
    	short int 	events;		/* Types of events poller cares about.  */
    	short int 	revents;	/* Types of events that actually occurred.  */

#ifdef MS_WIN32
    	int         is_serial;
#endif

	};

#endif



#ifdef __cplusplus 
extern "C" { 
#endif 	

/// @{
/// @brief  외부에서 사용할수 있는 객체함수 리스트

void        poll_init( void );              /// poll 관리 객체를 생성한다.
void        poll_exit( void );              /// poll 관리 객체를 해제한다
void        poll_rebuild( void );           /// 리스트로 관리되는 파일디스크립터들을 폴배열에 재구성한다.
poll_obj_t *poll_add( fd_t fd );            /// poll 관리 객체에 열려진 파일 디스크립터를 등록한다.
poll_obj_t *poll_obj_byfd( fd_t fd );       /// poll 관리 객체에서 파일디스크립트로 관리하는 폴객체를 반환한다.
poll_obj_t *poll_get_obj( int idx );        /// poll 관리 객체에서 개개의 폴구조체 포인터를 얻는다.
void       *poll_get_priv( int idx  );      /// poll 관리 객체에서 사용자 포인터를 얻는다.
int         poll_count( void  );            /// 관리하는 파일의 개수
void        poll_delete( poll_obj_t *obj ); /// poll 관리 객체에서 객체의 포인터로 삭제한다.
void        poll_delete_byfd( fd_t fd );    /// poll 관리 객체에서 파일디스크립터로 삭제한다.
int         poll_do_loop( int time_out );   /// poll 이벤트 메인 루프함수
int         poll_do_one( fd_t fd, int event, int time_out ); /// poll 이벤트를 하나의 파일핸들로만 돌린다.
poll_obj_t *poll_obj_bytag( int tag );      /// poll 관리 객체에서 tag 번호로 찾아 폴객체를 반환한다.
/// @}

#ifdef __cplusplus 
}
#endif 

#endif