diff --git a/runtime/include/module_database.h b/runtime/include/module_database.h index c966ed8..8336a4e 100644 --- a/runtime/include/module_database.h +++ b/runtime/include/module_database.h @@ -16,11 +16,31 @@ extern int module_database_free_offset; static inline int 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); + 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); + 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); 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; }