d1fd04e72a
SYSLIB CHANGES: - SEF framework now supports a new SEF Init request type from RS. 3 different callbacks are available (init_fresh, init_lu, init_restart) to specify initialization code when a service starts fresh, starts after a live update, or restarts. SYSTEM SERVICE CHANGES: - Initialization code for system services is now enclosed in a callback SEF will automatically call at init time. The return code of the callback will tell RS whether the initialization completed successfully. - Each init callback can access information passed by RS to initialize. As of now, each system service has access to the public entries of RS's system process table to gather all the information required to initialize. This design eliminates many existing or potential races at boot time and provides a uniform initialization interface to system services. The same interface will be reused for the upcoming publish/subscribe model to handle dynamic registration / deregistration of system services. VM CHANGES: - Uniform privilege management for all system services. Every service uses the same call mask format. For boot services, VM copies the call mask from init data. For dynamic services, VM still receives the call mask via rs_set_priv call that will be soon replaced by the upcoming publish/subscribe model. RS CHANGES: - The system process table has been reorganized and split into private entries and public entries. Only the latter ones are exposed to system services. - VM call masks are now entirely configured in rs/table.c - RS has now its own slot in the system process table. Only kernel tasks and user processes not included in the boot image are now left out from the system process table. - RS implements the initialization protocol for system services. - For services in the boot image, RS blocks till initialization is complete and panics when failure is reported back. Services are initialized in their order of appearance in the boot image priv table and RS blocks to implements synchronous initialization for every system service having the flag SF_SYNCH_BOOT set. - For services started dynamically, the initialization protocol is implemented as though it were the first ping for the service. In this case, if the system service fails to report back (or reports failure), RS brings the service down rather than trying to restart it.
77 lines
2.7 KiB
C
77 lines
2.7 KiB
C
/* Type definitions used in RS.
|
|
*/
|
|
#ifndef RS_TYPE_H
|
|
#define RS_TYPE_H
|
|
|
|
/* Definition of an entry of the boot image priv table. */
|
|
struct boot_image_priv {
|
|
endpoint_t endpoint; /* process endpoint number */
|
|
char label[RS_MAX_LABEL_LEN]; /* label to assign to this service */
|
|
|
|
int flags; /* privilege flags */
|
|
short trap_mask; /* allowed system call traps */
|
|
int ipc_to; /* send mask protection */
|
|
int *k_calls; /* allowed kernel calls */
|
|
int *vm_calls; /* allowed vm calls */
|
|
};
|
|
|
|
/* Definition of an entry of the boot image sys table. */
|
|
struct boot_image_sys {
|
|
endpoint_t endpoint; /* process endpoint number */
|
|
|
|
int flags; /* system flags */
|
|
};
|
|
|
|
/* Definition of an entry of the boot image dev table. */
|
|
struct boot_image_dev {
|
|
endpoint_t endpoint; /* process endpoint number */
|
|
|
|
dev_t dev_nr; /* major device number */
|
|
int dev_style; /* device style */
|
|
long period; /* heartbeat period (or zero) */
|
|
};
|
|
|
|
/* Definition of an entry of the system process table. */
|
|
struct rproc {
|
|
struct rprocpub *r_pub; /* pointer to the corresponding public entry */
|
|
pid_t r_pid; /* process id, -1 if the process is not there */
|
|
|
|
int r_restarts; /* number of restarts (initially zero) */
|
|
long r_backoff; /* number of periods to wait before revive */
|
|
unsigned r_flags; /* status and policy flags */
|
|
|
|
clock_t r_check_tm; /* timestamp of last check */
|
|
clock_t r_alive_tm; /* timestamp of last heartbeat */
|
|
clock_t r_stop_tm; /* timestamp of SIGTERM signal */
|
|
endpoint_t r_caller; /* RS_LATEREPLY caller */
|
|
|
|
char r_cmd[MAX_COMMAND_LEN]; /* raw command plus arguments */
|
|
char r_script[MAX_SCRIPT_LEN]; /* name of the restart script executable */
|
|
char *r_argv[MAX_NR_ARGS+2]; /* parsed arguments vector */
|
|
int r_argc; /* number of arguments */
|
|
|
|
char *r_exec; /* Executable image */
|
|
size_t r_exec_len; /* Length of image */
|
|
|
|
int r_set_resources; /* set when resources must be set. */
|
|
struct priv r_priv; /* Privilege structure to be passed to the
|
|
* kernel.
|
|
*/
|
|
uid_t r_uid;
|
|
int r_nice;
|
|
|
|
u32_t r_call_mask[RS_SYS_CALL_MASK_SIZE];
|
|
char r_ipc_list[MAX_IPC_LIST];
|
|
int r_nr_control;
|
|
char r_control[RS_NR_CONTROL][RS_MAX_LABEL_LEN];
|
|
};
|
|
|
|
/* Definition of the global update descriptor. */
|
|
struct rupdate {
|
|
int flags; /* flags to keep track of the status of the update */
|
|
clock_t prepare_tm; /* timestamp of when the update was scheduled */
|
|
clock_t prepare_maxtime; /* max time to wait for the process to be ready */
|
|
struct rproc *rp; /* the process under update */
|
|
};
|
|
|
|
#endif /* RS_TYPE_H */
|