Skip to content

Commit 8565479

Browse files
authored
Move poller deleting fd out of lock. (#1816)
* Move poller deleting fd out of lock. * Move '__poller_handle_pipe' out of lock.
1 parent 2401805 commit 8565479

1 file changed

Lines changed: 38 additions & 44 deletions

File tree

src/kernel/poller.c

Lines changed: 38 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,7 @@ static void __poller_tree_insert(struct __poller_node *node, poller_t *poller)
321321
rb_insert_color(&node->rb, &poller->timeo_tree);
322322
}
323323

324-
static inline void __poller_tree_erase(struct __poller_node *node,
325-
poller_t *poller)
324+
static void __poller_tree_erase(struct __poller_node *node, poller_t *poller)
326325
{
327326
if (&node->rb == poller->tree_first)
328327
poller->tree_first = rb_next(&node->rb);
@@ -334,6 +333,34 @@ static inline void __poller_tree_erase(struct __poller_node *node,
334333
node->in_rbtree = 0;
335334
}
336335

336+
static void __poller_insert_node(struct __poller_node *node, poller_t *poller)
337+
{
338+
struct __poller_node *end;
339+
340+
end = list_entry(poller->timeo_list.prev, struct __poller_node, list);
341+
if (list_empty(&poller->timeo_list))
342+
{
343+
list_add(&node->list, &poller->timeo_list);
344+
end = rb_entry(poller->tree_first, struct __poller_node, rb);
345+
}
346+
else if (__timeout_cmp(node, end) >= 0)
347+
{
348+
list_add_tail(&node->list, &poller->timeo_list);
349+
return;
350+
}
351+
else
352+
{
353+
__poller_tree_insert(node, poller);
354+
if (&node->rb != poller->tree_first)
355+
return;
356+
357+
end = list_entry(poller->timeo_list.next, struct __poller_node, list);
358+
}
359+
360+
if (!poller->tree_first || __timeout_cmp(node, end) < 0)
361+
__poller_set_timerfd(poller->timerfd, &node->timeout, poller);
362+
}
363+
337364
static int __poller_remove_node(struct __poller_node *node, poller_t *poller)
338365
{
339366
int removed;
@@ -967,10 +994,7 @@ static void __poller_handle_timeout(const struct __poller_node *time_node,
967994
break;
968995

969996
if (node->data.fd >= 0)
970-
{
971997
poller->nodes[node->data.fd] = NULL;
972-
__poller_del_fd(node->data.fd, node->event, poller);
973-
}
974998
else
975999
node->removed = 1;
9761000

@@ -984,10 +1008,7 @@ static void __poller_handle_timeout(const struct __poller_node *time_node,
9841008
break;
9851009

9861010
if (node->data.fd >= 0)
987-
{
9881011
poller->nodes[node->data.fd] = NULL;
989-
__poller_del_fd(node->data.fd, node->event, poller);
990-
}
9911012
else
9921013
node->removed = 1;
9931014

@@ -1004,6 +1025,8 @@ static void __poller_handle_timeout(const struct __poller_node *time_node,
10041025
node = list_entry(pos, struct __poller_node, list);
10051026
if (node->data.fd >= 0)
10061027
{
1028+
__poller_del_fd(node->data.fd, node->event, poller);
1029+
10071030
node->error = ETIMEDOUT;
10081031
node->state = PR_ST_ERROR;
10091032
}
@@ -1258,35 +1281,6 @@ int poller_start(poller_t *poller)
12581281
return -poller->stopped;
12591282
}
12601283

1261-
static void __poller_insert_node(struct __poller_node *node,
1262-
poller_t *poller)
1263-
{
1264-
struct __poller_node *end;
1265-
1266-
end = list_entry(poller->timeo_list.prev, struct __poller_node, list);
1267-
if (list_empty(&poller->timeo_list))
1268-
{
1269-
list_add(&node->list, &poller->timeo_list);
1270-
end = rb_entry(poller->tree_first, struct __poller_node, rb);
1271-
}
1272-
else if (__timeout_cmp(node, end) >= 0)
1273-
{
1274-
list_add_tail(&node->list, &poller->timeo_list);
1275-
return;
1276-
}
1277-
else
1278-
{
1279-
__poller_tree_insert(node, poller);
1280-
if (&node->rb != poller->tree_first)
1281-
return;
1282-
1283-
end = list_entry(poller->timeo_list.next, struct __poller_node, list);
1284-
}
1285-
1286-
if (!poller->tree_first || __timeout_cmp(node, end) < 0)
1287-
__poller_set_timerfd(poller->timerfd, &node->timeout, poller);
1288-
}
1289-
12901284
static void __poller_node_set_timeout(int timeout, struct __poller_node *node)
12911285
{
12921286
clock_gettime(CLOCK_MONOTONIC, &node->timeout);
@@ -1653,10 +1647,6 @@ void poller_stop(poller_t *poller)
16531647
poller->stopped = 1;
16541648

16551649
pthread_mutex_lock(&poller->mutex);
1656-
close(poller->pipe_wr);
1657-
__poller_handle_pipe(poller);
1658-
close(poller->pipe_rd);
1659-
16601650
poller->tree_first = NULL;
16611651
poller->tree_last = NULL;
16621652
while (poller->timeo_tree.rb_node)
@@ -1672,18 +1662,22 @@ void poller_stop(poller_t *poller)
16721662
{
16731663
node = list_entry(pos, struct __poller_node, list);
16741664
if (node->data.fd >= 0)
1675-
{
16761665
poller->nodes[node->data.fd] = NULL;
1677-
__poller_del_fd(node->data.fd, node->event, poller);
1678-
}
16791666
else
16801667
node->removed = 1;
16811668
}
16821669

16831670
pthread_mutex_unlock(&poller->mutex);
1671+
close(poller->pipe_wr);
1672+
__poller_handle_pipe(poller);
1673+
close(poller->pipe_rd);
1674+
16841675
list_for_each_safe(pos, tmp, &node_list)
16851676
{
16861677
node = list_entry(pos, struct __poller_node, list);
1678+
if (node->data.fd >= 0)
1679+
__poller_del_fd(node->data.fd, node->event, poller);
1680+
16871681
node->error = 0;
16881682
node->state = PR_ST_STOPPED;
16891683
free(node->res);

0 commit comments

Comments
 (0)