From 1695abfa9f6bf429a5aa07117310c4ad87d4b3ae Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Thu, 3 Jul 2014 13:55:39 -0700 Subject: [PATCH] rsocket: Fix removing rsocket from service thread When removing an rsocket from a service thread, we replace the removed service with the one at the end of the service list. This keeps the array tightly packed. However, rs_svc_rm_rs decrements the rsocket count before doing the swap. The result is that the entry at the end of the list gets dropped off. Defer decrementing the count until the swap has been made. In this case, the cnt value is a valid index into the array, because we start at index 1. Index 0 is used internally by the service thread. Signed-off-by: Sean Hefty --- src/rsocket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rsocket.c b/src/rsocket.c index f81fb1b8..e9d12c75 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -3947,11 +3947,11 @@ static int rs_svc_rm_rs(struct rs_svc *svc, struct rsocket *rs) for (i = 1; i <= svc->cnt; i++) { if (svc->rss[i] == rs) { - svc->cnt--; svc->rss[i] = svc->rss[svc->cnt]; memcpy(svc->contexts + i * svc->context_size, svc->contexts + svc->cnt * svc->context_size, svc->context_size); + svc->cnt--; return 0; } } -- 2.41.0