From: <mr...@mr...> - 2005-05-30 17:39:01
|
# This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2005/05/30 19:38:29+02:00 mr...@fo... = # fix race in get_symbol # = # kernel/module.c # 2005/05/30 19:38:15+02:00 mr...@fo... +8 -4 # proper locking around module loaded check in get_symbol # = diff -Nru a/kernel/module.c b/kernel/module.c --- a/kernel/module.c 2005-05-30 19:38:51 +02:00 +++ b/kernel/module.c 2005-05-30 19:38:51 +02:00 @@ -397,7 +397,7 @@ tc2_module *module; tc2_symbol_t *sym; = - kprint("module", TC2_PRINT_DEBUG + 2, "%s: Getting symbol: %s\n", + kprint("get_symbol", TC2_PRINT_DEBUG + 2, "%s: Getting symbol: %s\n", cmod->module->name, csym); = if(tchash_find(avail_syms, csym, -1, &module) !=3D 0){ @@ -405,10 +405,14 @@ return NULL; } = - if(module->handle =3D=3D NULL){ - _tc2_request(TC2_LOAD_MODULE, cmod, 1, interface, NULL); + pthread_mutex_lock(&module->mut); + if(!module->loaded){ + _tc2_request(TC2_LOAD_MODULE, cmod, 0, interface, NULL); + while(!module->loaded) + pthread_cond_wait(&module->cond, &module->mut); module->autoclean =3D 1; } + pthread_mutex_unlock(&module->mut); = if(tchash_find(loaded_syms, csym, -1, &sym)){ kprint("module", TC2_PRINT_ERROR, @@ -426,7 +430,7 @@ if(cmod) tc2_add_dep(cmod, module); = - kprint("module", TC2_PRINT_DEBUG + 2, "%s: Got symbol: %s -> %p\n", + kprint("get_symbol", TC2_PRINT_DEBUG + 2, "%s: Got symbol: %s -> %p\n", cmod->module->name, csym, sym->sym); = return sym; |