From 52fed302ca0d1934e2f2ec5474652dda2361a6db Mon Sep 17 00:00:00 2001 From: Hristo Staykov Date: Tue, 26 May 2026 13:59:15 +0300 Subject: [PATCH] Move clientSetUser() to acl.c, rename vecFindIndexOf to vecIndexOf Move clientSetUser() from a static inline in server.h to a regular function in acl.c alongside other user-management functions. The function has side-effect logic and is expected to grow; Rename vecFindIndexOf() to vecIndexOf() for brevity and consistency with standard container APIs. --- src/acl.c | 8 ++++++++ src/server.h | 6 +----- src/tracking.c | 6 +++--- src/vector.c | 24 ++++++++++++------------ src/vector.h | 2 +- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/acl.c b/src/acl.c index cdcaf52af..25b0a7d4c 100644 --- a/src/acl.c +++ b/src/acl.c @@ -523,6 +523,14 @@ void ACLCopyUser(user *dst, user *src) { } } +/* Set the user for a client, performing any necessary bookkeeping such as + * updating broadcast tracking state for the user switch. */ +void clientSetUser(client *c, user *new_user) { + user *old = c->user; + c->user = new_user; + trackingBroadcastPostUserSwitch(c, old); +} + /* Given a command ID, this function set by reference 'word' and 'bit' * so that user->allowed_commands[word] will address the right word * where the corresponding bit for the provided ID is stored, and diff --git a/src/server.h b/src/server.h index 1215dc4ac..4c232afef 100644 --- a/src/server.h +++ b/src/server.h @@ -3362,11 +3362,7 @@ uint64_t trackingGetTotalKeys(void); uint64_t trackingGetTotalPrefixes(void); void trackingBroadcastInvalidationMessages(void); void trackingBroadcastPostUserSwitch(client *c, user *old_user); -static inline void clientSetUser(client *c, user *new_user) { - user *old = c->user; - c->user = new_user; - trackingBroadcastPostUserSwitch(c, old); -} +void clientSetUser(client *c, user *new_user); int checkPrefixCollisionsOrReply(client *c, robj **prefix, size_t numprefix); /* List data type */ diff --git a/src/tracking.c b/src/tracking.c index 492fe1d86..615e1a8bf 100644 --- a/src/tracking.c +++ b/src/tracking.c @@ -67,7 +67,7 @@ void disableTracking(client *c) { (unsigned char*)&c->user, sizeof(c->user), (void**)&user_clients); serverAssert(found); - ssize_t idx = vecFindIndexOf(user_clients, c); + ssize_t idx = vecIndexOf(user_clients, c); serverAssert(idx >= 0); vecSwapRemoveAt(user_clients, idx); if (vecSize(user_clients) == 0) { @@ -181,7 +181,7 @@ static void enableBcastTrackingForPrefix(client *c, char *prefix, size_t plen) { user_clients, NULL); } - if (vecFindIndexOf(user_clients, c) < 0) { + if (vecIndexOf(user_clients, c) < 0) { vecPush(user_clients, c); if (c->client_tracking_prefixes == NULL) c->client_tracking_prefixes = raxNew(); @@ -714,7 +714,7 @@ static void trackingBcastMoveClient(client *c, user *old_user) { (unsigned char*)&old_user, sizeof(old_user), (void**)&from_clients); serverAssert(found); - ssize_t idx = vecFindIndexOf(from_clients, c); + ssize_t idx = vecIndexOf(from_clients, c); serverAssert(idx >= 0); vecSwapRemoveAt(from_clients, idx); if (vecSize(from_clients) == 0) { diff --git a/src/vector.c b/src/vector.c index 2bd9d9cb2..70f080dbd 100644 --- a/src/vector.c +++ b/src/vector.c @@ -101,7 +101,7 @@ void vecPush(vec *v, void *value) { } /* Return the index of the first occurrence of 'elem', or -1 if not found. */ -ssize_t vecFindIndexOf(const vec *v, void *elem) { +ssize_t vecIndexOf(const vec *v, void *elem) { for (size_t i = 0; i < v->size; i++) { if (v->data[i] == elem) return (ssize_t)i; } @@ -236,21 +236,21 @@ int vectorTest(int argc, char **argv, int flags) vecRelease(&v); test_cond("vecRelease() free method is a no-op on empty vector", vecTestFreeCalls == 0); - /* vecFindIndexOf tests */ + /* vecIndexOf tests */ vecInit(&v, NULL, 0); - test_cond("vecFindIndexOf() returns -1 on empty vector", - vecFindIndexOf(&v, &one) == -1); + test_cond("vecIndexOf() returns -1 on empty vector", + vecIndexOf(&v, &one) == -1); vecPush(&v, &one); vecPush(&v, &two); vecPush(&v, &three); - test_cond("vecFindIndexOf() finds first element", - vecFindIndexOf(&v, &one) == 0); - test_cond("vecFindIndexOf() finds middle element", - vecFindIndexOf(&v, &two) == 1); - test_cond("vecFindIndexOf() finds last element", - vecFindIndexOf(&v, &three) == 2); - test_cond("vecFindIndexOf() returns -1 for missing element", - vecFindIndexOf(&v, &four) == -1); + test_cond("vecIndexOf() finds first element", + vecIndexOf(&v, &one) == 0); + test_cond("vecIndexOf() finds middle element", + vecIndexOf(&v, &two) == 1); + test_cond("vecIndexOf() finds last element", + vecIndexOf(&v, &three) == 2); + test_cond("vecIndexOf() returns -1 for missing element", + vecIndexOf(&v, &four) == -1); vecRelease(&v); /* vecSwapRemoveAt tests */ diff --git a/src/vector.h b/src/vector.h index 3c2b41c21..c89465567 100644 --- a/src/vector.h +++ b/src/vector.h @@ -98,7 +98,7 @@ void vecReserve(vec *v, size_t mincap); void vecPush(vec *v, void *value); /* Return the index of the first occurrence of 'elem', or -1 if not found. */ -ssize_t vecFindIndexOf(const vec *v, void *elem); +ssize_t vecIndexOf(const vec *v, void *elem); /* Remove the element at 'index' by swapping with the last element. * Does not invoke the free callback. Requires index < vecSize(v). */