|
|
@@ -38,22 +38,160 @@
|
|
|
struct NCDModuleInst_s;
|
|
|
struct NCDModuleProcess_s;
|
|
|
|
|
|
+/**
|
|
|
+ * Function called to inform the interpeter of state changes of the
|
|
|
+ * module instance.
|
|
|
+ * Possible events are:
|
|
|
+ *
|
|
|
+ * - NCDMODULE_EVENT_UP: the instance came up.
|
|
|
+ * The instance was in down state.
|
|
|
+ * The instance enters up state.
|
|
|
+ *
|
|
|
+ * - NCDMODULE_EVENT_DOWN: the instance went down.
|
|
|
+ * The instance was in up state.
|
|
|
+ * The instance enters down state.
|
|
|
+ *
|
|
|
+ * After the instance goes down, the interpreter should eventually call
|
|
|
+ * {@link NCDModuleInst_Clean} or {@link NCDModuleInst_Die}, unless
|
|
|
+ * the module goes up again.
|
|
|
+ *
|
|
|
+ * - NCDMODULE_EVENT_DEAD: the module died.
|
|
|
+ * The instance enters dead state.
|
|
|
+ *
|
|
|
+ * This function is not being called in event context. The interpreter should
|
|
|
+ * only update its internal state, and visibly react only via jobs that it pushes
|
|
|
+ * from within this function. The only exception is that it may free the
|
|
|
+ * instance from within the NCDMODULE_EVENT_DEAD event.
|
|
|
+ *
|
|
|
+ * @param user as in {@link NCDModuleInst_Init}
|
|
|
+ * @param event event number
|
|
|
+ */
|
|
|
typedef void (*NCDModuleInst_func_event) (void *user, int event);
|
|
|
-typedef int (*NCDModuleInst_func_getvar) (void *user, const char *varname, NCDValue *out);
|
|
|
-typedef struct NCDModuleInst_s * (*NCDModuleInst_func_getobj) (void *user, const char *objname);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Function called when the module instance wants the interpreter to
|
|
|
+ * resolve a variable from the point of view of its statement.
|
|
|
+ * The instance will not be in dead state.
|
|
|
+ * This function must not have any side effects.
|
|
|
+ *
|
|
|
+ * @param user as in {@link NCDModuleInst_Init}
|
|
|
+ * @param name name of the variable
|
|
|
+ * @param out on success, the interpreter should initialize the value here
|
|
|
+ * @return 1 on success, 0 on failure
|
|
|
+ */
|
|
|
+typedef int (*NCDModuleInst_func_getvar) (void *user, const char *name, NCDValue *out);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Function called when the module instance wants the interpreter to
|
|
|
+ * resolve an object from the point of view of its statement.
|
|
|
+ * The instance will not be in dead state.
|
|
|
+ * This function must not have any side effects.
|
|
|
+ *
|
|
|
+ * @param user as in {@link NCDModuleInst_Init}
|
|
|
+ * @param name name of the object
|
|
|
+ * @return object, or NULL on failure
|
|
|
+ */
|
|
|
+typedef struct NCDModuleInst_s * (*NCDModuleInst_func_getobj) (void *user, const char *name);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Function called when the module instance wants the interpreter to
|
|
|
+ * create a new process backend from a process template.
|
|
|
+ * The instance will not be in dead state.
|
|
|
+ *
|
|
|
+ * On success, the interpreter must have called {@link NCDModuleProcess_Interp_SetHandlers}
|
|
|
+ * from within this function, to allow communication with the controller of the process.
|
|
|
+ * On success, the new process backend enters down state.
|
|
|
+ *
|
|
|
+ * This function is not being called in event context. The interpreter should
|
|
|
+ * only update its internal state, and visibly react only via jobs that it pushes
|
|
|
+ * from within this function.
|
|
|
+ *
|
|
|
+ * @param user as in {@link NCDModuleInst_Init}
|
|
|
+ * @param p handle for the new process backend
|
|
|
+ * @param template_name name of the template to create the process from
|
|
|
+ * @param args process arguments. On success, the arguments become owned
|
|
|
+ * by the interpreter. On failure, the interpreter must leave
|
|
|
+ * them unchanged.
|
|
|
+ * @return 1 on success, 0 on failure
|
|
|
+ */
|
|
|
typedef int (*NCDModuleInst_func_initprocess) (void *user, struct NCDModuleProcess_s *p, const char *template_name, NCDValue args);
|
|
|
|
|
|
#define NCDMODULEPROCESS_EVENT_UP 1
|
|
|
#define NCDMODULEPROCESS_EVENT_DOWN 2
|
|
|
#define NCDMODULEPROCESS_EVENT_TERMINATED 3
|
|
|
|
|
|
+/**
|
|
|
+ * Handler which reports process state changes from the interpreter.
|
|
|
+ * Possible events are:
|
|
|
+ *
|
|
|
+ * - NCDMODULEPROCESS_EVENT_UP: the process went up.
|
|
|
+ * The process was in down state.
|
|
|
+ * The process enters up state.
|
|
|
+ *
|
|
|
+ * - NCDMODULEPROCESS_EVENT_DOWN: the process went down.
|
|
|
+ * The process was in up state.
|
|
|
+ * The process enters waiting state.
|
|
|
+ *
|
|
|
+ * NOTE: the process enters waiting state, NOT down state, and is paused.
|
|
|
+ * To allow the process to continue, call {@link NCDModuleProcess_Continue}.
|
|
|
+ *
|
|
|
+ * - NCDMODULEPROCESS_EVENT_TERMINATED: the process terminated.
|
|
|
+ * The process was in terminating state.
|
|
|
+ * The process enters terminated state.
|
|
|
+ *
|
|
|
+ * @param user as in {@link NCDModuleProcess_Init}
|
|
|
+ * @param event event number
|
|
|
+ */
|
|
|
typedef void (*NCDModuleProcess_handler_event) (void *user, int event);
|
|
|
|
|
|
#define NCDMODULEPROCESS_INTERP_EVENT_CONTINUE 1
|
|
|
#define NCDMODULEPROCESS_INTERP_EVENT_TERMINATE 2
|
|
|
|
|
|
+/**
|
|
|
+ * Function called to report process backend requests to the interpreter.
|
|
|
+ * Possible events are:
|
|
|
+ *
|
|
|
+ * - NCDMODULEPROCESS_INTERP_EVENT_CONTINUE: the process can continue.
|
|
|
+ * The process backend was in waiting state.
|
|
|
+ * The process backend enters down state.
|
|
|
+ *
|
|
|
+ * - NCDMODULEPROCESS_INTERP_EVENT_TERMINATE: the process should terminate.
|
|
|
+ * The process backend was in down, up or waiting state.
|
|
|
+ * The process backend enters terminating state.
|
|
|
+ *
|
|
|
+ * The interpreter should call {@link NCDModuleProcess_Interp_Terminated}
|
|
|
+ * when the process terminates.
|
|
|
+ *
|
|
|
+ * This function is not being called in event context. The interpreter should
|
|
|
+ * only update its internal state, and visibly react only via jobs that it pushes
|
|
|
+ * from within this function.
|
|
|
+ *
|
|
|
+ * @param user as in {@link NCDModuleProcess_Interp_SetHandlers}
|
|
|
+ * @param event event number
|
|
|
+ */
|
|
|
typedef void (*NCDModuleProcess_interp_func_event) (void *user, int event);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Function called to have the interpreter resolve a variable within the process
|
|
|
+ * of a process backend.
|
|
|
+ * This function must not have any side effects.
|
|
|
+ *
|
|
|
+ * @param user as in {@link NCDModuleProcess_Interp_SetHandlers}
|
|
|
+ * @param name name of the variable
|
|
|
+ * @param out on success, the interpreter should initialize the value here
|
|
|
+ * @return 1 on success, 0 on failure
|
|
|
+ */
|
|
|
typedef int (*NCDModuleProcess_interp_func_getvar) (void *user, const char *name, NCDValue *out);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Function called to have the interpreter resolve an object within the process
|
|
|
+ * of a process backend.
|
|
|
+ * This function must not have any side effects.
|
|
|
+ *
|
|
|
+ * @param user as in {@link NCDModuleProcess_Interp_SetHandlers}
|
|
|
+ * @param name name of the object
|
|
|
+ * @return object, or NULL on failure
|
|
|
+ */
|
|
|
typedef struct NCDModuleInst_s * (*NCDModuleProcess_interp_func_getobj) (void *user, const char *name);
|
|
|
|
|
|
struct NCDModule;
|
|
|
@@ -64,6 +202,12 @@ struct NCDModuleInitParams {
|
|
|
NCDUdevManager *umanager;
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * Module instance.
|
|
|
+ * The module instance is initialized by the interpreter by calling
|
|
|
+ * {@link NCDModuleInst_Init}. It is implemented by a module backend
|
|
|
+ * specified in a {@link NCDModule}.
|
|
|
+ */
|
|
|
typedef struct NCDModuleInst_s {
|
|
|
const struct NCDModule *m;
|
|
|
struct NCDModuleInst_s *method_object;
|
|
|
@@ -87,6 +231,10 @@ typedef struct NCDModuleInst_s {
|
|
|
DebugObject d_obj;
|
|
|
} NCDModuleInst;
|
|
|
|
|
|
+/**
|
|
|
+ * Process created from a process template on behalf of a module backend
|
|
|
+ * instance, implemented by the interpreter.
|
|
|
+ */
|
|
|
typedef struct NCDModuleProcess_s {
|
|
|
NCDModuleInst *n;
|
|
|
void *user;
|
|
|
@@ -100,61 +248,424 @@ typedef struct NCDModuleProcess_s {
|
|
|
DebugObject d_obj;
|
|
|
} NCDModuleProcess;
|
|
|
|
|
|
+/**
|
|
|
+ * Initializes an instance of an NCD module.
|
|
|
+ * The instance is initialized in down state.
|
|
|
+ *
|
|
|
+ * This and other non-Backend methods are the interpreter interface.
|
|
|
+ * The Backend methods are the module backend interface and are documented
|
|
|
+ * independently with their own logical states.
|
|
|
+ *
|
|
|
+ * @param n the instance
|
|
|
+ * @param m structure of module functions implementing the module backend
|
|
|
+ * @param method_object the base module if the module being initialized is a method, otherwise NULL.
|
|
|
+ * The caller must ensure that this module is of the type expected by the module
|
|
|
+ * being initialized.
|
|
|
+ * @param args arguments to the module. Must be a NCDVALUE_LIST value. Must be available as long as
|
|
|
+ * the instance is freed.
|
|
|
+ * @param reactor reactor we live in
|
|
|
+ * @param manager process manager
|
|
|
+ * @param umanager udev manager
|
|
|
+ * @param user argument to callback functions
|
|
|
+ * @param func_event callback to report state changes
|
|
|
+ * @param func_getvar callback to resolve variables from the viewpoint of the instance
|
|
|
+ * @param func_getobj callback to resolve objects from the viewpoint of the instance
|
|
|
+ * @param logfunc log function which appends a log prefix with {@link BLog_Append}
|
|
|
+ */
|
|
|
void NCDModuleInst_Init (NCDModuleInst *n, const struct NCDModule *m, NCDModuleInst *method_object, NCDValue *args, BReactor *reactor, BProcessManager *manager, NCDUdevManager *umanager, void *user,
|
|
|
NCDModuleInst_func_event func_event,
|
|
|
NCDModuleInst_func_getvar func_getvar,
|
|
|
NCDModuleInst_func_getobj func_getobj,
|
|
|
NCDModuleInst_func_initprocess func_initprocess,
|
|
|
BLog_logfunc logfunc);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Frees the instance.
|
|
|
+ * The instance must be in dead state.
|
|
|
+ *
|
|
|
+ * @param n the instance
|
|
|
+ */
|
|
|
void NCDModuleInst_Free (NCDModuleInst *n);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Requests the instance to die.
|
|
|
+ * The instance must be in down or up state.
|
|
|
+ * The instance enters dying state.
|
|
|
+ *
|
|
|
+ * @param n the instance
|
|
|
+ */
|
|
|
void NCDModuleInst_Die (NCDModuleInst *n);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Informs the module that it is in a clean state to proceed.
|
|
|
+ * The instance must be in down state.
|
|
|
+ *
|
|
|
+ * @param n the instance
|
|
|
+ */
|
|
|
void NCDModuleInst_Clean (NCDModuleInst *n);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Resolves a variable within the instance.
|
|
|
+ * The instance must be in up state.
|
|
|
+ * This function does not have any side effects.
|
|
|
+ *
|
|
|
+ * @param n the instance
|
|
|
+ * @param name name of the variable to resolve
|
|
|
+ * @param out the value will be initialized here if successful
|
|
|
+ * @return 1 on success, 0 on failure
|
|
|
+ */
|
|
|
int NCDModuleInst_GetVar (NCDModuleInst *n, const char *name, NCDValue *out) WARN_UNUSED;
|
|
|
-NCDModuleInst * NCDModuleInst_GetObj (NCDModuleInst *n, const char *objname) WARN_UNUSED;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Resolves an object within the instance.
|
|
|
+ * The instance must be in up state.
|
|
|
+ * This function does not have any side effects.
|
|
|
+ *
|
|
|
+ * @param n the instance
|
|
|
+ * @param name name of the object to resolve
|
|
|
+ * @return module instance, or NULL on failure
|
|
|
+ */
|
|
|
+NCDModuleInst * NCDModuleInst_GetObj (NCDModuleInst *n, const char *name) WARN_UNUSED;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Checks whether the module terminated unsuccessfully.
|
|
|
+ * The instance must be in dead state.
|
|
|
+ *
|
|
|
+ * @param n the instance
|
|
|
+ * @return 1 if module terminated unsuccessfully, 0 if successfully
|
|
|
+ */
|
|
|
int NCDModuleInst_HaveError (NCDModuleInst *n);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Sets the argument passed to handlers of a module backend instance.
|
|
|
+ *
|
|
|
+ * @param n backend instance handle
|
|
|
+ * @param user value to pass to future handlers for this backend instance
|
|
|
+ */
|
|
|
void NCDModuleInst_Backend_SetUser (NCDModuleInst *n, void *user);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Puts the backend instance into up state.
|
|
|
+ * The instance must be in down state.
|
|
|
+ * The instance enters up state.
|
|
|
+ *
|
|
|
+ * @param n backend instance handle
|
|
|
+ */
|
|
|
void NCDModuleInst_Backend_Up (NCDModuleInst *n);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Puts the backend instance into down state.
|
|
|
+ * The instance must be in up state.
|
|
|
+ * The instance enters down state.
|
|
|
+ *
|
|
|
+ * @param n backend instance handle
|
|
|
+ */
|
|
|
void NCDModuleInst_Backend_Down (NCDModuleInst *n);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Destroys the backend instance.
|
|
|
+ * The backend instance handle becomes invalid and must not be used from
|
|
|
+ * the backend any longer.
|
|
|
+ *
|
|
|
+ * @param n backend instance handle
|
|
|
+ */
|
|
|
void NCDModuleInst_Backend_Dead (NCDModuleInst *n);
|
|
|
-int NCDModuleInst_Backend_GetVar (NCDModuleInst *n, const char *varname, NCDValue *out) WARN_UNUSED;
|
|
|
-NCDModuleInst * NCDModuleInst_Backend_GetObj (NCDModuleInst *n, const char *objname) WARN_UNUSED;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Resolves a variable for a backend instance, from the point of the instance's
|
|
|
+ * statement in the containing process.
|
|
|
+ *
|
|
|
+ * @param n backend instance handle
|
|
|
+ * @param name name of the variable to resolve
|
|
|
+ * @param out the value will be initialized here if successful
|
|
|
+ * @return 1 on success, 0 on failure
|
|
|
+ */
|
|
|
+int NCDModuleInst_Backend_GetVar (NCDModuleInst *n, const char *name, NCDValue *out) WARN_UNUSED;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Resolves an object for a backend instance, from the point of the instance's
|
|
|
+ * statement in the containing process.
|
|
|
+ *
|
|
|
+ * @param n backend instance handle
|
|
|
+ * @param name name of the object to resolve
|
|
|
+ * @return module instance, or NULL on failure
|
|
|
+ */
|
|
|
+NCDModuleInst * NCDModuleInst_Backend_GetObj (NCDModuleInst *n, const char *name) WARN_UNUSED;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Logs a backend instance message.
|
|
|
+ *
|
|
|
+ * @param n backend instance handle
|
|
|
+ * @param channel log channel
|
|
|
+ * @param level loglevel
|
|
|
+ * @param fmt format string as in printf, arguments follow
|
|
|
+ */
|
|
|
void NCDModuleInst_Backend_Log (NCDModuleInst *n, int channel, int level, const char *fmt, ...);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Sets the error flag for the module instance.
|
|
|
+ * The error flag only has no effect until the backend calls
|
|
|
+ * {@link NCDModuleInst_Backend_Dead}.
|
|
|
+ *
|
|
|
+ * @param n backend instance handle
|
|
|
+ */
|
|
|
void NCDModuleInst_Backend_SetError (NCDModuleInst *n);
|
|
|
|
|
|
+/**
|
|
|
+ * Initializes a process in the interpreter from a process template.
|
|
|
+ * This must be called on behalf of a module backend instance.
|
|
|
+ * The process is initializes in down state.
|
|
|
+ *
|
|
|
+ * @param o the process
|
|
|
+ * @param n backend instance whose interpreter will be providing the process
|
|
|
+ * @param template_name name of the process template
|
|
|
+ * @param args arguments to the process. On success, the arguments become owned
|
|
|
+ * by the interpreter. On failure, they are left untouched.
|
|
|
+ * @param user argument to handlers
|
|
|
+ * @param handler_event handler which reports events about the process from the
|
|
|
+ * interpreter
|
|
|
+ * @return 1 on success, 0 on failure
|
|
|
+ */
|
|
|
int NCDModuleProcess_Init (NCDModuleProcess *o, NCDModuleInst *n, const char *template_name, NCDValue args, void *user, NCDModuleProcess_handler_event handler_event);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Frees the process.
|
|
|
+ * The process must be in terminated state.
|
|
|
+ *
|
|
|
+ * @param o the process
|
|
|
+ */
|
|
|
void NCDModuleProcess_Free (NCDModuleProcess *o);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Continues the process after the process went down.
|
|
|
+ * The process must be in waiting state.
|
|
|
+ * The process enters down state.
|
|
|
+ *
|
|
|
+ * @param o the process
|
|
|
+ */
|
|
|
void NCDModuleProcess_Continue (NCDModuleProcess *o);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Requests the process to terminate.
|
|
|
+ * The process must be in down, up or waiting state.
|
|
|
+ * The process enters terminating state.
|
|
|
+ *
|
|
|
+ * @param o the process
|
|
|
+ */
|
|
|
void NCDModuleProcess_Terminate (NCDModuleProcess *o);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Resolves a variable within the process from the point
|
|
|
+ * at the end of the process.
|
|
|
+ * This function has no side effects.
|
|
|
+ *
|
|
|
+ * @param o the process
|
|
|
+ * @param name name of the variable to resolve
|
|
|
+ * @param out the value will be initialized here if successful
|
|
|
+ * @return 1 on success, 0 on failure
|
|
|
+ */
|
|
|
int NCDModuleProcess_GetVar (NCDModuleProcess *o, const char *name, NCDValue *out) WARN_UNUSED;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Resolves an object within the process from the point
|
|
|
+ * at the end of the process.
|
|
|
+ * This function has no side effects.
|
|
|
+ *
|
|
|
+ * @param o the process
|
|
|
+ * @param name name of the object to resolve
|
|
|
+ * @return module instance, or NULL on failure
|
|
|
+ */
|
|
|
NCDModuleInst * NCDModuleProcess_GetObj (NCDModuleProcess *o, const char *name) WARN_UNUSED;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Sets callback functions for the interpreter to implement the
|
|
|
+ * process backend.
|
|
|
+ * Must be called from within {@link NCDModuleInst_func_initprocess}
|
|
|
+ * if success is to be reported there.
|
|
|
+ *
|
|
|
+ * @param o process backend handle, as in {@link NCDModuleInst_func_initprocess}
|
|
|
+ * @param interp_user argument to callback functions
|
|
|
+ * @param interp_func_event function for reporting continue/terminate requests
|
|
|
+ * @param interp_func_getvar function for resolving variables within the process
|
|
|
+ * @param interp_func_getobj function for resolving objects within the process
|
|
|
+ */
|
|
|
void NCDModuleProcess_Interp_SetHandlers (NCDModuleProcess *o, void *interp_user,
|
|
|
NCDModuleProcess_interp_func_event interp_func_event,
|
|
|
NCDModuleProcess_interp_func_getvar interp_func_getvar,
|
|
|
NCDModuleProcess_interp_func_getobj interp_func_getobj);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Reports the process backend as up.
|
|
|
+ * The process backend must be in down state.
|
|
|
+ * The process backend enters up state.
|
|
|
+ *
|
|
|
+ * @param o process backend handle
|
|
|
+ */
|
|
|
void NCDModuleProcess_Interp_Up (NCDModuleProcess *o);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Reports the process backend as down.
|
|
|
+ * The process backend must be in up state.
|
|
|
+ * The process backend enters waiting state.
|
|
|
+ *
|
|
|
+ * NOTE: the backend enters waiting state, NOT down state. The interpreter should
|
|
|
+ * pause the process until {@link NCDModuleProcess_interp_func_event} reports
|
|
|
+ * NCDMODULEPROCESS_INTERP_EVENT_CONTINUE, unless termination is requested via
|
|
|
+ * NCDMODULEPROCESS_INTERP_EVENT_TERMINATE.
|
|
|
+ *
|
|
|
+ * @param o process backend handle
|
|
|
+ */
|
|
|
void NCDModuleProcess_Interp_Down (NCDModuleProcess *o);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Reports termination of the process backend.
|
|
|
+ * The process backend must be in terminating state.
|
|
|
+ * The process backend handle becomes invalid and must not be used
|
|
|
+ * by the interpreter any longer.
|
|
|
+ *
|
|
|
+ * @param o process backend handle
|
|
|
+ */
|
|
|
void NCDModuleProcess_Interp_Terminated (NCDModuleProcess *o);
|
|
|
|
|
|
+/**
|
|
|
+ * Function called before any instance of any backend in a module
|
|
|
+ * group is created;
|
|
|
+ *
|
|
|
+ * @param params structure containing global resources, in particular
|
|
|
+ * {@link BReactor}, {@link BProcessManager} and {@link NCDUdevManager}
|
|
|
+ * @return 1 on success, 0 on failure
|
|
|
+ */
|
|
|
typedef int (*NCDModule_func_globalinit) (const struct NCDModuleInitParams params);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Function called to clean up after {@link NCDModule_func_globalinit} and modules
|
|
|
+ * in a module group.
|
|
|
+ * There are no backend instances alive from this module group.
|
|
|
+ */
|
|
|
typedef void (*NCDModule_func_globalfree) (void);
|
|
|
-typedef void (*NCDModule_func_new) (NCDModuleInst *params);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Handler called to create an new module backend instance.
|
|
|
+ * The backend is initialized in down state.
|
|
|
+ *
|
|
|
+ * This handler should call {@link NCDModuleInst_Backend_SetUser} to provide
|
|
|
+ * an argument for handlers of this backend instance.
|
|
|
+ *
|
|
|
+ * If the backend fails initialization, this function should report the backend
|
|
|
+ * instance to have died with error by calling {@link NCDModuleInst_Backend_SetError}
|
|
|
+ * and {@link NCDModuleInst_Backend_Dead}.
|
|
|
+ *
|
|
|
+ * @param i module backend instance handler. The backend may only use this handle via
|
|
|
+ * the Backend functions of {@link NCDModuleInst}.
|
|
|
+ */
|
|
|
+typedef void (*NCDModule_func_new) (NCDModuleInst *i);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Handler called to request termination of a backend instance.
|
|
|
+ * The backend instance was in down or up state.
|
|
|
+ * The backend instance enters dying state.
|
|
|
+ *
|
|
|
+ * @param o as in {@link NCDModuleInst_Backend_SetUser}, or NULL by default
|
|
|
+ */
|
|
|
typedef void (*NCDModule_func_die) (void *o);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Function called to resolve a variable within a backend instance.
|
|
|
+ * The backend instance is in up state.
|
|
|
+ * This function must not have any side effects.
|
|
|
+ *
|
|
|
+ * @param o as in {@link NCDModuleInst_Backend_SetUser}, or NULL by default
|
|
|
+ * @param name name of the variable to resolve
|
|
|
+ * @param out on success, the backend should initialize the value here
|
|
|
+ * @return 1 on success, 0 on failure
|
|
|
+ */
|
|
|
typedef int (*NCDModule_func_getvar) (void *o, const char *name, NCDValue *out);
|
|
|
-typedef NCDModuleInst * (*NCDModule_func_getobj) (void *o, const char *objname);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Function called to resolve an object within a backend instance.
|
|
|
+ * The backend instance is in up state.
|
|
|
+ * This function must not have any side effects.
|
|
|
+ *
|
|
|
+ * @param o as in {@link NCDModuleInst_Backend_SetUser}, or NULL by default
|
|
|
+ * @param name name of the object to resolve
|
|
|
+ * @return object, or NULL on failure
|
|
|
+ */
|
|
|
+typedef NCDModuleInst * (*NCDModule_func_getobj) (void *o, const char *name);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Handler called when the module instance is in a clean state.
|
|
|
+ * This means that all statements preceding it in the process are
|
|
|
+ * up, this statement is down, and all following statements are
|
|
|
+ * uninitialized. When a backend instance goes down, it is guaranteed,
|
|
|
+ * as long as it stays down, that either this will be called or
|
|
|
+ * termination will be requested with {@link NCDModule_func_die}.
|
|
|
+ * The backend instance was in down state.
|
|
|
+ *
|
|
|
+ * @param o as in {@link NCDModuleInst_Backend_SetUser}, or NULL by default
|
|
|
+ */
|
|
|
typedef void (*NCDModule_func_clean) (void *o);
|
|
|
|
|
|
+/**
|
|
|
+ * Structure encapsulating the implementation of a module backend.
|
|
|
+ */
|
|
|
struct NCDModule {
|
|
|
+ /**
|
|
|
+ * Type string of the backend. This is either a plain name,
|
|
|
+ * or "type_name::method_name" for a method operating on a backend instance
|
|
|
+ * of type type_name.
|
|
|
+ */
|
|
|
const char *type;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Function called to create an new backend instance.
|
|
|
+ */
|
|
|
NCDModule_func_new func_new;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Function called to request termination of a backend instance.
|
|
|
+ */
|
|
|
NCDModule_func_die func_die;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Function called to resolve a variable within the backend instance.
|
|
|
+ * May be NULL.
|
|
|
+ */
|
|
|
NCDModule_func_getvar func_getvar;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Function called to resolve an object within the backend instance.
|
|
|
+ * May be NULL.
|
|
|
+ */
|
|
|
NCDModule_func_getobj func_getobj;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Function called when the backend instance is in a clean state.
|
|
|
+ * May be NULL.
|
|
|
+ */
|
|
|
NCDModule_func_clean func_clean;
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * Structure encapsulating a group of module backend implementations,
|
|
|
+ * with global init and free functions.
|
|
|
+ */
|
|
|
struct NCDModuleGroup {
|
|
|
+ /**
|
|
|
+ * Function called before any instance of any module backend in this
|
|
|
+ * group is crated. May be NULL.
|
|
|
+ */
|
|
|
NCDModule_func_globalinit func_globalinit;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Function called to clean up after {@link NCDModule_func_globalinit}.
|
|
|
+ * May be NULL.
|
|
|
+ */
|
|
|
NCDModule_func_globalfree func_globalfree;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Array of module backends. The array must be terminated with a
|
|
|
+ * structure that has a NULL type member.
|
|
|
+ */
|
|
|
const struct NCDModule *modules;
|
|
|
};
|
|
|
|