tbrtlevt.pp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. {$mode objfpc}
  2. uses
  3. {$ifdef unix}
  4. cthreads,
  5. {$endif}
  6. sysutils,
  7. classes;
  8. Const
  9. wrSignaled = 0;
  10. wrTimeout = 1;
  11. wrAbandoned= 2;
  12. wrError = 3;
  13. type
  14. tc = class(tthread)
  15. procedure execute; override;
  16. end;
  17. torder = (o_destroy, o_post, o_sleeppost, o_waittimeoutabandon, o_waittimeoutsignal);
  18. thelper = class(tthread)
  19. private
  20. forder: torder;
  21. public
  22. constructor create(order: torder);
  23. procedure execute; override;
  24. end;
  25. var
  26. event: pEventState;
  27. waiting: boolean;
  28. constructor thelper.create(order: torder);
  29. begin
  30. forder:=order;
  31. inherited create(false);
  32. end;
  33. procedure thelper.execute;
  34. var
  35. res: longint;
  36. begin
  37. case forder of
  38. o_destroy:
  39. basiceventdestroy(event);
  40. o_post:
  41. basiceventsetevent(event);
  42. o_sleeppost:
  43. begin
  44. sleep(1000);
  45. basiceventsetevent(event);
  46. end;
  47. o_waittimeoutabandon:
  48. begin
  49. res:=basiceventWaitFor(1000,event);
  50. if (res<>wrAbandoned) then
  51. begin
  52. writeln('error 1');
  53. halt(1);
  54. end;
  55. end;
  56. o_waittimeoutsignal:
  57. begin
  58. res:=basiceventWaitFor(1000,event);
  59. if (res<>wrSignaled) then
  60. begin
  61. writeln('error 2');
  62. halt(2);
  63. end;
  64. end;
  65. end;
  66. end;
  67. procedure tc.execute;
  68. begin
  69. { make sure we don't exit before this thread has initialised, since }
  70. { it can allocate memory in its initialisation, which would cause }
  71. { problems for heaptrc as it goes over the memory map in its exit code }
  72. waiting:=true;
  73. { avoid deadlocks/bugs from causing this test to never quit }
  74. sleep(1000*10);
  75. writeln('error 3');
  76. halt(3);
  77. end;
  78. var
  79. help: thelper;
  80. begin
  81. waiting:=false;
  82. tc.create(false);
  83. event := BasicEventCreate(nil,false,false,'bla');
  84. basiceventSetEvent(event);
  85. if (basiceventWaitFor(cardinal(-1),event) <> wrSignaled) then
  86. begin
  87. writeln('error 4');
  88. halt(4);
  89. end;
  90. basiceventSetEvent(event);
  91. if (basiceventWaitFor(1000,event) <> wrSignaled) then
  92. begin
  93. writeln('error 5');
  94. halt(5);
  95. end;
  96. { shouldn't change anything }
  97. basiceventResetEvent(event);
  98. basiceventSetEvent(event);
  99. { shouldn't change anything }
  100. basiceventSetEvent(event);
  101. if (basiceventWaitFor(cardinal(-1),event) <> wrSignaled) then
  102. begin
  103. writeln('error 6');
  104. halt(6);
  105. end;
  106. { make sure the two BasicSetEvents aren't cumulative }
  107. if (basiceventWaitFor(1000,event) <> wrTimeOut) then
  108. begin
  109. writeln('error 7');
  110. halt(7);
  111. end;
  112. help:=thelper.create(o_waittimeoutabandon);
  113. basiceventdestroy(event);
  114. help.waitfor;
  115. help.free;
  116. event := BasicEventCreate(nil,false,false,'bla');
  117. help:=thelper.create(o_waittimeoutsignal);
  118. basiceventSetEvent(event);
  119. help.waitfor;
  120. help.free;
  121. basiceventdestroy(event);
  122. while not waiting do
  123. sleep(20);
  124. end.