|
|
@ -16,11 +16,31 @@ extern int module_database_free_offset;
|
|
|
|
static inline int
|
|
|
|
static inline int
|
|
|
|
module_database_add(struct module *module)
|
|
|
|
module_database_add(struct module *module)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* Assumption: Module is added to database before being listened to
|
|
|
|
|
|
|
|
* TODO: Why does this matter?
|
|
|
|
|
|
|
|
*/
|
|
|
|
assert(module->socket_descriptor == -1);
|
|
|
|
assert(module->socket_descriptor == -1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (module_database_free_offset >= MODULE_MAX_MODULE_COUNT) goto err_no_space;
|
|
|
|
|
|
|
|
|
|
|
|
int f = __sync_fetch_and_add(&module_database_free_offset, 1);
|
|
|
|
int f = __sync_fetch_and_add(&module_database_free_offset, 1);
|
|
|
|
|
|
|
|
if (module_database_free_offset > MODULE_MAX_MODULE_COUNT) {
|
|
|
|
|
|
|
|
__sync_fetch_and_subtract(&module_database_free_offset, 1);
|
|
|
|
|
|
|
|
goto err_no_space;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (module_database_free_offset == MODULE_MAX_MODULE_COUNT) goto err_no_space;
|
|
|
|
assert(f < MODULE_MAX_MODULE_COUNT);
|
|
|
|
assert(f < MODULE_MAX_MODULE_COUNT);
|
|
|
|
module_database[f] = module;
|
|
|
|
module_database[f] = module;
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
rc = 0;
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
|
|
|
|
err_no_space:
|
|
|
|
|
|
|
|
debuglog("Cannot add module. Database is full.\n");
|
|
|
|
|
|
|
|
rc = -1;
|
|
|
|
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|