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