associate file descriptors with user defined data
This small library permits to associate user defined data to file descriptors. This library is thread safe.
The library uses a hash table.
The function fduserdata_create
sets up the data structure.
e.g.
FDUSERDATA table = fduserdata_create(0);
The optional parameter (here 0) is the size of the hashtable. The default size if 64.
When the data structure is no longer needed it can be deleted/freed using:
fduserdata_destroy(table);
Allocate a struct mydata
element connected to the file descriptor fd
in table
:
struct mydata *data = fduserdata_new(table, fd, struct mydata);
// mydata.xxxx = yyyy
// intialize all mydata fields
fduserdata_put(data)
Please note that fduserdata_put
is required to close the critical section. No other threads can add, read or modify elements in table
until the current element has been completely initialized and fduserdata_put
has been called.
struct mydata *fddata = fduserdata_get(table, fd);
if (fddata) {
//... read/update user defined data (data->fields)
fduserdata_put(data);
}
Again fduserdata_put
closes the critical section. Slow or blocking operations should not take place between fduserdata_get
and fduserdata_put
struct mydata *fddata = fduserdata_get(table, fd);
if (fddata)
fduserdata_del(data);
fduserdata_get
(or fduserdata_new
) is needed before fduserdata_del
because fduserdata_del
deletes the element while it closes the critical section.
(in this way it is not possible to delete an element twice).
This is a sequence of commands that can be used to compile install the library.
mkdir build
cd build
cmake ..
make
sudo make install