make group_member_cache place local

This commit is contained in:
Kevin Tew 2011-04-24 20:40:14 -06:00
parent 7e491392e1
commit 44bf21a907
2 changed files with 16 additions and 11 deletions

View File

@ -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_)
/* **************************************** */

View File

@ -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;
}
}