Flesh out hexagram_module more
This commit is contained in:
parent
e9162b67d1
commit
13cc094cba
2 changed files with 35 additions and 7 deletions
|
@ -1,6 +1,9 @@
|
||||||
#ifndef _HEXAGRAM_MODULE_H
|
#ifndef _HEXAGRAM_MODULE_H
|
||||||
#define _HEXAGRAM_MODULE_H
|
#define _HEXAGRAM_MODULE_H
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <hexagram/dict.h>
|
||||||
#include <hexagram/can.h>
|
#include <hexagram/can.h>
|
||||||
|
|
||||||
typedef struct _hexagram_module hexagram_module;
|
typedef struct _hexagram_module hexagram_module;
|
||||||
|
@ -11,7 +14,8 @@ int hexagram_module_close(hexagram_module *module);
|
||||||
|
|
||||||
const char *hexagram_module_name(hexagram_module *module);
|
const char *hexagram_module_name(hexagram_module *module);
|
||||||
|
|
||||||
int hexagram_module_run(hexagram_module *module, hexagram_can_if *can_if);
|
int hexagram_module_run(hexagram_module *module,
|
||||||
|
hexagram_dict *buses);
|
||||||
|
|
||||||
int hexagram_module_stop(hexagram_module *module);
|
int hexagram_module_stop(hexagram_module *module);
|
||||||
|
|
||||||
|
|
36
src/module.c
36
src/module.c
|
@ -1,8 +1,8 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <dlfcn.h>
|
#include <unistd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/types.h>
|
#include <dlfcn.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
#include <hexagram/module.h>
|
#include <hexagram/module.h>
|
||||||
|
@ -11,8 +11,8 @@ struct _hexagram_module {
|
||||||
const char *soname;
|
const char *soname;
|
||||||
void *handle;
|
void *handle;
|
||||||
char *(*name)();
|
char *(*name)();
|
||||||
int (*run)(hexagram_can_if *can_if);
|
int (*run)(hexagram_dict *buses);
|
||||||
int pid;
|
pid_t pid;
|
||||||
};
|
};
|
||||||
|
|
||||||
hexagram_module *hexagram_module_open(const char *soname) {
|
hexagram_module *hexagram_module_open(const char *soname) {
|
||||||
|
@ -50,10 +50,19 @@ error_malloc:
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *hexagram_module_name(hexagram_module *module) {
|
const char *hexagram_module_name(hexagram_module *module) {
|
||||||
|
if (module->name == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return module->name();
|
return module->name();
|
||||||
}
|
}
|
||||||
|
|
||||||
int hexagram_module_run(hexagram_module *module, hexagram_can_if *can_if) {
|
int hexagram_module_run(hexagram_module *module,
|
||||||
|
hexagram_dict *buses) {
|
||||||
|
if (module->run == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Module already stopped
|
* Module already stopped
|
||||||
*/
|
*/
|
||||||
|
@ -61,7 +70,18 @@ int hexagram_module_run(hexagram_module *module, hexagram_can_if *can_if) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return module->run(can_if);
|
if ((module->pid = fork()) < 0) {
|
||||||
|
goto error_fork;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (module->pid == 0) {
|
||||||
|
exit(module->run(buses));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error_fork:
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hexagram_module_stop(hexagram_module *module) {
|
int hexagram_module_stop(hexagram_module *module) {
|
||||||
|
@ -102,11 +122,15 @@ int hexagram_module_close(hexagram_module *module) {
|
||||||
|
|
||||||
memset(module, '\0', sizeof(*module));
|
memset(module, '\0', sizeof(*module));
|
||||||
|
|
||||||
|
free(module);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error_dlclose:
|
error_dlclose:
|
||||||
memset(module, '\0', sizeof(*module));
|
memset(module, '\0', sizeof(*module));
|
||||||
|
|
||||||
|
free(module);
|
||||||
|
|
||||||
error_stop_module:
|
error_stop_module:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue