/src/rt/rust_scheduler.h

http://github.com/jruderman/rust · C Header · 77 lines · 46 code · 16 blank · 15 comment · 0 complexity · e9026b5565ff0424db511b4e5596b6b9 MD5 · raw file

  1. /**
  2. The rust scheduler. Schedulers may be added to the kernel
  3. dynamically and they run until there are no more tasks to
  4. schedule. Most of the scheduler work is carried out in worker
  5. threads by rust_sched_loop.
  6. */
  7. #ifndef RUST_SCHEDULER_H
  8. #define RUST_SCHEDULER_H
  9. #include "rust_globals.h"
  10. #include "util/array_list.h"
  11. #include "rust_kernel.h"
  12. #include "rust_refcount.h"
  13. class rust_sched_launcher;
  14. class rust_sched_launcher_factory;
  15. class rust_scheduler : public kernel_owned<rust_scheduler> {
  16. RUST_ATOMIC_REFCOUNT();
  17. // FIXME (#2693): Make these private
  18. public:
  19. rust_kernel *kernel;
  20. private:
  21. // Protects live_threads, live_tasks, cur_thread, may_exit
  22. lock_and_signal lock;
  23. // When this hits zero we'll tell the kernel to release us
  24. uintptr_t live_threads;
  25. // When this hits zero we'll tell the threads to exit
  26. uintptr_t live_tasks;
  27. size_t cur_thread;
  28. bool may_exit;
  29. array_list<rust_sched_launcher *> threads;
  30. const size_t num_threads;
  31. rust_sched_id id;
  32. void create_task_threads(rust_sched_launcher_factory *launchfac,
  33. bool killed);
  34. void destroy_task_threads();
  35. rust_sched_launcher *
  36. create_task_thread(rust_sched_launcher_factory *launchfac, int id,
  37. bool killed);
  38. void destroy_task_thread(rust_sched_launcher *thread);
  39. void exit();
  40. // Called when refcount reaches zero
  41. void delete_this();
  42. public:
  43. rust_scheduler(rust_kernel *kernel, size_t num_threads,
  44. rust_sched_id id, bool allow_exit, bool killed,
  45. rust_sched_launcher_factory *launchfac);
  46. void start_task_threads();
  47. void join_task_threads();
  48. void kill_all_tasks();
  49. rust_task* create_task(rust_task *spawner, const char *name);
  50. void release_task();
  51. size_t number_of_threads();
  52. // Called by each thread when it terminates. When all threads
  53. // terminate the scheduler does as well.
  54. void release_task_thread();
  55. rust_sched_id get_id() { return id; }
  56. // Tells the scheduler that as soon as it runs out of tasks
  57. // to run it should exit
  58. void allow_exit();
  59. void disallow_exit();
  60. };
  61. #endif /* RUST_SCHEDULER_H */