pollmng.h
4.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/**
@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