monitor.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "__monitor.hpp"
  2. static void *monitorProgress(void *m);
  3. af_Monitor *makeMonitor(af_Environment *env) {
  4. auto monitor = calloc(1, af_Monitor);
  5. monitor->env = env;
  6. pthread_mutex_init(&monitor->lock, nullptr);
  7. pthread_cond_init(&monitor->cond, nullptr);
  8. env->monitor = monitor;
  9. pthread_create(&monitor->thread, nullptr, monitorProgress, monitor);
  10. return monitor;
  11. }
  12. void freeMonitor(af_Environment *env) {
  13. af_Monitor *monitor = env->monitor;
  14. pthread_mutex_lock(&monitor->lock);
  15. monitor->exit = true;
  16. pthread_mutex_unlock(&monitor->lock);
  17. pthread_cond_signal(&monitor->cond);
  18. pthread_join(monitor->thread, nullptr);
  19. pthread_mutex_lock(&env->thread_lock);
  20. pthread_cond_destroy(&monitor->cond);
  21. pthread_mutex_destroy(&monitor->lock);
  22. free(monitor);
  23. env->monitor = nullptr;
  24. pthread_mutex_unlock(&env->thread_lock);
  25. }
  26. static void *monitorProgress(void *m) {
  27. af_Monitor *monitor = (af_Monitor *)m;
  28. af_Environment *env = monitor->env;
  29. pthread_mutex_lock(&monitor->lock);
  30. while (true) {
  31. if (isEnviromentExit(env)) {
  32. pthread_mutex_lock(&monitor->env->status_lock);
  33. monitor->env->status = core_exit;
  34. pthread_mutex_unlock(&monitor->env->status_lock);
  35. }
  36. pthread_cond_wait(&monitor->cond, &monitor->lock);
  37. if (monitor->exit)
  38. break;
  39. }
  40. pthread_mutex_unlock(&monitor->lock);
  41. return nullptr;
  42. }