completion.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include <common/spinlock.h>
  2. #include <common/wait_queue_head.h>
  3. #include <process/process.h>
  4. #include <time/sleep.h>
  5. #include <time/timer.h>
  6. // 永久地设置该completion已经被完成,不会再有进程等待
  7. #define COMPLETE_ALL UINT32_MAX
  8. struct completion
  9. {
  10. unsigned int done;
  11. wait_queue_head_t wait_queue;
  12. };
  13. #define DECLARE_COMPLETION_ON_STACK(name) \
  14. struct completion name = {0}; \
  15. completion_init(&name);
  16. /**
  17. * 对外函数声明
  18. */
  19. void completion_init(struct completion *x);
  20. void complete(struct completion *x);
  21. void complete_all(struct completion *x);
  22. void wait_for_completion(struct completion *x);
  23. long wait_for_completion_timeout(struct completion *x, long timeout);
  24. void wait_for_completion_interruptible(struct completion *x);
  25. long wait_for_completion_interruptible_timeout(struct completion *x, long timeout);
  26. void wait_for_multicompletion(struct completion x[], int n);
  27. bool try_wait_for_completion(struct completion *x);
  28. bool completion_done(struct completion *x);
  29. /**
  30. * 测试函数声明 (测试代码辅助函数)
  31. */
  32. struct __test_data
  33. {
  34. int id;
  35. struct completion *one_to_one;
  36. struct completion *one_to_many;
  37. struct completion *many_to_one;
  38. };
  39. int __test_completion_waiter(void *data); // 等待者
  40. int __test_completion_worker(void *data); // 执行者
  41. void __test_completion();