1
0

hproc.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #ifndef H_PROC_H_
  2. #define H_PROC_H_
  3. #include "hplatform.h"
  4. #include "hdef.h"
  5. #include "hlog.h"
  6. typedef struct proc_ctx_s {
  7. pid_t pid; // tid in win32
  8. procedure_t init;
  9. void* init_userdata;
  10. procedure_t proc;
  11. void* proc_userdata;
  12. procedure_t exit;
  13. void* exit_userdata;
  14. } proc_ctx_t;
  15. #ifdef OS_UNIX
  16. // unix use multi-processes
  17. inline int create_proc(proc_ctx_t* ctx) {
  18. pid_t pid = fork();
  19. if (pid < 0) {
  20. hloge("fork error: %d", errno);
  21. return -1;
  22. } else if (pid == 0) {
  23. // child proc
  24. hlogi("proc start/running, pid=%d", getpid());
  25. if (ctx->init) {
  26. ctx->init(ctx->init_userdata);
  27. }
  28. if (ctx->proc) {
  29. ctx->proc(ctx->proc_userdata);
  30. }
  31. if (ctx->exit) {
  32. ctx->exit(ctx->exit_userdata);
  33. }
  34. exit(0);
  35. } else if (pid > 0) {
  36. // parent proc
  37. }
  38. ctx->pid = pid;
  39. return pid;
  40. }
  41. #elif defined(OS_WIN)
  42. // win32 use multi-threads
  43. static void win_thread(void* userdata) {
  44. hlogi("proc start/running, tid=%d", GetCurrentThreadId());
  45. proc_ctx_t* ctx = (proc_ctx_t*)userdata;
  46. if (ctx->init) {
  47. ctx->init(ctx->init_userdata);
  48. }
  49. if (ctx->proc) {
  50. ctx->proc(ctx->proc_userdata);
  51. }
  52. if (ctx->exit) {
  53. ctx->exit(ctx->exit_userdata);
  54. }
  55. }
  56. inline int create_proc(proc_ctx_t* ctx) {
  57. HANDLE h = (HANDLE)_beginthread(win_thread, 0, ctx);
  58. if (h == NULL) {
  59. hloge("_beginthread error: %d", errno);
  60. return -1;
  61. }
  62. int tid = GetThreadId(h);
  63. ctx->pid = tid;
  64. return tid;
  65. }
  66. #endif
  67. #endif // H_PROC_H_