completion.c 757 B

12345678910111213141516171819202122232425262728293031323334
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "completion.h"
  3. void completion_init(struct completion *p)
  4. {
  5. p->completed = 0;
  6. fatal_assert(0 == uv_cond_init(&p->cond));
  7. fatal_assert(0 == uv_mutex_init(&p->mutex));
  8. }
  9. void completion_destroy(struct completion *p)
  10. {
  11. uv_cond_destroy(&p->cond);
  12. uv_mutex_destroy(&p->mutex);
  13. }
  14. void completion_wait_for(struct completion *p)
  15. {
  16. uv_mutex_lock(&p->mutex);
  17. while (0 == p->completed) {
  18. uv_cond_wait(&p->cond, &p->mutex);
  19. }
  20. fatal_assert(1 == p->completed);
  21. uv_mutex_unlock(&p->mutex);
  22. }
  23. void completion_mark_complete(struct completion *p)
  24. {
  25. uv_mutex_lock(&p->mutex);
  26. p->completed = 1;
  27. uv_mutex_unlock(&p->mutex);
  28. uv_cond_broadcast(&p->cond);
  29. }