|
@@ -1,8 +1,9 @@
|
|
|
#include "hloop.h"
|
|
#include "hloop.h"
|
|
|
|
|
+#include "hio.h"
|
|
|
|
|
+#include "io_watcher.h"
|
|
|
|
|
|
|
|
#include "hdef.h"
|
|
#include "hdef.h"
|
|
|
#include "htime.h"
|
|
#include "htime.h"
|
|
|
-#include "hevent.h"
|
|
|
|
|
|
|
|
|
|
static void hloop_update_time(hloop_t* loop) {
|
|
static void hloop_update_time(hloop_t* loop) {
|
|
|
loop->cur_time = gethrtime();
|
|
loop->cur_time = gethrtime();
|
|
@@ -10,12 +11,12 @@ static void hloop_update_time(hloop_t* loop) {
|
|
|
|
|
|
|
|
int hloop_init(hloop_t* loop) {
|
|
int hloop_init(hloop_t* loop) {
|
|
|
loop->status = HLOOP_STATUS_STOP;
|
|
loop->status = HLOOP_STATUS_STOP;
|
|
|
|
|
+ loop->event_counter = 0;
|
|
|
loop->timer_counter = 0;
|
|
loop->timer_counter = 0;
|
|
|
loop->idle_counter = 0;
|
|
loop->idle_counter = 0;
|
|
|
loop->min_timer_timeout = INFINITE;
|
|
loop->min_timer_timeout = INFINITE;
|
|
|
- loop->event_ctx = NULL;
|
|
|
|
|
- // hloop_event_init when add_event first
|
|
|
|
|
- // hloop_event_init(loop);
|
|
|
|
|
|
|
+ loop->iowatcher = NULL;
|
|
|
|
|
+ //hloop_iowatcher_init(loop);
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -28,13 +29,13 @@ void hloop_cleanup(hloop_t* loop) {
|
|
|
SAFE_FREE(pair.second);
|
|
SAFE_FREE(pair.second);
|
|
|
}
|
|
}
|
|
|
loop->idles.clear();
|
|
loop->idles.clear();
|
|
|
- for (auto& pair : loop->events) {
|
|
|
|
|
- hevent_t* event = pair.second;
|
|
|
|
|
- hloop_del_event(event);
|
|
|
|
|
- SAFE_FREE(event);
|
|
|
|
|
|
|
+ for (auto& pair : loop->ios) {
|
|
|
|
|
+ hio_t* io = pair.second;
|
|
|
|
|
+ hio_del(io);
|
|
|
|
|
+ SAFE_FREE(io);
|
|
|
}
|
|
}
|
|
|
- loop->events.clear();
|
|
|
|
|
- hloop_event_cleanup(loop);
|
|
|
|
|
|
|
+ loop->ios.clear();
|
|
|
|
|
+ hloop_iowatcher_cleanup(loop);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int hloop_handle_timers(hloop_t* loop) {
|
|
int hloop_handle_timers(hloop_t* loop) {
|
|
@@ -43,7 +44,7 @@ int hloop_handle_timers(hloop_t* loop) {
|
|
|
while (iter != loop->timers.end()) {
|
|
while (iter != loop->timers.end()) {
|
|
|
htimer_t* timer = iter->second;
|
|
htimer_t* timer = iter->second;
|
|
|
if (timer->destroy) goto destroy;
|
|
if (timer->destroy) goto destroy;
|
|
|
- if (timer->disable) goto next;
|
|
|
|
|
|
|
+ if (!timer->active) goto next;
|
|
|
if (timer->repeat == 0) goto destroy;
|
|
if (timer->repeat == 0) goto destroy;
|
|
|
if (timer->next_timeout < loop->cur_time) {
|
|
if (timer->next_timeout < loop->cur_time) {
|
|
|
++ntimer;
|
|
++ntimer;
|
|
@@ -71,7 +72,7 @@ int hloop_handle_idles(hloop_t* loop) {
|
|
|
while (iter != loop->idles.end()) {
|
|
while (iter != loop->idles.end()) {
|
|
|
hidle_t* idle = iter->second;
|
|
hidle_t* idle = iter->second;
|
|
|
if (idle->destroy) goto destroy;
|
|
if (idle->destroy) goto destroy;
|
|
|
- if (idle->disable) goto next;
|
|
|
|
|
|
|
+ if (!idle->active) goto next;
|
|
|
if (idle->repeat == 0) goto destroy;
|
|
if (idle->repeat == 0) goto destroy;
|
|
|
++nidle;
|
|
++nidle;
|
|
|
if (idle->cb) {
|
|
if (idle->cb) {
|
|
@@ -91,11 +92,11 @@ destroy:
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#define PAUSE_SLEEP_TIME 10 // ms
|
|
#define PAUSE_SLEEP_TIME 10 // ms
|
|
|
-#define MIN_EVENT_TIMEOUT 1 // ms
|
|
|
|
|
-#define MAX_EVENT_TIMEOUT 1000 // ms
|
|
|
|
|
|
|
+#define MIN_POLL_TIMEOUT 1 // ms
|
|
|
|
|
+#define MAX_POLL_TIMEOUT 1000 // ms
|
|
|
int hloop_run(hloop_t* loop) {
|
|
int hloop_run(hloop_t* loop) {
|
|
|
- int ntimer, nevent, nidle;
|
|
|
|
|
- int event_timeout;
|
|
|
|
|
|
|
+ int ntimer, nio, nidle;
|
|
|
|
|
+ int poll_timeout;
|
|
|
|
|
|
|
|
loop->start_time = gethrtime();
|
|
loop->start_time = gethrtime();
|
|
|
loop->status = HLOOP_STATUS_RUNNING;
|
|
loop->status = HLOOP_STATUS_RUNNING;
|
|
@@ -108,25 +109,25 @@ int hloop_run(hloop_t* loop) {
|
|
|
}
|
|
}
|
|
|
++loop->loop_cnt;
|
|
++loop->loop_cnt;
|
|
|
// timers -> events -> idles
|
|
// timers -> events -> idles
|
|
|
- ntimer = nevent = nidle = 0;
|
|
|
|
|
- event_timeout = INFINITE;
|
|
|
|
|
|
|
+ ntimer = nio = nidle = 0;
|
|
|
|
|
+ poll_timeout = INFINITE;
|
|
|
if (loop->timers.size() != 0) {
|
|
if (loop->timers.size() != 0) {
|
|
|
ntimer = hloop_handle_timers(loop);
|
|
ntimer = hloop_handle_timers(loop);
|
|
|
- event_timeout = MAX(MIN_EVENT_TIMEOUT, loop->min_timer_timeout/10);
|
|
|
|
|
|
|
+ poll_timeout = MAX(MIN_POLL_TIMEOUT, loop->min_timer_timeout/10);
|
|
|
}
|
|
}
|
|
|
- if (loop->events.size() == 0 || loop->idles.size() != 0) {
|
|
|
|
|
- event_timeout = MIN(event_timeout, MAX_EVENT_TIMEOUT);
|
|
|
|
|
|
|
+ if (loop->ios.size() == 0 || loop->idles.size() != 0) {
|
|
|
|
|
+ poll_timeout = MIN(poll_timeout, MAX_POLL_TIMEOUT);
|
|
|
}
|
|
}
|
|
|
- if (loop->events.size() != 0) {
|
|
|
|
|
- nevent = hloop_handle_events(loop, event_timeout);
|
|
|
|
|
|
|
+ if (loop->ios.size() != 0) {
|
|
|
|
|
+ nio = hloop_handle_ios(loop, poll_timeout);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
- msleep(event_timeout);
|
|
|
|
|
|
|
+ msleep(poll_timeout);
|
|
|
}
|
|
}
|
|
|
- if (ntimer == 0 && nevent == 0 && loop->idles.size() != 0) {
|
|
|
|
|
|
|
+ if (ntimer == 0 && nio == 0 && loop->idles.size() != 0) {
|
|
|
nidle = hloop_handle_idles(loop);
|
|
nidle = hloop_handle_idles(loop);
|
|
|
}
|
|
}
|
|
|
- //printf("loop_cnt=%lu ntimer=%d nevent=%d nidle=%d\n", loop->loop_cnt, ntimer, nevent, nidle);
|
|
|
|
|
|
|
+ //printf("loop_cnt=%lu ntimer=%d nio=%d nidle=%d\n", loop->loop_cnt, ntimer, nio, nidle);
|
|
|
}
|
|
}
|
|
|
loop->status = HLOOP_STATUS_STOP;
|
|
loop->status = HLOOP_STATUS_STOP;
|
|
|
loop->end_time = gethrtime();
|
|
loop->end_time = gethrtime();
|
|
@@ -156,6 +157,8 @@ int hloop_resume(hloop_t* loop) {
|
|
|
htimer_t* htimer_add(hloop_t* loop, htimer_cb cb, void* userdata, uint64_t timeout, uint32_t repeat) {
|
|
htimer_t* htimer_add(hloop_t* loop, htimer_cb cb, void* userdata, uint64_t timeout, uint32_t repeat) {
|
|
|
htimer_t* timer = (htimer_t*)malloc(sizeof(htimer_t));
|
|
htimer_t* timer = (htimer_t*)malloc(sizeof(htimer_t));
|
|
|
memset(timer, 0, sizeof(htimer_t));
|
|
memset(timer, 0, sizeof(htimer_t));
|
|
|
|
|
+ timer->event_type = HEVENT_TYPE_TIMER;
|
|
|
|
|
+ timer->event_id = ++loop->event_counter;
|
|
|
timer->loop = loop;
|
|
timer->loop = loop;
|
|
|
timer->timer_id = ++loop->timer_counter;
|
|
timer->timer_id = ++loop->timer_counter;
|
|
|
timer->cb = cb;
|
|
timer->cb = cb;
|
|
@@ -163,12 +166,14 @@ htimer_t* htimer_add(hloop_t* loop, htimer_cb cb, void* userdata, uint64_t timeo
|
|
|
timer->timeout = timeout;
|
|
timer->timeout = timeout;
|
|
|
timer->repeat = repeat;
|
|
timer->repeat = repeat;
|
|
|
timer->next_timeout = gethrtime() + timeout*1000;
|
|
timer->next_timeout = gethrtime() + timeout*1000;
|
|
|
|
|
+ timer->active = 1;
|
|
|
loop->timers[timer->timer_id] = timer;
|
|
loop->timers[timer->timer_id] = timer;
|
|
|
loop->min_timer_timeout = MIN(timeout, loop->min_timer_timeout);
|
|
loop->min_timer_timeout = MIN(timeout, loop->min_timer_timeout);
|
|
|
return timer;
|
|
return timer;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void htimer_del(htimer_t* timer) {
|
|
void htimer_del(htimer_t* timer) {
|
|
|
|
|
+ timer->active = 0;
|
|
|
timer->destroy = 1;
|
|
timer->destroy = 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -183,16 +188,20 @@ void htimer_del(hloop_t* loop, uint32_t timer_id) {
|
|
|
hidle_t* hidle_add(hloop_t* loop, hidle_cb cb, void* userdata, uint32_t repeat) {
|
|
hidle_t* hidle_add(hloop_t* loop, hidle_cb cb, void* userdata, uint32_t repeat) {
|
|
|
hidle_t* idle = (hidle_t*)malloc(sizeof(hidle_t));
|
|
hidle_t* idle = (hidle_t*)malloc(sizeof(hidle_t));
|
|
|
memset(idle, 0, sizeof(hidle_t));
|
|
memset(idle, 0, sizeof(hidle_t));
|
|
|
|
|
+ idle->event_type = HEVENT_TYPE_IDLE;
|
|
|
|
|
+ idle->event_id = ++loop->event_counter;
|
|
|
idle->loop = loop;
|
|
idle->loop = loop;
|
|
|
idle->idle_id = ++loop->idle_counter;
|
|
idle->idle_id = ++loop->idle_counter;
|
|
|
idle->cb = cb;
|
|
idle->cb = cb;
|
|
|
idle->userdata = userdata;
|
|
idle->userdata = userdata;
|
|
|
idle->repeat = repeat;
|
|
idle->repeat = repeat;
|
|
|
|
|
+ idle->active = 1;
|
|
|
loop->idles[idle->idle_id] = idle;
|
|
loop->idles[idle->idle_id] = idle;
|
|
|
return idle;
|
|
return idle;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void hidle_del(hidle_t* idle) {
|
|
void hidle_del(hidle_t* idle) {
|
|
|
|
|
+ idle->active = 0;
|
|
|
idle->destroy = 1;
|
|
idle->destroy = 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -203,86 +212,3 @@ void hidle_del(hloop_t* loop, uint32_t idle_id) {
|
|
|
hidle_del(idle);
|
|
hidle_del(idle);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-hevent_t* hevent_add(hloop_t* loop, int fd) {
|
|
|
|
|
-#ifdef EVENT_SELECT
|
|
|
|
|
- if (loop->events.size() >= FD_SETSIZE) return NULL;
|
|
|
|
|
-#endif
|
|
|
|
|
- hevent_t* event = (hevent_t*)malloc(sizeof(hevent_t));
|
|
|
|
|
- memset(event, 0, sizeof(hevent_t));
|
|
|
|
|
- event->loop = loop;
|
|
|
|
|
- event->fd = fd;
|
|
|
|
|
- event->event_index[0] = -1;
|
|
|
|
|
- event->event_index[1] = -1;
|
|
|
|
|
- event->events = 0;
|
|
|
|
|
- loop->events[fd] = event;
|
|
|
|
|
- return event;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-hevent_t* hevent_get(hloop_t* loop, int fd) {
|
|
|
|
|
- auto iter = loop->events.find(fd);
|
|
|
|
|
- if (iter != loop->events.end()) {
|
|
|
|
|
- return iter->second;
|
|
|
|
|
- }
|
|
|
|
|
- return NULL;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-hevent_t* hevent_get_or_add(hloop_t* loop, int fd) {
|
|
|
|
|
- hevent_t* event = hevent_get(loop, fd);
|
|
|
|
|
- if (event) {
|
|
|
|
|
- event->destroy = 0;
|
|
|
|
|
- event->disable = 0;
|
|
|
|
|
- return event;
|
|
|
|
|
- }
|
|
|
|
|
- return hevent_add(loop, fd);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void hevent_del(hevent_t* event) {
|
|
|
|
|
- event->destroy = 1;
|
|
|
|
|
- hloop_del_event(event, READ_EVENT|WRITE_EVENT);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void hevent_del(hloop_t* loop, int fd) {
|
|
|
|
|
- auto iter = loop->events.find(fd);
|
|
|
|
|
- if (iter != loop->events.end()) {
|
|
|
|
|
- hevent_del(iter->second);
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-hevent_t* hevent_read(hloop_t* loop, int fd, hevent_cb cb, void* userdata) {
|
|
|
|
|
- hevent_t* event = hevent_get_or_add(loop, fd);
|
|
|
|
|
- if (event == NULL) return NULL;
|
|
|
|
|
- event->read_cb = cb;
|
|
|
|
|
- event->read_userdata = userdata;
|
|
|
|
|
- hloop_add_event(event, READ_EVENT);
|
|
|
|
|
- return event;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-hevent_t* hevent_write(hloop_t* loop, int fd, hevent_cb cb, void* userdata) {
|
|
|
|
|
- hevent_t* event = hevent_get_or_add(loop, fd);
|
|
|
|
|
- if (event == NULL) return NULL;
|
|
|
|
|
- event->write_cb = cb;
|
|
|
|
|
- event->write_userdata = userdata;
|
|
|
|
|
- hloop_add_event(event, WRITE_EVENT);
|
|
|
|
|
- return event;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-#include "hsocket.h"
|
|
|
|
|
-hevent_t* hevent_accept(hloop_t* loop, int listenfd, hevent_cb cb, void* userdata) {
|
|
|
|
|
- hevent_t* event = hevent_read(loop, listenfd, cb, userdata);
|
|
|
|
|
- if (event) {
|
|
|
|
|
- nonblocking(listenfd);
|
|
|
|
|
- event->accept = 1;
|
|
|
|
|
- }
|
|
|
|
|
- return event;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-hevent_t* hevent_connect(hloop_t* loop, int connfd, hevent_cb cb, void* userdata) {
|
|
|
|
|
- hevent_t* event = hevent_write(loop, connfd, cb, userdata);
|
|
|
|
|
- if (event) {
|
|
|
|
|
- nonblocking(connfd);
|
|
|
|
|
- event->connect = 1;
|
|
|
|
|
- }
|
|
|
|
|
- return event;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|