/******************************************************************************** 
 | 
 *      Copyright:  (C) 2012 Guo Wenxue<guowenxue@gmail.com> 
 | 
 *                  All rights reserved. 
 | 
 * 
 | 
 *       Filename:  cp_fds.h 
 | 
 *    Description:  This head file  
 | 
 * 
 | 
 *        Version:  1.0.0(10/25/2012~) 
 | 
 *         Author:  Guo Wenxue <guowenxue@gmail.com> 
 | 
 *      ChangeLog:  1, Release initial version on "10/25/2012 04:55:37 PM" 
 | 
 *                  
 | 
 ********************************************************************************/ 
 | 
  
 | 
#ifndef __CP_FDS_H 
 | 
#define __CP_FDS_H 
 | 
  
 | 
#include <stdio.h> 
 | 
#include <unistd.h> 
 | 
#include <stdlib.h> 
 | 
#include <errno.h> 
 | 
#include <string.h> 
 | 
  
 | 
#include <sys/epoll.h> 
 | 
  
 | 
#include "cp_klist.h" 
 | 
#include "cp_logger.h" 
 | 
#include "cp_sock.h" 
 | 
#include "cp_queue.h" 
 | 
#include "cp_array.h" 
 | 
  
 | 
#define CP_MAX_EVENT_ONCE    128 
 | 
#define CP_DEF_MAX_EVENTS    1024 
 | 
#define CP_DEF_FDS_TIMEOUT   10 
 | 
  
 | 
#define IN_EVENT_LIST        0 
 | 
#define IN_TASK_LIST         1 
 | 
  
 | 
#define FLAG_FDS_INIT        (1<<0) 
 | 
#define FLAG_FDS_MALLOC      (1<<1) 
 | 
  
 | 
struct _CP_SOCK; 
 | 
struct _CP_FDS; 
 | 
  
 | 
typedef struct _CP_FDS 
 | 
{ 
 | 
    unsigned char         flag;         /* Refer to follow definition  */ 
 | 
    int                   epfd;         /* the epoll_create() returns file description */  
 | 
    int                   timeout;      /* epoll_wait timeout value  */ 
 | 
    int                   max_event;    /* Maximum monitor FD number */ 
 | 
    int                   event_cnt;    /* current socket regist in epoll */ 
 | 
  
 | 
    struct list_head      server_list;  /* a list keep all the listen sockets */  
 | 
    struct list_head      client_list;  /* a list keep all the connect sockets */  
 | 
    CP_QUEUE              *event_queue; /* a queue keep all these sockets get event happened */ 
 | 
    CP_ARRAY              *task_array;  /* an array keep all these pending/or other special task socket */  
 | 
  
 | 
  /*  flag definitions 
 | 
   *  0 0 0 0 0 1 1 1 
 | 
   *  |       | | | |______ Initial or not  - 0: No          1: Yes 
 | 
   *  |       | | |________ Malloc or not   - 0: Variable,   1: Malloc 
 | 
   *  |       | |__________ Stop or not     - 0: Not stop    1: Stop 
 | 
   *  |       |____________ Reserved 
 | 
   *  |____________________ Reserved 
 | 
   */ 
 | 
} CP_FDS; 
 | 
  
 | 
/* Initialze $fds context, if $fds is NULL, then malloc it */ 
 | 
extern CP_FDS *cp_fds_init(CP_FDS *fds, int maxevents, int timeout); 
 | 
/* Terminate $fds context, if $fds malloced, then free it */ 
 | 
extern void cp_fds_term(CP_FDS *fds); 
 | 
#define cp_fds_term_clear(fds) {cp_fds_term(fds); fds=NULL;} 
 | 
  
 | 
/* epoll_ctl() to add this socket to epoll   */ 
 | 
int cp_add_epoll_event(struct _CP_SOCK *sock); 
 | 
/* epoll_ctl() to mod this socket in epoll */ 
 | 
int cp_mod_epoll_event(struct _CP_SOCK *sock, int event); 
 | 
/* epoll_ctl() to del this socket from epoll */ 
 | 
void cp_del_epoll_event(struct _CP_SOCK *sock); 
 | 
  
 | 
  
 | 
/* add the socket into the socket registry list */  
 | 
int cp_fds_add_sock_registry(struct _CP_SOCK *sock); 
 | 
/* remove the socket from the socket registry list */  
 | 
void cp_fds_del_sock_registry(struct _CP_SOCK *sock); 
 | 
  
 | 
/* add the socket into task list */ 
 | 
int cp_fds_add_sock_task(struct _CP_SOCK *sock); 
 | 
/* remove the socket from event or task list */ 
 | 
void cp_fds_del_sock_task(struct _CP_SOCK *sock); 
 | 
/* list all the socket from task list */ 
 | 
void cp_fds_list_sock_task(CP_FDS *fds); 
 | 
  
 | 
void *cp_fds_sock_enqueue(struct _CP_SOCK *sock); 
 | 
void *cp_fds_sock_rmqueue(struct _CP_SOCK *sock); 
 | 
void *cp_fds_sock_dequeue(CP_FDS *fds); 
 | 
  
 | 
/* remove the socket from task and registry list and destroy it */ 
 | 
void cp_fds_destroy_sock(struct _CP_SOCK *sock); 
 | 
#define cp_fds_destroy_sock_clear(sock) {cp_fds_destroy_sock(sock); sock=NULL;} 
 | 
  
 | 
/* epoll_wait detect all these socket get event and add it to task list */ 
 | 
extern int cp_fds_detect_event(CP_FDS *fds); 
 | 
/* process all these socket get event and add it to task list */ 
 | 
extern void cp_fds_proc_event(CP_FDS *fds); 
 | 
/* Detect all these socket get timeout and add it to task list */ 
 | 
extern void cp_sock_detect_timeout(CP_FDS *fds); 
 | 
  
 | 
  
 | 
extern void cp_sock_term_server(struct _CP_SOCK *serv_sock); 
 | 
extern void cp_sock_term_all_server(CP_FDS *fds); 
 | 
extern void cp_sock_term_all_client(CP_FDS *fds); 
 | 
extern void cp_sock_term_all_task(CP_FDS *fds); 
 | 
  
 | 
#endif /* __CP_FDS_H */ 
 |