mt_test.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. *******************************************************************************
  3. \file mt_test.c
  4. \brief Tests for multithreading
  5. \project bee2/test
  6. \created 2021.05.15
  7. \version 2021.05.18
  8. \copyright The Bee2 authors
  9. \license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
  10. *******************************************************************************
  11. */
  12. #include <bee2/core/mt.h>
  13. /*
  14. *******************************************************************************
  15. Тестирование
  16. *******************************************************************************
  17. */
  18. static size_t _once;
  19. static bool_t _inited;
  20. void init()
  21. {
  22. _inited = TRUE;
  23. }
  24. bool_t mtTest()
  25. {
  26. mt_mtx_t mtx[1];
  27. size_t ctr[1] = { SIZE_0 };
  28. // мьютексы
  29. if (!mtMtxCreate(mtx))
  30. return FALSE;
  31. mtMtxLock(mtx);
  32. mtMtxUnlock(mtx);
  33. mtMtxClose(mtx);
  34. // атомарные операции
  35. mtAtomicIncr(ctr);
  36. mtAtomicIncr(ctr);
  37. mtAtomicDecr(ctr);
  38. if (mtAtomicCmpSwap(ctr, 1, 0) != 1 || *ctr != SIZE_0)
  39. return FALSE;
  40. // однократный вызов
  41. if (!mtCallOnce(&_once, init) || !_inited)
  42. return FALSE;
  43. if (!mtCallOnce(&_once, init) || !_inited)
  44. return FALSE;
  45. // все нормально
  46. return TRUE;
  47. }