/** @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