mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-16 01:40:52 +08:00
87 lines
2.2 KiB
C
87 lines
2.2 KiB
C
#include "lib_acl.h"
|
|
#include "service.h"
|
|
|
|
typedef struct {
|
|
ACL_DLL_HANDLE handle;
|
|
} DLL_HANDLE;
|
|
|
|
static ACL_FIFO *__handles = NULL;
|
|
|
|
void service_load(ACL_FIFO *service_modules, const char *dlname)
|
|
{
|
|
const char *myname = "service_load";
|
|
DLL_HANDLE *dll_handle;
|
|
ACL_DLL_HANDLE handle;
|
|
MODULE_SERVICE *module_ptr, module;
|
|
|
|
if (dlname == NULL || *dlname == 0)
|
|
return;
|
|
|
|
acl_msg_info("%s(%d): begin load %s now ...", __FUNCTION__, __LINE__, dlname);
|
|
handle = acl_dlopen(dlname);
|
|
if (handle == NULL) {
|
|
acl_msg_error("%s(%d): load %s error(%s)",
|
|
myname, __LINE__, dlname, acl_last_serror());
|
|
return;
|
|
}
|
|
|
|
acl_msg_info("%s(%d): load %s ok.", __FUNCTION__, __LINE__, dlname);
|
|
|
|
/* Ìí¼ÓÇëÇó¹ýÂËÆ÷ */
|
|
|
|
module.mod_init = (module_service_init_fn) (intptr_t)
|
|
acl_dlsym(handle, "module_service_init");
|
|
module.mod_create = (module_service_create_fn) (intptr_t)
|
|
acl_dlsym(handle, "module_service_create");
|
|
module.mod_main = (module_service_main_fn) (intptr_t)
|
|
acl_dlsym(handle, "module_service_main");
|
|
if (module.mod_create && module.mod_main) {
|
|
module_ptr = (MODULE_SERVICE*) acl_mycalloc(1, sizeof(MODULE_SERVICE));
|
|
module_ptr->mod_init = module.mod_init;
|
|
module_ptr->mod_create = module.mod_create;
|
|
module_ptr->mod_main = module.mod_main;
|
|
acl_fifo_push(service_modules, module_ptr);
|
|
}
|
|
|
|
dll_handle = (DLL_HANDLE*) acl_mycalloc(1, sizeof(DLL_HANDLE));
|
|
dll_handle->handle = handle;
|
|
if (__handles == NULL)
|
|
__handles = acl_fifo_new();
|
|
acl_fifo_push(__handles, dll_handle);
|
|
}
|
|
|
|
void service_load_all(ACL_FIFO *service_modules, const char *dlnames)
|
|
{
|
|
ACL_ARGV *argv;
|
|
ACL_ITER iter;
|
|
|
|
if (dlnames == NULL || *dlnames == 0)
|
|
return;
|
|
|
|
argv = acl_argv_split(dlnames, " \t;");
|
|
acl_foreach(iter, argv) {
|
|
const char *dlname = (const char*) iter.data;
|
|
|
|
service_load(service_modules, dlname);
|
|
}
|
|
|
|
acl_argv_free(argv);
|
|
}
|
|
|
|
void service_unload_all()
|
|
{
|
|
ACL_ITER iter;
|
|
|
|
if (__handles == NULL)
|
|
return;
|
|
|
|
acl_foreach(iter, __handles) {
|
|
DLL_HANDLE *handle = (DLL_HANDLE*) iter.data;
|
|
acl_dlclose(handle->handle);
|
|
acl_myfree(handle);
|
|
}
|
|
|
|
acl_fifo_free(__handles, NULL);
|
|
__handles = NULL;
|
|
}
|