Blame view

app/app-prime-modbus/include/fanet/pollmng.h 4.02 KB
8c2952457   김태훈   응용 프로그램 추가
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