6,11 → 6,13 |
|
#include <stdio.h> |
#include <stdlib.h> |
#include <ipc/ipc.h> |
#include <libadt/hash_table.h> |
|
#include "proto.h" |
|
#define SRV_PROTO_TABLE_CHAINS 32 |
#define METHOD_OPER_TABLE_CHAINS 32 |
|
hash_table_t srv_proto; |
|
20,6 → 22,12 |
link_t link; |
} srv_proto_t; |
|
typedef struct { |
ipcarg_t method; |
oper_t *oper; |
link_t link; |
} method_oper_t; |
|
hash_index_t srv_proto_hash(unsigned long key[]) |
{ |
return key[0] % SRV_PROTO_TABLE_CHAINS; |
45,6 → 53,32 |
.remove_callback = srv_proto_remove_callback |
}; |
|
hash_index_t method_oper_hash(unsigned long key[]) |
{ |
return key[0] % METHOD_OPER_TABLE_CHAINS; |
} |
|
int method_oper_compare(unsigned long key[], hash_count_t keys, |
link_t *item) |
{ |
method_oper_t *mo; |
|
mo = hash_table_get_instance(item, method_oper_t, link); |
|
return key[0] == mo->method; |
} |
|
void method_oper_remove_callback(link_t *item) |
{ |
} |
|
hash_table_operations_t method_oper_ops = { |
.hash = method_oper_hash, |
.compare = method_oper_compare, |
.remove_callback = method_oper_remove_callback |
}; |
|
|
void proto_init(void) |
{ |
hash_table_create(&srv_proto, SRV_PROTO_TABLE_CHAINS, 1, |
83,5 → 117,49 |
return sp->proto; |
} |
|
static void proto_struct_init(proto_t *proto, char *name) |
{ |
proto->name = name; |
hash_table_create(&proto->method_oper, SRV_PROTO_TABLE_CHAINS, 1, |
&method_oper_ops); |
} |
|
proto_t *proto_new(char *name) |
{ |
proto_t *p; |
|
p = malloc(sizeof(proto_t)); |
proto_struct_init(p, name); |
|
return p; |
} |
|
void proto_add_oper(proto_t *proto, int method, oper_t *oper) |
{ |
method_oper_t *mo; |
unsigned long key; |
|
mo = malloc(sizeof(method_oper_t)); |
mo->method = method; |
mo->oper = oper; |
key = method; |
|
hash_table_insert(&proto->method_oper, &key, &mo->link); |
} |
|
oper_t *proto_get_oper(proto_t *proto, int method) |
{ |
unsigned long key; |
link_t *item; |
method_oper_t *mo; |
|
key = method; |
item = hash_table_find(&proto->method_oper, &key); |
if (item == NULL) return NULL; |
|
mo = hash_table_get_instance(item, method_oper_t, link); |
return mo->oper; |
} |
|
/** @} |
*/ |