16,9 → 16,13 |
#include <kernel/descr.h> |
#include <kernel/func.h> |
#include <pistar.h> |
#include <ll/i386/string.h> |
|
#define MAX_SHARED_NAME 15 |
|
struct hash_entry { |
mutex_t mx; |
char shared_obj_name[MAX_SHARED_NAME]; |
FSF_SHARED_OBJ_HANDLE_T_OPAQUE id; |
}; |
|
364,6 → 368,49 |
|
*/ |
|
|
int fsf_get_shared_object_handle |
(fsf_shared_obj_id_t obj_id, |
fsf_shared_obj_handle_t *obj_handle) { |
int index; |
int oldindex; |
SYS_FLAGS f; |
|
f=kern_fsave(); |
|
index=hash_fun(obj_id); |
|
if (strcmp(htable[index].shared_obj_name,obj_id) == 0) { |
kern_frestore(f); |
return index; |
} |
|
if (htable[index].id!=0) { |
oldindex=index; |
index = (index + 1) % MAX_HASH_ENTRY; |
// collision detection |
while (htable[index].id !=0 && index!=oldindex) { |
if (strcmp(htable[index].shared_obj_name,obj_id) == 0) { |
kern_frestore(f); |
return index; |
} |
index=(index+1) % MAX_HASH_ENTRY; |
} |
|
// table is full |
if (index==oldindex) { |
kern_frestore(f); |
return -1; |
} |
} |
|
kern_frestore(f); |
return -1; |
|
} |
|
|
|
int fsf_init_shared_object |
(fsf_shared_obj_id_t id, |
fsf_shared_obj_handle_t *obj, |
380,16 → 427,16 |
index=hash_fun(id); |
//kern_printf("Index %d Hash %d", index, htable[index].id); |
|
if (htable[index].id == index) { |
if (strcmp(htable[index].shared_obj_name,id) == 0) { |
kern_frestore(f); |
return -1; |
} |
|
if (htable[index].id>=0) { |
if (htable[index].id!=0) { |
oldindex=index; |
index = (index + 1) % MAX_HASH_ENTRY; |
// collision detection |
while (htable[index].id >=0 && index!=oldindex) index=(index+1) % MAX_HASH_ENTRY; |
while (htable[index].id !=0 && index!=oldindex) index=(index+1) % MAX_HASH_ENTRY; |
// table is full |
if (index==oldindex) { |
kern_frestore(f); |
401,8 → 448,8 |
|
mutex_init(&(htable[index]).mx, &a); |
mutex=&(htable[index]).mx; |
htable[index].id=index; |
*obj=*id; |
strncpy(htable[index].shared_obj_name, id,MAX_SHARED_NAME); |
*obj=index; |
kern_frestore(f); |
|
return 0; |