da_conn.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /*
  2. * da_conn.h
  3. *
  4. * Created on: 2014Äê11ÔÂ30ÈÕ
  5. * Author: Jiansong
  6. */
  7. #ifndef DA_CONN_H_
  8. #define DA_CONN_H_
  9. #include <sys/socket.h>
  10. #include <stdint.h>
  11. #include <stdbool.h>
  12. #include "da_queue.h"
  13. #include "da_rbtree.h"
  14. #include "compiler.h"
  15. #include "da_util.h"
  16. #include "da_msg.h"
  17. #include "da_errno.h"
  18. struct conn;
  19. struct context;
  20. struct msg;
  21. //connection type
  22. #define FRONTWORK 0x0001
  23. #define BACKWORK 0x0002
  24. #define LISTENER 0x0004
  25. //connection epoll flag
  26. #define RECV_ACTIVE 0x0001
  27. #define SEND_ACTIVE 0x0002
  28. #define RECV_READY 0x0004
  29. #define SEND_READY 0x0008
  30. typedef int (*conn_recv_t)(struct context *, struct conn*);
  31. typedef struct msg* (*conn_recv_next_t)(struct context *, struct conn *, bool);
  32. typedef void (*conn_recv_done_t)(struct context *, struct conn *, struct msg *,struct msg *);
  33. typedef int (*conn_send_t)(struct context *, struct conn*);
  34. typedef struct msg* (*conn_send_next_t)(struct context *, struct conn *);
  35. typedef void (*conn_send_done_t)(struct context *, struct conn *, struct msg *);
  36. typedef void (*conn_close_t)(struct context *, struct conn *);
  37. typedef int (*conn_active_t)(struct conn *);
  38. typedef void (*conn_ref_t)(struct conn *, void *);
  39. typedef void (*conn_unref_t)(struct conn *);
  40. typedef void (*conn_msgq_t)(struct context *, struct conn *, struct msg *);
  41. typedef void (*conn_msgtree_t)(struct context *, struct conn *, struct msg *);
  42. struct conn {
  43. TAILQ_ENTRY(conn) conn_tqe; /*list linked in server or server pool*/
  44. void *owner; /*owner server server_pool*/
  45. int fd; /*socket fd*/
  46. int family; /*socket family*/
  47. socklen_t addrlen; /*socket addr len*/
  48. struct sockaddr *addr; /*socket address (ref in server)*/
  49. uint32_t type; /*front conn,back conn,or listener*/
  50. uint32_t events; /*the event need process*/
  51. uint32_t flag; /*epool flag*/
  52. struct rbtree msg_tree; /*tree for message search*/
  53. struct rbnode msg_rbs; /*sentinel for msg_tree */
  54. struct msg_tqh imsg_q; /*request msgq */
  55. struct msg_tqh omsg_q; /*outstanding request Q */
  56. struct msg *rmsg; /* current message being rcvd */
  57. struct msg *smsg; /* current message being sent */
  58. conn_recv_t recv; /* recv (read) handler */
  59. conn_recv_next_t recv_next; /* recv next message handler */
  60. conn_recv_done_t recv_done; /* read done handler */
  61. conn_send_t send; /* send (write) handler */
  62. conn_send_next_t send_next; /* write next message handler */
  63. conn_send_done_t send_done; /* write done handler */
  64. conn_close_t close; /* close handler */
  65. conn_active_t active; /* active? handler */
  66. conn_ref_t ref; /* connection reference handler */
  67. conn_unref_t unref; /* connection unreference handler */
  68. conn_msgq_t enqueue_outq; /* connection outq msg enqueue handler */
  69. conn_msgq_t dequeue_outq; /* connection outq msg dequeue handler */
  70. conn_msgq_t enqueue_inq; /* connection outq msg enqueue handler */
  71. conn_msgq_t dequeue_inq; /* connection outq msg dequeue handler */
  72. conn_msgtree_t en_msgtree; /* connection msg tree entree handler*/
  73. conn_msgtree_t de_msgtree; /* connection msg tree detree handler*/
  74. size_t recv_bytes; /* received (read) bytes */
  75. size_t send_bytes; /* sent (written) bytes */
  76. int err ; /*connection error no*/
  77. unsigned error :1; /*connetion err sig*/
  78. unsigned connecting :1; /*connecting is on*/
  79. unsigned connected :1; /*connected*/
  80. unsigned eof:1; /*connection is end,half connection*/
  81. unsigned done :1; /*connection is done*/
  82. unsigned writecached:1;
  83. unsigned isvalid:1;
  84. };
  85. TAILQ_HEAD(conn_tqh, conn);
  86. /*
  87. * init the pool2_conn
  88. */
  89. int conn_init();
  90. /*
  91. * deinit conn pool
  92. */
  93. int conn_deinit();
  94. /*
  95. * put conn back to pool
  96. */
  97. void conn_put(struct conn *c);
  98. /*
  99. *get listener from conn pool
  100. */
  101. struct conn *get_listener(void *owner);
  102. /*
  103. *get client conn
  104. */
  105. struct conn *get_client_conn(void *owner);
  106. /*
  107. *get server conn
  108. */
  109. struct conn *get_server_conn(void *owner);
  110. /*
  111. *get instance conn
  112. */
  113. struct conn *get_instance_conn(void *owner);
  114. /*
  115. * get number of total conn
  116. */
  117. uint64_t get_ntotal_conn();
  118. /*
  119. * get number of current conn
  120. */
  121. uint32_t get_ncurr_conn();
  122. /*
  123. *get number of current client conn
  124. */
  125. uint32_t get_ncurr_cconn();
  126. /*recv data from fd*/
  127. ssize_t conn_recv(struct conn *conn, void *buf, size_t size);
  128. /* send data to fd*/
  129. ssize_t conn_sendv(struct conn *conn, struct array *sendv, size_t nsend);
  130. struct context *conn_to_ctx(struct conn *conn);
  131. #endif /* DA_CONN_H_ */