|
|
|
@ -575,7 +575,7 @@ static void client_event_processor(ckpool_t *ckp, struct epoll_event *event)
|
|
|
|
|
client = ref_client_by_id(cdata, id); |
|
|
|
|
if (unlikely(!client)) { |
|
|
|
|
LOGNOTICE("Failed to find client by id %"PRId64" in receiver!", id); |
|
|
|
|
return; |
|
|
|
|
goto outnoclient; |
|
|
|
|
} |
|
|
|
|
if (unlikely(client->invalid)) |
|
|
|
|
goto out; |
|
|
|
@ -619,6 +619,8 @@ static void client_event_processor(ckpool_t *ckp, struct epoll_event *event)
|
|
|
|
|
} |
|
|
|
|
out: |
|
|
|
|
dec_instance_ref(cdata, client); |
|
|
|
|
outnoclient: |
|
|
|
|
free(event); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Waits on fds ready to read on from the list stored in conn_instance and
|
|
|
|
@ -626,7 +628,7 @@ out:
|
|
|
|
|
static void *receiver(void *arg) |
|
|
|
|
{ |
|
|
|
|
cdata_t *cdata = (cdata_t *)arg; |
|
|
|
|
struct epoll_event event; |
|
|
|
|
struct epoll_event *event = ckzalloc(sizeof(struct epoll_event)); |
|
|
|
|
uint64_t serverfds, i; |
|
|
|
|
int ret, epfd; |
|
|
|
|
|
|
|
|
@ -641,9 +643,9 @@ static void *receiver(void *arg)
|
|
|
|
|
/* Add all the serverfds to the epoll */ |
|
|
|
|
for (i = 0; i < serverfds; i++) { |
|
|
|
|
/* The small values will be less than the first client ids */ |
|
|
|
|
event.data.u64 = i; |
|
|
|
|
event.events = EPOLLIN | EPOLLRDHUP; |
|
|
|
|
ret = epoll_ctl(epfd, EPOLL_CTL_ADD, cdata->serverfd[i], &event); |
|
|
|
|
event->data.u64 = i; |
|
|
|
|
event->events = EPOLLIN | EPOLLRDHUP; |
|
|
|
|
ret = epoll_ctl(epfd, EPOLL_CTL_ADD, cdata->serverfd[i], event); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
LOGEMERG("FATAL: Failed to add epfd %d to epoll_ctl", epfd); |
|
|
|
|
goto out; |
|
|
|
@ -658,7 +660,7 @@ static void *receiver(void *arg)
|
|
|
|
|
|
|
|
|
|
while (unlikely(!cdata->accept)) |
|
|
|
|
cksleep_ms(10); |
|
|
|
|
ret = epoll_wait(epfd, &event, 1, 1000); |
|
|
|
|
ret = epoll_wait(epfd, event, 1, 1000); |
|
|
|
|
if (unlikely(ret < 1)) { |
|
|
|
|
if (unlikely(ret == -1)) { |
|
|
|
|
LOGEMERG("FATAL: Failed to epoll_wait in receiver"); |
|
|
|
@ -667,7 +669,7 @@ static void *receiver(void *arg)
|
|
|
|
|
/* Nothing to service, still very unlikely */ |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
edu64 = event.data.u64; |
|
|
|
|
edu64 = event->data.u64; |
|
|
|
|
if (edu64 < serverfds) { |
|
|
|
|
ret = accept_client(cdata, epfd, edu64); |
|
|
|
|
if (unlikely(ret < 0)) { |
|
|
|
@ -676,7 +678,10 @@ static void *receiver(void *arg)
|
|
|
|
|
} |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
ckmsgq_add(cdata->cevents, &event); |
|
|
|
|
/* Event structure is handed off to client_event_processor
|
|
|
|
|
* here to be freed so we need to allocate a new one */ |
|
|
|
|
ckmsgq_add(cdata->cevents, event); |
|
|
|
|
event = ckzalloc(sizeof(struct epoll_event)); |
|
|
|
|
} |
|
|
|
|
out: |
|
|
|
|
/* We shouldn't get here unless there's an error */ |
|
|
|
|