70 lines
1.6 KiB
C
70 lines
1.6 KiB
C
#ifndef HV_PROC_H_
|
|
#define HV_PROC_H_
|
|
|
|
#include "hplatform.h"
|
|
|
|
typedef struct proc_ctx_s {
|
|
pid_t pid; // tid in Windows
|
|
time_t start_time;
|
|
int spawn_cnt;
|
|
procedure_t init;
|
|
void* init_userdata;
|
|
procedure_t proc;
|
|
void* proc_userdata;
|
|
procedure_t exit;
|
|
void* exit_userdata;
|
|
} proc_ctx_t;
|
|
|
|
static inline void hproc_run(proc_ctx_t* ctx) {
|
|
if (ctx->init) {
|
|
ctx->init(ctx->init_userdata);
|
|
}
|
|
if (ctx->proc) {
|
|
ctx->proc(ctx->proc_userdata);
|
|
}
|
|
if (ctx->exit) {
|
|
ctx->exit(ctx->exit_userdata);
|
|
}
|
|
}
|
|
|
|
#ifdef OS_UNIX
|
|
// unix use multi-processes
|
|
static inline int hproc_spawn(proc_ctx_t* ctx) {
|
|
++ctx->spawn_cnt;
|
|
ctx->start_time = time(NULL);
|
|
pid_t pid = fork();
|
|
if (pid < 0) {
|
|
perror("fork");
|
|
return -1;
|
|
} else if (pid == 0) {
|
|
// child process
|
|
ctx->pid = getpid();
|
|
hproc_run(ctx);
|
|
exit(0);
|
|
} else if (pid > 0) {
|
|
// parent process
|
|
ctx->pid = pid;
|
|
}
|
|
return pid;
|
|
}
|
|
#elif defined(OS_WIN)
|
|
// win32 use multi-threads
|
|
static void win_thread(void* userdata) {
|
|
proc_ctx_t* ctx = (proc_ctx_t*)userdata;
|
|
ctx->pid = GetCurrentThreadId(); // tid in Windows
|
|
hproc_run(ctx);
|
|
}
|
|
static inline int hproc_spawn(proc_ctx_t* ctx) {
|
|
++ctx->spawn_cnt;
|
|
ctx->start_time = time(NULL);
|
|
HANDLE h = (HANDLE)_beginthread(win_thread, 0, ctx);
|
|
if (h == NULL) {
|
|
return -1;
|
|
}
|
|
ctx->pid = GetThreadId(h); // tid in Windows
|
|
return ctx->pid;
|
|
}
|
|
#endif
|
|
|
|
#endif // HV_PROC_H_
|