mirror of
				https://gitee.com/jiuyilian/embedded-framework.git
				synced 2025-10-24 18:20:15 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			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_
 |