|
|
|
|
@ -88,33 +88,33 @@ static void poller_item_free(void *p) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int poller_add_item(struct poller *p, struct poller_item *i) {
|
|
|
|
|
bool poller_add_item(struct poller *p, struct poller_item *i) {
|
|
|
|
|
struct poller_item_int *ip;
|
|
|
|
|
struct epoll_event e;
|
|
|
|
|
|
|
|
|
|
if (!p)
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
if (!i)
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
if (i->fd < 0)
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
if (!i->readable && !i->writeable)
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
if (!i->closed)
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
LOCK(&p->lock);
|
|
|
|
|
|
|
|
|
|
if (i->fd < p->items->len && p->items->pdata[i->fd])
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
ZERO(e);
|
|
|
|
|
e.events = epoll_events(i, NULL);
|
|
|
|
|
e.data.fd = i->fd;
|
|
|
|
|
if (epoll_ctl(p->fd, EPOLL_CTL_ADD, i->fd, &e))
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (i->fd >= p->items->len)
|
|
|
|
|
g_ptr_array_set_size(p->items, i->fd + 1);
|
|
|
|
|
@ -128,29 +128,29 @@ int poller_add_item(struct poller *p, struct poller_item *i) {
|
|
|
|
|
|
|
|
|
|
obj_put(ip);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int poller_del_item(struct poller *p, int fd) {
|
|
|
|
|
bool poller_del_item(struct poller *p, int fd) {
|
|
|
|
|
struct poller_item_int *it;
|
|
|
|
|
|
|
|
|
|
if (!p || fd < 0)
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
LOCK(&p->lock);
|
|
|
|
|
|
|
|
|
|
if (!p->items) // can happen during shutdown/free only
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
if (fd >= p->items->len)
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
if (!(it = p->items->pdata[fd]))
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (epoll_ctl(p->fd, EPOLL_CTL_DEL, fd, NULL))
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
p->items->pdata[fd] = NULL; /* stealing the ref */
|
|
|
|
|
|
|
|
|
|
@ -158,7 +158,7 @@ int poller_del_item(struct poller *p, int fd) {
|
|
|
|
|
|
|
|
|
|
obj_put(it);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|