From 44bf21a9074521d930e546146110dcaaf9a2f764 Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Sun, 24 Apr 2011 20:40:14 -0600 Subject: [PATCH] make group_member_cache place local --- src/racket/include/schthread.h | 2 ++ src/racket/src/file.c | 25 ++++++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/racket/include/schthread.h b/src/racket/include/schthread.h index 991c0ae0e3..c0f5614e22 100644 --- a/src/racket/include/schthread.h +++ b/src/racket/include/schthread.h @@ -314,6 +314,7 @@ typedef struct Thread_Local_Variables { void *place_object_; struct Scheme_Object *empty_self_shift_cache_; struct Scheme_Bucket_Table *scheme_module_code_cache_; + struct Scheme_Object *group_member_cache_; } Thread_Local_Variables; #if defined(IMPLEMENT_THREAD_LOCAL_VIA_PTHREADS) @@ -633,6 +634,7 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL; #define place_object XOA (scheme_get_thread_local_variables()->place_object_) #define empty_self_shift_cache XOA (scheme_get_thread_local_variables()->empty_self_shift_cache_) #define scheme_module_code_cache XOA (scheme_get_thread_local_variables()->scheme_module_code_cache_) +#define group_member_cache XOA (scheme_get_thread_local_variables()->group_member_cache_) /* **************************************** */ diff --git a/src/racket/src/file.c b/src/racket/src/file.c index 5db8f13f24..7bec2a79fb 100644 --- a/src/racket/src/file.c +++ b/src/racket/src/file.c @@ -238,13 +238,9 @@ SHARED_OK static Scheme_Object *addon_dir; READ_ONLY static Scheme_Object *windows_symbol, *unix_symbol; #if defined(UNIX_FILE_SYSTEM) && !defined(NO_UNIX_USERS) -typedef struct { - gid_t gid; - char set, in; -} Group_Mem_Cache; # define GROUP_CACHE_SIZE 10 -FIXME_LATER static Group_Mem_Cache group_mem_cache[GROUP_CACHE_SIZE]; +THREAD_LOCAL_DECL(static Scheme_Object *group_member_cache); SHARED_OK static int have_user_ids = 0; SHARED_OK static uid_t uid; @@ -5341,9 +5337,16 @@ static int user_in_group(uid_t uid, gid_t gid) struct passwd *pw; int i, in; + if (!group_member_cache) { + group_member_cache = scheme_make_vector(2 * GROUP_CACHE_SIZE, scheme_false); + REGISTER_SO(group_member_cache); + } + for (i = 0; i < GROUP_CACHE_SIZE; i++) { - if (group_mem_cache[i].set && (group_mem_cache[i].gid == gid)) - return group_mem_cache[i].in; + Scheme_Object *gid_e; + gid_e = SCHEME_VEC_ELS(group_member_cache)[2*i]; + if (!SCHEME_FALSEP(gid_e) && (SCHEME_INT_VAL(gid_e) == gid)) + return SCHEME_FALSEP(SCHEME_VEC_ELS(group_member_cache)[2*i+1]) ? 0 : 1; } pw = getpwuid(uid); @@ -5362,10 +5365,10 @@ static int user_in_group(uid_t uid, gid_t gid) in = !!(g->gr_mem[i]); for (i = 0; i < GROUP_CACHE_SIZE; i++) { - if (!group_mem_cache[i].set) { - group_mem_cache[i].set = 1; - group_mem_cache[i].gid = gid; - group_mem_cache[i].in = in; + if (SCHEME_FALSEP(SCHEME_VEC_ELS(group_member_cache)[2*i])) { + SCHEME_VEC_ELS(group_member_cache)[2*i] = scheme_make_integer(gid); + SCHEME_VEC_ELS(group_member_cache)[2*i+1] = in ? scheme_true : scheme_false; + return in; } }