threadwork_test.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include <misc/debug.h>
  4. #include <base/BLog.h>
  5. #include <base/DebugObject.h>
  6. #include <threadwork/BThreadWork.h>
  7. BReactor reactor;
  8. BThreadWorkDispatcher twd;
  9. BThreadWork tw1;
  10. BThreadWork tw2;
  11. BThreadWork tw3;
  12. int num_left;
  13. static void handler_done (void *user)
  14. {
  15. printf("work done\n");
  16. num_left--;
  17. if (num_left == 0) {
  18. printf("all works done, quitting\n");
  19. BReactor_Quit(&reactor, 0);
  20. }
  21. }
  22. static void work_func (void *user)
  23. {
  24. unsigned int x = 0;
  25. for (int i = 0; i < 10000; i++) {
  26. for (int j = 0; j < 10000; j++) {
  27. x++;
  28. }
  29. }
  30. }
  31. static void dummy_works (int n)
  32. {
  33. for (int i = 0; i < n; i++) {
  34. BThreadWork tw_tmp;
  35. BThreadWork_Init(&tw_tmp, &twd, handler_done, NULL, work_func, NULL);
  36. BThreadWork_Free(&tw_tmp);
  37. }
  38. }
  39. int main ()
  40. {
  41. BLog_InitStdout();
  42. BLog_SetChannelLoglevel(BLOG_CHANNEL_BThreadWork, BLOG_DEBUG);
  43. if (!BReactor_Init(&reactor)) {
  44. DEBUG("BReactor_Init failed");
  45. goto fail1;
  46. }
  47. if (!BThreadWorkDispatcher_Init(&twd, &reactor, 1)) {
  48. DEBUG("BThreadWorkDispatcher_Init failed");
  49. goto fail2;
  50. }
  51. dummy_works(200);
  52. BThreadWork_Init(&tw1, &twd, handler_done, NULL, work_func, NULL);
  53. BThreadWork_Init(&tw2, &twd, handler_done, NULL, work_func, NULL);
  54. BThreadWork_Init(&tw3, &twd, handler_done, NULL, work_func, NULL);
  55. dummy_works(200);
  56. num_left = 3;
  57. BReactor_Exec(&reactor);
  58. BThreadWork_Free(&tw3);
  59. BThreadWork_Free(&tw2);
  60. BThreadWork_Free(&tw1);
  61. BThreadWorkDispatcher_Free(&twd);
  62. fail2:
  63. BReactor_Free(&reactor);
  64. fail1:
  65. BLog_Free();
  66. DebugObjectGlobal_Finish();
  67. return 0;
  68. }