make group_member_cache place local
This commit is contained in:
parent
7e491392e1
commit
44bf21a907
|
@ -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_)
|
||||
|
||||
/* **************************************** */
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user