|
@@ -153,15 +153,6 @@ static void event_epoll_interest_unlock(event_epoll_interest_t *interest)
|
|
|
spinlock_leave(&interest->lock);
|
|
|
}
|
|
|
|
|
|
-//static void __interest_destroy(event_epoll_interest_t *interest)
|
|
|
-//{
|
|
|
-// assert(list_empty(&interest->entry_list));
|
|
|
-// array_free(interest->arr_ov);
|
|
|
-// free(interest);
|
|
|
-//}
|
|
|
-//
|
|
|
-//IMPLEMENT_REF_COUNT_MT(evtpoll_interest, event_epoll_interest_t, ref_cnt, __interest_destroy)
|
|
|
-
|
|
|
|
|
|
static void evtpoll_interest_enqueue(event_epoll_interest_t *interest, event_epoll_interest_entry *entry, int fifo)
|
|
|
{
|
|
@@ -186,219 +177,6 @@ static event_epoll_interest_entry *evtpoll_interest_dequeue(event_epoll_interest
|
|
|
return interest_entry;
|
|
|
}
|
|
|
|
|
|
-static __inline void add_interest_list(event_epoll_interest_t *interest_ctx, event_epoll_t *ep)
|
|
|
-{
|
|
|
- spinlock_enter(&ep->interest_list_lock, -1);
|
|
|
- list_add(&interest_ctx->node, &ep->interest_list);
|
|
|
- spinlock_leave(&ep->interest_list_lock);
|
|
|
-}
|
|
|
-
|
|
|
-static __inline void del_interest_list(event_epoll_interest_t *interest_ctx, event_epoll_t *ep)
|
|
|
-{
|
|
|
- spinlock_enter(&ep->interest_list_lock, -1);
|
|
|
- list_del(&interest_ctx->node);
|
|
|
- interest_ctx->node.next = interest_ctx->node.prev = NULL;
|
|
|
- spinlock_leave(&ep->interest_list_lock);
|
|
|
-}
|
|
|
-
|
|
|
-static void event_poll_interest_free(event_epoll_interest_t* interest)
|
|
|
-{
|
|
|
- assert(interest);
|
|
|
- assert(interest->owner);
|
|
|
- del_interest_list(interest, interest->owner);
|
|
|
-}
|
|
|
-
|
|
|
-static void event_poll_interest_clear(event_epoll_t* ep)
|
|
|
-{
|
|
|
- struct list_head *pos;
|
|
|
- struct list_head *tmp;
|
|
|
- if(list_empty(&ep->interest_list))
|
|
|
- return;
|
|
|
- spinlock_enter(&ep->interest_list_lock, -1);
|
|
|
- list_for_each_safe(pos, tmp, &ep->interest_list) {
|
|
|
- event_epoll_interest_t *node = list_entry(pos, event_epoll_interest_t, node);
|
|
|
- list_del(pos);
|
|
|
- evtpoll_interest_destroy(node);
|
|
|
- }
|
|
|
- spinlock_leave(&ep->interest_list_lock);
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-static event_epoll_interest_t* event_poll_find_interest(event_epoll_t* ep, int unique_identifier)
|
|
|
-{
|
|
|
- struct list_head *pos;
|
|
|
- struct list_head *tmp;
|
|
|
- if(list_empty(&ep->interest_list))
|
|
|
- return NULL;
|
|
|
- list_for_each_safe(pos, tmp, &ep->interest_list) {
|
|
|
- event_epoll_interest_t *node = list_entry(pos, event_epoll_interest_t, node);
|
|
|
- if(node->fd == unique_identifier)
|
|
|
- return node;
|
|
|
- }
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
-TOOLKIT_API event_epoll_t *evtpoll_create()
|
|
|
-{
|
|
|
- event_epoll_t *evtpoll = ZALLOC_T(event_epoll_t);
|
|
|
- if (!evtpoll)
|
|
|
- return NULL;
|
|
|
- /*since Linux 2.6.8 the argument is ignored but must be g0 for compatibility, bcz kernel would allocate space dynamically.*/
|
|
|
- evtpoll->epfd = epoll_create(MAX_EPOLL_EVENT);
|
|
|
- if(evtpoll->epfd == -1) {
|
|
|
- WLog_ERR(TAG, "create epoll handle failed, err: %d", errno);
|
|
|
- goto on_error_1;
|
|
|
- }
|
|
|
- evtpoll->events = 0;
|
|
|
- evtpoll->interest_count = 0;
|
|
|
- evtpoll->owner = NULL;
|
|
|
- evtpoll->user_data = NULL;
|
|
|
- spinlock_init(&evtpoll->interest_list_lock);
|
|
|
- INIT_LIST_HEAD(&evtpoll->interest_list);
|
|
|
-
|
|
|
- return evtpoll;
|
|
|
-
|
|
|
-on_error_1:
|
|
|
- free(evtpoll);
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
-TOOLKIT_API void evtpoll_destroy(event_epoll_t *evt_poll)
|
|
|
-{
|
|
|
- assert(evt_poll);
|
|
|
- event_poll_interest_clear(evt_poll);
|
|
|
- assert(evtpoll_interest_empty(evt_poll));
|
|
|
- close(evt_poll->epfd);
|
|
|
- free(evt_poll);
|
|
|
-}
|
|
|
-
|
|
|
-TOOLKIT_API int evtpoll_interest_empty(event_epoll_t *evt_poll)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- assert(evt_poll);
|
|
|
- spinlock_enter(&evt_poll->interest_list_lock, -1);
|
|
|
- ret = list_empty(&evt_poll->interest_list);
|
|
|
- spinlock_leave(&evt_poll->interest_list_lock);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-static __inline int evtpoll_register_interest_inst(event_epoll_t* evtpoll, event_epoll_interest_t* interest)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- ret = -1;
|
|
|
- assert(evtpoll);
|
|
|
- assert(interest);
|
|
|
- event_epoll_interest_t *exist;
|
|
|
- exist = event_poll_find_interest(evtpoll, interest->fd);
|
|
|
- assert(!exist);
|
|
|
-#if 1
|
|
|
- //注册后不立即进行监听
|
|
|
- ret = 0;
|
|
|
-#else
|
|
|
- ret = evtpoll_ctl(evtpoll, EV_READ_WRITE_WITH_LT_FULL, EPOLL_CTL_ADD, interest->fd, NULL);
|
|
|
- if(ret)
|
|
|
- return ret;
|
|
|
-#endif
|
|
|
- add_interest_list(interest, evtpoll);
|
|
|
-#if 1
|
|
|
- exist = event_poll_find_interest(evtpoll, interest->fd);
|
|
|
- assert(exist);
|
|
|
- assert(exist == interest);
|
|
|
-#endif
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-static __inline int evtpoll_unregister_interest_inst(event_epoll_t* evtpoll, int interest_fd)
|
|
|
-{
|
|
|
- int ret = 0;
|
|
|
- event_epoll_interest_t *exist;
|
|
|
- exist = event_poll_find_interest(evtpoll, interest_fd);
|
|
|
- if(exist) {
|
|
|
- event_poll_interest_free(exist);
|
|
|
-#if 1
|
|
|
- exist = event_poll_find_interest(evtpoll, interest_fd);
|
|
|
- assert(!exist);
|
|
|
-#endif
|
|
|
- evtpoll_interest_destroy(exist);
|
|
|
- }
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-TOOLKIT_API int evtpoll_get_raw_fd(event_epoll_t *evt_poll)
|
|
|
-{
|
|
|
- assert(evt_poll);
|
|
|
- return evt_poll->epfd;
|
|
|
-}
|
|
|
-
|
|
|
-TOOLKIT_API int evtpoll_attach(event_epoll_t *evt_poll, int interest_fd)
|
|
|
-{
|
|
|
- int ret = 0;
|
|
|
- assert(evt_poll);
|
|
|
- assert(interest_fd > 0);
|
|
|
- event_epoll_interest_t *exist;
|
|
|
- exist = event_poll_find_interest(evt_poll, interest_fd);
|
|
|
- if(exist) {
|
|
|
- return 1;
|
|
|
- }
|
|
|
- exist = evtpoll_interest_create(interest_fd);
|
|
|
- if(!exist) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- exist->owner = evt_poll;
|
|
|
-
|
|
|
- ret = evtpoll_register_interest_inst(evt_poll, exist);
|
|
|
- if(ret) {
|
|
|
- evtpoll_interest_destroy(exist);
|
|
|
- }
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-TOOLKIT_API int evtpoll_detach(event_epoll_t *evt_poll, int interest_fd)
|
|
|
-{
|
|
|
- return evtpoll_unregister_interest_inst(evt_poll, interest_fd);
|
|
|
-}
|
|
|
-
|
|
|
-TOOLKIT_API int evtpoll_ctl(event_epoll_t* evtpoll, int event_mask, int ctrl_mod, int fd, void* data)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- struct epoll_event ee;
|
|
|
- ret = -1;
|
|
|
- if(evtpoll) {
|
|
|
- ee.events = event_mask;
|
|
|
- if(data)
|
|
|
- ee.data.ptr = data;
|
|
|
- else
|
|
|
- ee.data.fd = fd;
|
|
|
- ret = epoll_ctl(evtpoll->epfd, ctrl_mod, fd, &ee);
|
|
|
- if(ret == -1) {
|
|
|
- ret = errno;
|
|
|
- }
|
|
|
- }
|
|
|
- WLog_INFO(TAG, "evtpoll_ctl: OUT:%d, IN:%d, OTHERS:0x%08X, ADD:%d, MOD:%d, fd:%d, data:0x%X ret:%d",
|
|
|
- (event_mask&EPOLLOUT) > 0 ? 1:0, (event_mask&EPOLLIN) > 0 ? 1:0,
|
|
|
- (event_mask & ~(EPOLLOUT | EPOLLIN)),
|
|
|
- ctrl_mod == EPOLL_CTL_ADD ? 1:0, ctrl_mod == EPOLL_CTL_MOD ? 1:0, fd, data, ret);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-TOOLKIT_API int evtpoll_ctl_remove(event_epoll_t* evtpoll, int event_mask, int fd, void* data)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- struct epoll_event ee;
|
|
|
- if(!evtpoll)
|
|
|
- return -1;
|
|
|
- ee.events = event_mask;
|
|
|
- if(data)
|
|
|
- ee.data.ptr = data;
|
|
|
- else
|
|
|
- ee.data.fd = fd;
|
|
|
- ret = epoll_ctl(evtpoll->epfd, EPOLL_CTL_DEL, fd, &ee);
|
|
|
- if(ret == 0 || (ret == -1 && errno == ENOENT)) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- ret = errno;
|
|
|
- return ret;
|
|
|
-}
|
|
|
|
|
|
|
|
|
static __inline int evtpoll_subscribe_read(event_epoll_t* evtpoll, event_epoll_interest_t* interest, ioqueue_overlapped_t* data)
|
|
@@ -865,39 +643,6 @@ TOOLKIT_API int evtpoll_deal(event_epoll_t *evt_poll, struct epoll_event* event,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-TOOLKIT_API event_epoll_interest_t* evtpoll_interest_create(int interest_fd)
|
|
|
-{
|
|
|
- int i;
|
|
|
- event_epoll_interest_t* interest = ZALLOC_T(event_epoll_interest_t);
|
|
|
- if(!interest)
|
|
|
- return NULL;
|
|
|
-
|
|
|
- interest->fd = interest_fd;
|
|
|
- INIT_LIST_HEAD(&interest->entry_list);
|
|
|
- spinlock_init(&interest->lock);
|
|
|
- interest->entry_count = 0;
|
|
|
- interest->events = 0;
|
|
|
- interest->owner = NULL;
|
|
|
- interest->type = 0;
|
|
|
- interest->interest_entries = array_make(DEFAULT_INTEREST_OP_COUNT, sizeof(event_epoll_interest_entry*));
|
|
|
- for (i = 0; i < DEFAULT_INTEREST_OP_COUNT; ++i) {
|
|
|
- ARRAY_IDX(interest->interest_entries, i, event_epoll_interest_entry*)
|
|
|
- = evtpoll_interest_entry_create(interest);
|
|
|
- }
|
|
|
- return interest;
|
|
|
-}
|
|
|
-
|
|
|
-TOOLKIT_API void evtpoll_interest_destroy(event_epoll_interest_t* interest)
|
|
|
-{
|
|
|
- int i;
|
|
|
- assert(interest);
|
|
|
- assert(list_empty(&interest->entry_list));
|
|
|
- for (i = 0; i < interest->interest_entries->nelts; ++i)
|
|
|
- destroy_interest_entry(ARRAY_IDX(interest->interest_entries, i, event_epoll_interest_entry*));
|
|
|
- array_free(interest->interest_entries);
|
|
|
- free(interest);
|
|
|
-}
|
|
|
-
|
|
|
#endif
|
|
|
|
|
|
|