1 |
dpavlin |
1 |
/* |
2 |
|
|
* IPFlow Collector |
3 |
|
|
* Copyright (c) 2003 Christophe Fillot. |
4 |
|
|
* E-mail: cf@utc.fr |
5 |
|
|
* |
6 |
|
|
* registry.h: Object Registry. |
7 |
|
|
*/ |
8 |
|
|
|
9 |
|
|
#ifndef __REGISTRY_H__ |
10 |
|
|
#define __REGISTRY_H__ 1 |
11 |
|
|
|
12 |
|
|
static const char rcsid_registry[] = "$Id$"; |
13 |
|
|
|
14 |
|
|
#include <sys/types.h> |
15 |
|
|
#include <sys/time.h> |
16 |
|
|
#include <pthread.h> |
17 |
|
|
|
18 |
|
|
#include "mempool.h" |
19 |
|
|
|
20 |
|
|
#define REGISTRY_HT_NAME_ENTRIES 1024 |
21 |
|
|
#define REGISTRY_MAX_TYPES 256 |
22 |
|
|
|
23 |
|
|
/* Object types for Registry */ |
24 |
|
|
enum { |
25 |
|
|
OBJ_TYPE_VM, /* Virtual machine */ |
26 |
|
|
OBJ_TYPE_NIO, /* Network IO descriptor */ |
27 |
|
|
OBJ_TYPE_NIO_BRIDGE, /* Network IO bridge */ |
28 |
|
|
OBJ_TYPE_FRSW, /* Frame-Relay switch */ |
29 |
|
|
OBJ_TYPE_ATMSW, /* ATM switch */ |
30 |
|
|
OBJ_TYPE_ETHSW, /* Ethernet switch */ |
31 |
|
|
}; |
32 |
|
|
|
33 |
|
|
/* Registry entry */ |
34 |
|
|
typedef struct registry_entry registry_entry_t; |
35 |
|
|
struct registry_entry { |
36 |
|
|
char *name; |
37 |
|
|
void *data; |
38 |
|
|
int object_type; |
39 |
|
|
int ref_count; |
40 |
|
|
registry_entry_t *hname_next,*hname_prev; |
41 |
|
|
registry_entry_t *htype_next,*htype_prev; |
42 |
|
|
}; |
43 |
|
|
|
44 |
|
|
/* Registry info */ |
45 |
|
|
typedef struct registry registry_t; |
46 |
|
|
struct registry { |
47 |
|
|
pthread_mutex_t lock; |
48 |
|
|
mempool_t mp; |
49 |
|
|
int ht_name_entries,ht_type_entries; |
50 |
|
|
registry_entry_t *ht_names; /* Hash table for names */ |
51 |
|
|
registry_entry_t *ht_types; /* Hash table for types */ |
52 |
|
|
}; |
53 |
|
|
|
54 |
|
|
/* Registry "foreach" callback */ |
55 |
|
|
typedef void (*registry_foreach)(registry_entry_t *entry,void *opt_arg, |
56 |
|
|
int *err); |
57 |
|
|
|
58 |
|
|
/* Registry "exec" callback */ |
59 |
|
|
typedef int (*registry_exec)(void *data,void *opt_arg); |
60 |
|
|
|
61 |
|
|
/* Initialize registry */ |
62 |
|
|
int registry_init(void); |
63 |
|
|
|
64 |
|
|
/* Remove a registry entry */ |
65 |
|
|
void registry_remove_entry(registry_entry_t *entry); |
66 |
|
|
|
67 |
|
|
/* Add a new entry to the registry */ |
68 |
|
|
int registry_add(char *name,int object_type,void *data); |
69 |
|
|
|
70 |
|
|
/* Delete an entry from the registry */ |
71 |
|
|
int registry_delete(char *name,int object_type); |
72 |
|
|
|
73 |
|
|
/* Find an entry (increment reference count) */ |
74 |
|
|
void *registry_find(char *name,int object_type); |
75 |
|
|
|
76 |
|
|
/* Check if entry exists (does not change reference count) */ |
77 |
|
|
void *registry_exists(char *name,int object_type); |
78 |
|
|
|
79 |
|
|
/* Release a reference of an entry (decrement the reference count) */ |
80 |
|
|
int registry_unref(char *name,int object_type); |
81 |
|
|
|
82 |
|
|
/* |
83 |
|
|
* Execute action on an object if its reference count is less or equal to |
84 |
|
|
* the specified count. |
85 |
|
|
*/ |
86 |
|
|
int registry_exec_refcount(char *name,int object_type,int max_ref,int reg_del, |
87 |
|
|
registry_exec obj_action,void *opt_arg); |
88 |
|
|
|
89 |
|
|
/* Delete object if unused */ |
90 |
|
|
int registry_delete_if_unused(char *name,int object_type, |
91 |
|
|
registry_exec obj_destructor, |
92 |
|
|
void *opt_arg); |
93 |
|
|
|
94 |
|
|
/* Execute a callback function for all objects of specified type */ |
95 |
|
|
int registry_foreach_type(int object_type,registry_foreach cb, |
96 |
|
|
void *opt,int *err); |
97 |
|
|
|
98 |
|
|
/* Delete all objects of the specified type */ |
99 |
|
|
int registry_delete_type(int object_type,registry_exec cb,void *opt); |
100 |
|
|
|
101 |
|
|
/* Dump the registry */ |
102 |
|
|
void registry_dump(void); |
103 |
|
|
|
104 |
|
|
#endif |