test-pr-poll-loop.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271
  1. /*
  2. * Copyright (c) 2015-2020 Red Hat, Inc.
  3. *
  4. * All rights reserved.
  5. *
  6. * Author: Jan Friesse (jfriesse@redhat.com)
  7. *
  8. * This software licensed under BSD license, the text of which follows:
  9. *
  10. * Redistribution and use in source and binary forms, with or without
  11. * modification, are permitted provided that the following conditions are met:
  12. *
  13. * - Redistributions of source code must retain the above copyright notice,
  14. * this list of conditions and the following disclaimer.
  15. * - Redistributions in binary form must reproduce the above copyright notice,
  16. * this list of conditions and the following disclaimer in the documentation
  17. * and/or other materials provided with the distribution.
  18. * - Neither the name of the Red Hat, Inc. nor the names of its
  19. * contributors may be used to endorse or promote products derived from this
  20. * software without specific prior written permission.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  23. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  26. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  27. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  28. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  29. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  30. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  31. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  32. * THE POSSIBILITY OF SUCH DAMAGE.
  33. */
  34. #include <stdio.h>
  35. #include <assert.h>
  36. #include <string.h>
  37. #include <errno.h>
  38. #include <unistd.h>
  39. #include "pr-poll-loop.h"
  40. /*
  41. * Needed for creating nspr handle from unix fd
  42. */
  43. #include <private/pprio.h>
  44. #define BUF_SIZE 256
  45. #define TIMER_TIMEOUT 10000
  46. #define TIMER_TEST_TIMEOUT 100
  47. /*
  48. * Must be smaller than BUF_SIZE
  49. */
  50. #define READ_STR "test"
  51. static int fd_set_events_cb1_return_called = -1;
  52. static int fd_set_events_cb2_return_called = -1;
  53. static int fd_read_cb1_called = -1;
  54. static int fd_read_cb2_called = -1;
  55. static int fd_write_cb1_called = -1;
  56. static int fd_err_cb1_called = -1;
  57. static int timeout_cb_called = -1;
  58. static int prfd_set_events_cb1_return_called = -1;
  59. static int prfd_set_events_cb2_return_called = -1;
  60. static int prfd_read_cb1_called = -1;
  61. static int prfd_read_cb2_called = -1;
  62. static int prfd_write_cb1_called = -1;
  63. static int prfd_err_cb1_called = -1;
  64. static int test_complex_state = -1;
  65. static int test_complex_set_events_pipe1_read_called = -1;
  66. static int test_complex_read_pipe1_read_called = -1;
  67. static int test_complex_set_events_pipe1_write_called = -1;
  68. static int test_complex_write_pipe1_write_called = -1;
  69. static int test_complex_set_events_pipe2_read_called = -1;
  70. static int test_complex_read_pipe2_read_called = -1;
  71. static int test_complex_set_events_pipe2_write_called = -1;
  72. static int test_complex_write_pipe2_write_called = -1;
  73. static int test_complex_read_pipe1_fd = -1;
  74. static int pre_poll_cb1_called = -1;
  75. static int pre_poll_cb2_called = -1;
  76. static int pre_poll_cb_return_called = -1;
  77. static int
  78. timeout_cb(void *data1, void *data2)
  79. {
  80. timeout_cb_called = 1;
  81. return (0);
  82. }
  83. static int
  84. fd_set_events_cb1_return(int fd, short *events, void *user_data1, void *user_data2)
  85. {
  86. fd_set_events_cb1_return_called++;
  87. assert(user_data1 == &fd_set_events_cb1_return_called);
  88. assert(user_data2 == NULL);
  89. return (-2);
  90. }
  91. static int
  92. fd_set_events_cb2_return(int fd, short *events, void *user_data1, void *user_data2)
  93. {
  94. fd_set_events_cb2_return_called++;
  95. assert(user_data1 == NULL);
  96. assert(user_data2 == &fd_set_events_cb2_return_called);
  97. return (-2);
  98. }
  99. static int
  100. fd_read_cb1(int fd, void *user_data1, void *user_data2)
  101. {
  102. char buf[BUF_SIZE];
  103. assert(user_data1 == &fd_read_cb1_called);
  104. assert(user_data2 == fd_read_cb1);
  105. fd_read_cb1_called++;
  106. assert(read(fd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  107. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  108. return (0);
  109. }
  110. static int
  111. fd_read_cb2(int fd, void *user_data1, void *user_data2)
  112. {
  113. char buf[BUF_SIZE];
  114. assert(user_data1 == &fd_read_cb2_called);
  115. assert(user_data2 == fd_read_cb2);
  116. fd_read_cb2_called++;
  117. assert(read(fd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  118. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  119. return (-1);
  120. }
  121. static int
  122. fd_write_cb1(int fd, void *user_data1, void *user_data2)
  123. {
  124. assert(user_data1 == &fd_write_cb1_called);
  125. assert(user_data2 == fd_write_cb1);
  126. fd_write_cb1_called++;
  127. return (0);
  128. }
  129. static int
  130. fd_err_cb1(int fd, short revents, void *user_data1, void *user_data2)
  131. {
  132. assert(user_data1 == &fd_err_cb1_called);
  133. assert(user_data2 == fd_err_cb1);
  134. fd_err_cb1_called++;
  135. return (0);
  136. }
  137. static int
  138. prfd_set_events_cb1_return(PRFileDesc *prfd, short *events, void *user_data1, void *user_data2)
  139. {
  140. prfd_set_events_cb1_return_called++;
  141. assert(user_data1 == &prfd_set_events_cb1_return_called);
  142. assert(user_data2 == NULL);
  143. return (-2);
  144. }
  145. static int
  146. prfd_set_events_cb2_return(PRFileDesc *prfd, short *events, void *user_data1, void *user_data2)
  147. {
  148. prfd_set_events_cb2_return_called++;
  149. assert(user_data1 == NULL);
  150. assert(user_data2 == &prfd_set_events_cb2_return_called);
  151. return (-2);
  152. }
  153. static int
  154. prfd_read_cb1(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  155. {
  156. char buf[BUF_SIZE];
  157. assert(user_data1 == &prfd_read_cb1_called);
  158. assert(user_data2 == prfd_read_cb1);
  159. prfd_read_cb1_called++;
  160. assert(PR_Read(prfd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  161. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  162. return (0);
  163. }
  164. static int
  165. prfd_read_cb2(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  166. {
  167. char buf[BUF_SIZE];
  168. assert(user_data1 == &prfd_read_cb2_called);
  169. assert(user_data2 == prfd_read_cb2);
  170. prfd_read_cb2_called++;
  171. assert(PR_Read(prfd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  172. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  173. return (-1);
  174. }
  175. static int
  176. prfd_write_cb1(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  177. {
  178. assert(user_data1 == &prfd_write_cb1_called);
  179. assert(user_data2 == prfd_write_cb1);
  180. prfd_write_cb1_called++;
  181. return (0);
  182. }
  183. static int
  184. prfd_err_cb1(PRFileDesc *prfd, short revents, const PRPollDesc *pd, void *user_data1, void *user_data2)
  185. {
  186. assert(user_data1 == &prfd_err_cb1_called);
  187. assert(user_data2 == prfd_err_cb1);
  188. prfd_err_cb1_called++;
  189. return (0);
  190. }
  191. static int
  192. test_complex_set_events_pipe1_read_cb(PRFileDesc *prfd, short *events, void *user_data1, void *user_data2)
  193. {
  194. test_complex_set_events_pipe1_read_called++;
  195. assert(user_data1 == &test_complex_set_events_pipe1_read_called);
  196. assert(user_data2 == test_complex_set_events_pipe1_read_cb);
  197. assert(*events == 0);
  198. if (test_complex_state == 2) {
  199. *events = POLLIN;
  200. }
  201. return (0);
  202. }
  203. static int
  204. test_complex_read_pipe1_read_cb(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  205. {
  206. char buf[BUF_SIZE];
  207. assert(user_data1 == &test_complex_set_events_pipe1_read_called);
  208. assert(user_data2 == test_complex_set_events_pipe1_read_cb);
  209. test_complex_read_pipe1_read_called++;
  210. /*
  211. * prfd for this case is just a wrapper, we need to use real fd
  212. */
  213. assert(read(test_complex_read_pipe1_fd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  214. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  215. return (0);
  216. }
  217. static int
  218. test_complex_write_pipe1_read_cb(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  219. {
  220. assert(0);
  221. return (-1);
  222. }
  223. static int
  224. test_complex_set_events_pipe1_write_cb(int fd, short *events, void *user_data1, void *user_data2)
  225. {
  226. test_complex_set_events_pipe1_write_called++;
  227. assert(user_data1 == &test_complex_set_events_pipe1_write_called);
  228. assert(user_data2 == test_complex_set_events_pipe1_write_cb);
  229. assert(*events == 0);
  230. if (test_complex_state == 1) {
  231. *events = POLLOUT;
  232. }
  233. return (0);
  234. }
  235. static int
  236. test_complex_read_pipe1_write_cb(int fd, void *user_data1, void *user_data2)
  237. {
  238. assert(0);
  239. return (-1);
  240. }
  241. static int
  242. test_complex_write_pipe1_write_cb(int fd, void *user_data1, void *user_data2)
  243. {
  244. assert(user_data1 == &test_complex_set_events_pipe1_write_called);
  245. assert(user_data2 == test_complex_set_events_pipe1_write_cb);
  246. test_complex_write_pipe1_write_called++;
  247. return (0);
  248. }
  249. static int
  250. test_complex_set_events_pipe2_read_cb(int fd, short *events, void *user_data1, void *user_data2)
  251. {
  252. test_complex_set_events_pipe2_read_called++;
  253. assert(user_data1 == &test_complex_set_events_pipe2_read_called);
  254. assert(user_data2 == test_complex_set_events_pipe2_read_cb);
  255. assert(*events == POLLIN);
  256. return (0);
  257. }
  258. static int
  259. test_complex_read_pipe2_read_cb(int fd, void *user_data1, void *user_data2)
  260. {
  261. char buf[BUF_SIZE];
  262. assert(user_data1 == &test_complex_set_events_pipe2_read_called);
  263. assert(user_data2 == test_complex_set_events_pipe2_read_cb);
  264. test_complex_read_pipe2_read_called++;
  265. assert(read(fd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  266. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  267. return (0);
  268. }
  269. static int
  270. test_complex_write_pipe2_read_cb(int fd, void *user_data1, void *user_data2)
  271. {
  272. assert(0);
  273. return (-1);
  274. }
  275. static int
  276. test_complex_set_events_pipe2_write_cb(PRFileDesc *prfd, short *events, void *user_data1, void *user_data2)
  277. {
  278. test_complex_set_events_pipe2_write_called++;
  279. assert(user_data1 == &test_complex_set_events_pipe2_write_called);
  280. assert(user_data2 == test_complex_set_events_pipe2_write_cb);
  281. assert(*events == POLLOUT);
  282. return (0);
  283. }
  284. static int
  285. test_complex_read_pipe2_write_cb(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  286. {
  287. assert(0);
  288. return (-1);
  289. }
  290. static int
  291. test_complex_write_pipe2_write_cb(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  292. {
  293. assert(user_data1 == &test_complex_set_events_pipe2_write_called);
  294. assert(user_data2 == test_complex_set_events_pipe2_write_cb);
  295. test_complex_write_pipe2_write_called++;
  296. return (0);
  297. }
  298. static int
  299. test_pre_poll_cb1(void *user_data1, void *user_data2)
  300. {
  301. assert(user_data1 == &pre_poll_cb1_called);
  302. assert(user_data2 == test_pre_poll_cb1);
  303. pre_poll_cb1_called++;
  304. return (0);
  305. }
  306. static int
  307. test_pre_poll_cb2(void *user_data1, void *user_data2)
  308. {
  309. assert(user_data1 == &pre_poll_cb2_called);
  310. assert(user_data2 == test_pre_poll_cb2);
  311. pre_poll_cb2_called++;
  312. return (0);
  313. }
  314. static int
  315. test_pre_poll_cb_return(void *user_data1, void *user_data2)
  316. {
  317. assert(user_data1 == &pre_poll_cb_return_called);
  318. assert(user_data2 == test_pre_poll_cb_return);
  319. pre_poll_cb_return_called++;
  320. return (-1);
  321. }
  322. static void
  323. init_global_vars(void)
  324. {
  325. fd_set_events_cb1_return_called = -1;
  326. fd_set_events_cb2_return_called = -1;
  327. fd_read_cb1_called = -1;
  328. fd_read_cb2_called = -1;
  329. fd_write_cb1_called = -1;
  330. fd_err_cb1_called = -1;
  331. timeout_cb_called = -1;
  332. prfd_set_events_cb1_return_called = -1;
  333. prfd_set_events_cb2_return_called = -1;
  334. prfd_read_cb1_called = -1;
  335. prfd_read_cb2_called = -1;
  336. prfd_write_cb1_called = -1;
  337. prfd_err_cb1_called = -1;
  338. test_complex_set_events_pipe1_read_called = -1;
  339. test_complex_read_pipe1_read_called = -1;
  340. test_complex_set_events_pipe1_write_called = -1;
  341. test_complex_write_pipe1_write_called = -1;
  342. test_complex_set_events_pipe2_read_called = -1;
  343. test_complex_read_pipe2_read_called = -1;
  344. test_complex_set_events_pipe2_write_called = -1;
  345. test_complex_write_pipe2_write_called = -1;
  346. test_complex_read_pipe1_fd = -1;
  347. }
  348. static void
  349. test_fd_basics(struct pr_poll_loop *poll_loop)
  350. {
  351. int pipe_fd1[2];
  352. struct timer_list_entry *timeout_timer;
  353. init_global_vars();
  354. assert(pipe(pipe_fd1) == 0);
  355. /*
  356. * Add POLLNVAL -> failure
  357. */
  358. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLNVAL, NULL, NULL, NULL, NULL,
  359. NULL, NULL) == -1);
  360. /*
  361. * Del non-existing fdL -> failure
  362. */
  363. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == -1);
  364. /*
  365. * Add and delete fd twice
  366. */
  367. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], 0, NULL, NULL, NULL, NULL,
  368. NULL, NULL) == 0);
  369. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], 0, NULL, NULL, NULL, NULL,
  370. NULL, NULL) == -1);
  371. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  372. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == -1);
  373. /*
  374. * Test timeout timer
  375. * with empty list
  376. */
  377. assert((timeout_timer = timer_list_add(
  378. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  379. timeout_cb_called = 0;
  380. assert(pr_poll_loop_exec(poll_loop) == 0);
  381. assert(timeout_cb_called == 1);
  382. /*
  383. * Test user_data passing
  384. */
  385. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, fd_set_events_cb1_return,
  386. NULL, NULL, NULL, (void *)&fd_set_events_cb1_return_called, NULL) == 0);
  387. fd_set_events_cb1_return_called = 0;
  388. assert((timeout_timer = timer_list_add(
  389. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  390. assert(pr_poll_loop_exec(poll_loop) == -1);
  391. assert(fd_set_events_cb1_return_called == 1);
  392. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  393. /*
  394. * Remove entry and try with zero events and -2 return callback
  395. */
  396. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  397. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], 0, fd_set_events_cb1_return,
  398. NULL, NULL, NULL, (void *)&fd_set_events_cb1_return_called, NULL) == 0);
  399. fd_set_events_cb1_return_called = 0;
  400. assert((timeout_timer = timer_list_add(
  401. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  402. assert(pr_poll_loop_exec(poll_loop) == -1);
  403. assert(fd_set_events_cb1_return_called == 1);
  404. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  405. /*
  406. * Remove entry and try different cb
  407. */
  408. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  409. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[1], POLLOUT, fd_set_events_cb2_return,
  410. NULL, NULL, NULL, NULL, (void *)&fd_set_events_cb2_return_called) == 0);
  411. fd_set_events_cb1_return_called = 0;
  412. fd_set_events_cb2_return_called = 0;
  413. assert((timeout_timer = timer_list_add(
  414. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  415. assert(pr_poll_loop_exec(poll_loop) == -1);
  416. assert(fd_set_events_cb1_return_called == 0);
  417. assert(fd_set_events_cb2_return_called == 1);
  418. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  419. /*
  420. * Delete entry and try timeout again
  421. */
  422. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == -1);
  423. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[1]) == 0);
  424. assert((timeout_timer = timer_list_add(
  425. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  426. timeout_cb_called = 0;
  427. assert(pr_poll_loop_exec(poll_loop) == 0);
  428. assert(timeout_cb_called == 1);
  429. /*
  430. * Try reading
  431. */
  432. assert(write(pipe_fd1[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  433. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, NULL,
  434. fd_read_cb1, NULL, NULL,
  435. &fd_read_cb1_called, fd_read_cb1) == 0);
  436. fd_read_cb1_called = 0;
  437. timeout_cb_called = 0;
  438. assert((timeout_timer = timer_list_add(
  439. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  440. assert(pr_poll_loop_exec(poll_loop) == 0);
  441. assert(fd_read_cb1_called == 1);
  442. assert(timeout_cb_called == 0);
  443. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  444. /*
  445. * Try timeout with valid entry
  446. */
  447. assert((timeout_timer = timer_list_add(
  448. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  449. timeout_cb_called = 0;
  450. fd_read_cb1_called = 0;
  451. assert(pr_poll_loop_exec(poll_loop) == 0);
  452. assert(timeout_cb_called == 1);
  453. assert(fd_read_cb1_called == 0);
  454. /*
  455. * Try reading where cb returns err
  456. */
  457. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  458. assert(write(pipe_fd1[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  459. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, NULL,
  460. fd_read_cb2, NULL, NULL,
  461. &fd_read_cb2_called, fd_read_cb2) == 0);
  462. fd_read_cb1_called = 0;
  463. fd_read_cb2_called = 0;
  464. timeout_cb_called = 0;
  465. assert((timeout_timer = timer_list_add(
  466. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  467. assert(pr_poll_loop_exec(poll_loop) == -1);
  468. assert(fd_read_cb1_called == 0);
  469. assert(fd_read_cb2_called == 1);
  470. assert(timeout_cb_called == 0);
  471. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  472. /*
  473. * Try writing
  474. */
  475. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  476. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[1], POLLOUT, NULL,
  477. NULL, fd_write_cb1, NULL,
  478. &fd_write_cb1_called, fd_write_cb1) == 0);
  479. fd_write_cb1_called = 0;
  480. timeout_cb_called = 0;
  481. assert((timeout_timer = timer_list_add(
  482. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  483. assert(pr_poll_loop_exec(poll_loop) == 0);
  484. assert(fd_write_cb1_called == 1);
  485. assert(timeout_cb_called == 0);
  486. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  487. /*
  488. * Try err cb
  489. */
  490. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[1]) == 0);
  491. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, NULL,
  492. NULL, NULL, fd_err_cb1,
  493. &fd_err_cb1_called, fd_err_cb1) == 0);
  494. assert(close(pipe_fd1[0]) == 0);
  495. assert(close(pipe_fd1[1]) == 0);
  496. fd_err_cb1_called = 0;
  497. timeout_cb_called = 0;
  498. fd_write_cb1_called = 0;
  499. assert((timeout_timer = timer_list_add(
  500. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  501. assert(pr_poll_loop_exec(poll_loop) == 0);
  502. assert(fd_err_cb1_called == 1);
  503. assert(fd_write_cb1_called == 0);
  504. assert(timeout_cb_called == 0);
  505. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  506. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  507. }
  508. static void
  509. test_prfd_basics(struct pr_poll_loop *poll_loop)
  510. {
  511. PRFileDesc *read_pipe;
  512. PRFileDesc *write_pipe;
  513. struct timer_list_entry *timeout_timer;
  514. int pipe_fd1[2];
  515. init_global_vars();
  516. assert(PR_CreatePipe(&read_pipe, &write_pipe) == PR_SUCCESS);
  517. /*
  518. * Add POLLNVAL -> failure
  519. */
  520. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLNVAL, NULL, NULL, NULL, NULL,
  521. NULL, NULL) == -1);
  522. /*
  523. * Del non-existing fdL -> failure
  524. */
  525. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == -1);
  526. /*
  527. * Add and delete fd twice
  528. */
  529. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, 0, NULL, NULL, NULL, NULL,
  530. NULL, NULL) == 0);
  531. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, 0, NULL, NULL, NULL, NULL,
  532. NULL, NULL) == -1);
  533. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  534. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == -1);
  535. /*
  536. * Test user_data passing
  537. */
  538. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, prfd_set_events_cb1_return,
  539. NULL, NULL, NULL, (void *)&prfd_set_events_cb1_return_called, NULL) == 0);
  540. prfd_set_events_cb1_return_called = 0;
  541. assert((timeout_timer = timer_list_add(
  542. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  543. assert(pr_poll_loop_exec(poll_loop) == -1);
  544. assert(prfd_set_events_cb1_return_called == 1);
  545. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  546. /*
  547. * Remove entry and try different cb
  548. */
  549. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  550. assert(pr_poll_loop_add_prfd(poll_loop, write_pipe, POLLOUT, prfd_set_events_cb2_return,
  551. NULL, NULL, NULL, NULL, (void *)&prfd_set_events_cb2_return_called) == 0);
  552. prfd_set_events_cb1_return_called = 0;
  553. prfd_set_events_cb2_return_called = 0;
  554. assert((timeout_timer = timer_list_add(
  555. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  556. assert(pr_poll_loop_exec(poll_loop) == -1);
  557. assert(prfd_set_events_cb1_return_called == 0);
  558. assert(prfd_set_events_cb2_return_called == 1);
  559. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  560. /*
  561. * Delete entry and try timeout again
  562. */
  563. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == -1);
  564. assert(pr_poll_loop_del_prfd(poll_loop, write_pipe) == 0);
  565. assert((timeout_timer = timer_list_add(
  566. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  567. timeout_cb_called = 0;
  568. assert(pr_poll_loop_exec(poll_loop) == 0);
  569. assert(timeout_cb_called == 1);
  570. /*
  571. * Try reading
  572. */
  573. assert(PR_Write(write_pipe, READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  574. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, NULL,
  575. prfd_read_cb1, NULL, NULL,
  576. &prfd_read_cb1_called, prfd_read_cb1) == 0);
  577. prfd_read_cb1_called = 0;
  578. timeout_cb_called = 0;
  579. assert((timeout_timer = timer_list_add(
  580. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  581. assert(pr_poll_loop_exec(poll_loop) == 0);
  582. assert(prfd_read_cb1_called == 1);
  583. assert(timeout_cb_called == 0);
  584. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  585. /*
  586. * Try timeout with valid entry
  587. */
  588. assert((timeout_timer = timer_list_add(
  589. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  590. timeout_cb_called = 0;
  591. prfd_read_cb1_called = 0;
  592. assert(pr_poll_loop_exec(poll_loop) == 0);
  593. assert(timeout_cb_called == 1);
  594. assert(prfd_read_cb1_called == 0);
  595. /*
  596. * Try reading where cb returns err
  597. */
  598. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  599. assert(PR_Write(write_pipe, READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  600. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, NULL,
  601. prfd_read_cb2, NULL, NULL,
  602. &prfd_read_cb2_called, prfd_read_cb2) == 0);
  603. prfd_read_cb1_called = 0;
  604. prfd_read_cb2_called = 0;
  605. timeout_cb_called = 0;
  606. assert((timeout_timer = timer_list_add(
  607. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  608. assert(pr_poll_loop_exec(poll_loop) == -1);
  609. assert(prfd_read_cb1_called == 0);
  610. assert(prfd_read_cb2_called == 1);
  611. assert(timeout_cb_called == 0);
  612. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  613. /*
  614. * Try writing
  615. */
  616. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  617. assert(pr_poll_loop_add_prfd(poll_loop, write_pipe, POLLOUT, NULL,
  618. NULL, prfd_write_cb1, NULL,
  619. &prfd_write_cb1_called, prfd_write_cb1) == 0);
  620. prfd_write_cb1_called = 0;
  621. timeout_cb_called = 0;
  622. assert((timeout_timer = timer_list_add(
  623. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  624. assert(pr_poll_loop_exec(poll_loop) == 0);
  625. assert(prfd_write_cb1_called == 1);
  626. assert(timeout_cb_called == 0);
  627. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  628. assert(PR_Close(read_pipe) == 0);
  629. assert(PR_Close(write_pipe) == 0);
  630. /*
  631. * Try err cb
  632. */
  633. assert(pr_poll_loop_del_prfd(poll_loop, write_pipe) == 0);
  634. /*
  635. * Must use native pipe, because PR_Close deallocate PRFileDesc completelly
  636. */
  637. assert(pipe(pipe_fd1) == 0);
  638. assert((read_pipe = PR_CreateSocketPollFd(pipe_fd1[0])) != NULL);
  639. assert(close(pipe_fd1[0]) == 0);
  640. assert(close(pipe_fd1[1]) == 0);
  641. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, NULL,
  642. NULL, NULL, prfd_err_cb1,
  643. &prfd_err_cb1_called, prfd_err_cb1) == 0);
  644. prfd_err_cb1_called = 0;
  645. timeout_cb_called = 0;
  646. prfd_write_cb1_called = 0;
  647. assert((timeout_timer = timer_list_add(
  648. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  649. assert(pr_poll_loop_exec(poll_loop) == 0);
  650. assert(prfd_err_cb1_called == 1);
  651. assert(prfd_write_cb1_called == 0);
  652. assert(timeout_cb_called == 0);
  653. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  654. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  655. assert(PR_DestroySocketPollFd(read_pipe) == PR_SUCCESS);
  656. }
  657. static void
  658. test_complex(struct pr_poll_loop *poll_loop)
  659. {
  660. int pipe_fd1[2], pipe_fd2[2];
  661. PRFileDesc *read_pipe1;
  662. PRFileDesc *write_pipe2;
  663. struct timer_list_entry *timeout_timer;
  664. init_global_vars();
  665. assert(pipe(pipe_fd1) == 0);
  666. assert(pipe(pipe_fd2) == 0);
  667. test_complex_read_pipe1_fd = pipe_fd1[0];
  668. /*
  669. * Add pre poll cb1
  670. */
  671. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  672. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  673. assert((read_pipe1 = PR_CreateSocketPollFd(pipe_fd1[0])) != NULL);
  674. assert((write_pipe2 = PR_CreateSocketPollFd(pipe_fd2[1])) != NULL);
  675. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe1, 0, test_complex_set_events_pipe1_read_cb,
  676. test_complex_read_pipe1_read_cb, test_complex_write_pipe1_read_cb, NULL,
  677. &test_complex_set_events_pipe1_read_called, test_complex_set_events_pipe1_read_cb) == 0);
  678. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[1], 0, test_complex_set_events_pipe1_write_cb,
  679. test_complex_read_pipe1_write_cb, test_complex_write_pipe1_write_cb, NULL,
  680. &test_complex_set_events_pipe1_write_called, test_complex_set_events_pipe1_write_cb) == 0);
  681. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd2[0], POLLIN, test_complex_set_events_pipe2_read_cb,
  682. test_complex_read_pipe2_read_cb, test_complex_write_pipe2_read_cb, NULL,
  683. &test_complex_set_events_pipe2_read_called, test_complex_set_events_pipe2_read_cb) == 0);
  684. assert(pr_poll_loop_add_prfd(poll_loop, write_pipe2, POLLOUT, test_complex_set_events_pipe2_write_cb,
  685. test_complex_read_pipe2_write_cb, test_complex_write_pipe2_write_cb, NULL,
  686. &test_complex_set_events_pipe2_write_called, test_complex_set_events_pipe2_write_cb) == 0);
  687. timeout_cb_called = 0;
  688. test_complex_set_events_pipe1_read_called = 0;
  689. test_complex_read_pipe1_read_called = 0;
  690. test_complex_set_events_pipe1_write_called = 0;
  691. test_complex_write_pipe1_write_called = 0;
  692. test_complex_set_events_pipe2_read_called = 0;
  693. test_complex_read_pipe2_read_called = 0;
  694. test_complex_set_events_pipe2_write_called = 0;
  695. test_complex_write_pipe2_write_called = 0;
  696. pre_poll_cb1_called = 0;
  697. pre_poll_cb2_called = 0;
  698. /*
  699. * Call for first time -> all set_events should be called and pipe2_write should be called
  700. */
  701. assert((timeout_timer = timer_list_add(
  702. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  703. assert(pr_poll_loop_exec(poll_loop) == 0);
  704. assert(pre_poll_cb1_called == 1);
  705. assert(pre_poll_cb2_called == 0);
  706. assert(test_complex_set_events_pipe1_read_called == 1);
  707. assert(test_complex_read_pipe1_read_called == 0);
  708. assert(test_complex_set_events_pipe1_write_called == 1);
  709. assert(test_complex_write_pipe1_write_called == 0);
  710. assert(test_complex_set_events_pipe2_read_called == 1);
  711. assert(test_complex_read_pipe2_read_called == 0);
  712. assert(test_complex_set_events_pipe2_write_called == 1);
  713. assert(test_complex_write_pipe2_write_called == 1);
  714. assert(timeout_cb_called == 0);
  715. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  716. /*
  717. * Call for second time -> same as first time
  718. */
  719. assert((timeout_timer = timer_list_add(
  720. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  721. assert(pr_poll_loop_exec(poll_loop) == 0);
  722. assert(pre_poll_cb1_called == 2);
  723. assert(pre_poll_cb2_called == 0);
  724. assert(test_complex_set_events_pipe1_read_called == 2);
  725. assert(test_complex_read_pipe1_read_called == 0);
  726. assert(test_complex_set_events_pipe1_write_called == 2);
  727. assert(test_complex_write_pipe1_write_called == 0);
  728. assert(test_complex_set_events_pipe2_read_called == 2);
  729. assert(test_complex_read_pipe2_read_called == 0);
  730. assert(test_complex_set_events_pipe2_write_called == 2);
  731. assert(test_complex_write_pipe2_write_called == 2);
  732. assert(timeout_cb_called == 0);
  733. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  734. /*
  735. * Change state to prepare for writing
  736. */
  737. test_complex_state = 1;
  738. assert((timeout_timer = timer_list_add(
  739. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  740. assert(pr_poll_loop_exec(poll_loop) == 0);
  741. assert(pre_poll_cb1_called == 3);
  742. assert(pre_poll_cb2_called == 0);
  743. assert(test_complex_set_events_pipe1_read_called == 3);
  744. assert(test_complex_read_pipe1_read_called == 0);
  745. assert(test_complex_set_events_pipe1_write_called == 3);
  746. assert(test_complex_write_pipe1_write_called == 1);
  747. assert(test_complex_set_events_pipe2_read_called == 3);
  748. assert(test_complex_read_pipe2_read_called == 0);
  749. assert(test_complex_set_events_pipe2_write_called == 3);
  750. assert(test_complex_write_pipe2_write_called == 3);
  751. assert(timeout_cb_called == 0);
  752. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  753. /*
  754. * Write to first pipe
  755. */
  756. assert(write(pipe_fd1[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  757. assert((timeout_timer = timer_list_add(
  758. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  759. assert(pr_poll_loop_exec(poll_loop) == 0);
  760. assert(pre_poll_cb1_called == 4);
  761. assert(pre_poll_cb2_called == 0);
  762. assert(test_complex_set_events_pipe1_read_called == 4);
  763. assert(test_complex_read_pipe1_read_called == 0);
  764. assert(test_complex_set_events_pipe1_write_called == 4);
  765. assert(test_complex_write_pipe1_write_called == 2);
  766. assert(test_complex_set_events_pipe2_read_called == 4);
  767. assert(test_complex_read_pipe2_read_called == 0);
  768. assert(test_complex_set_events_pipe2_write_called == 4);
  769. assert(test_complex_write_pipe2_write_called == 4);
  770. assert(timeout_cb_called == 0);
  771. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  772. /*
  773. * Delete pre poll cb
  774. */
  775. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  776. /*
  777. * Change state so write can propagate
  778. */
  779. test_complex_state = 2;
  780. assert((timeout_timer = timer_list_add(
  781. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  782. assert(pr_poll_loop_exec(poll_loop) == 0);
  783. assert(pre_poll_cb1_called == 4);
  784. assert(pre_poll_cb2_called == 0);
  785. assert(test_complex_set_events_pipe1_read_called == 5);
  786. assert(test_complex_read_pipe1_read_called == 1);
  787. assert(test_complex_set_events_pipe1_write_called == 5);
  788. assert(test_complex_write_pipe1_write_called == 2);
  789. assert(test_complex_set_events_pipe2_read_called == 5);
  790. assert(test_complex_read_pipe2_read_called == 0);
  791. assert(test_complex_set_events_pipe2_write_called == 5);
  792. assert(test_complex_write_pipe2_write_called == 5);
  793. assert(timeout_cb_called == 0);
  794. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  795. /*
  796. * Add pre poll cb 1 and 2
  797. */
  798. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  799. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  800. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb2,
  801. &pre_poll_cb2_called, test_pre_poll_cb2) == 0);
  802. /*
  803. * Change state so pipe1 events are not called any longer
  804. */
  805. test_complex_state = 4;
  806. assert((timeout_timer = timer_list_add(
  807. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  808. assert(pr_poll_loop_exec(poll_loop) == 0);
  809. assert(pre_poll_cb1_called == 5);
  810. assert(pre_poll_cb2_called == 1);
  811. assert(test_complex_set_events_pipe1_read_called == 6);
  812. assert(test_complex_read_pipe1_read_called == 1);
  813. assert(test_complex_set_events_pipe1_write_called == 6);
  814. assert(test_complex_write_pipe1_write_called == 2);
  815. assert(test_complex_set_events_pipe2_read_called == 6);
  816. assert(test_complex_read_pipe2_read_called == 0);
  817. assert(test_complex_set_events_pipe2_write_called == 6);
  818. assert(test_complex_write_pipe2_write_called == 6);
  819. assert(timeout_cb_called == 0);
  820. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  821. /*
  822. * Write to second pipe
  823. */
  824. assert(write(pipe_fd2[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  825. assert((timeout_timer = timer_list_add(
  826. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  827. assert(pr_poll_loop_exec(poll_loop) == 0);
  828. assert(pre_poll_cb1_called == 6);
  829. assert(pre_poll_cb2_called == 2);
  830. assert(test_complex_set_events_pipe1_read_called == 7);
  831. assert(test_complex_read_pipe1_read_called == 1);
  832. assert(test_complex_set_events_pipe1_write_called == 7);
  833. assert(test_complex_write_pipe1_write_called == 2);
  834. assert(test_complex_set_events_pipe2_read_called == 7);
  835. assert(test_complex_read_pipe2_read_called == 1);
  836. assert(test_complex_set_events_pipe2_write_called == 7);
  837. assert(test_complex_write_pipe2_write_called == 7);
  838. assert(timeout_cb_called == 0);
  839. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  840. /*
  841. * And call again
  842. */
  843. assert((timeout_timer = timer_list_add(
  844. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  845. assert(pr_poll_loop_exec(poll_loop) == 0);
  846. assert(pre_poll_cb1_called == 7);
  847. assert(pre_poll_cb2_called == 3);
  848. assert(test_complex_set_events_pipe1_read_called == 8);
  849. assert(test_complex_read_pipe1_read_called == 1);
  850. assert(test_complex_set_events_pipe1_write_called == 8);
  851. assert(test_complex_write_pipe1_write_called == 2);
  852. assert(test_complex_set_events_pipe2_read_called == 8);
  853. assert(test_complex_read_pipe2_read_called == 1);
  854. assert(test_complex_set_events_pipe2_write_called == 8);
  855. assert(test_complex_write_pipe2_write_called == 8);
  856. assert(timeout_cb_called == 0);
  857. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  858. assert(PR_DestroySocketPollFd(read_pipe1) == PR_SUCCESS);
  859. assert(PR_DestroySocketPollFd(write_pipe2) == PR_SUCCESS);
  860. assert(close(pipe_fd1[0]) == 0);
  861. assert(close(pipe_fd1[1]) == 0);
  862. assert(close(pipe_fd2[0]) == 0);
  863. assert(close(pipe_fd2[1]) == 0);
  864. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  865. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == 0);
  866. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe1) == 0);
  867. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[1]) == 0);
  868. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd2[0]) == 0);
  869. assert(pr_poll_loop_del_prfd(poll_loop, write_pipe2) == 0);
  870. }
  871. static void
  872. test_pre_poll_cb(struct pr_poll_loop *poll_loop)
  873. {
  874. struct timer_list_entry *timeout_timer;
  875. init_global_vars();
  876. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  877. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  878. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  879. &pre_poll_cb1_called, test_pre_poll_cb1) == -1);
  880. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  881. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == -1);
  882. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == -1);
  883. /*
  884. * Just one pre poll cb
  885. */
  886. pre_poll_cb1_called = 0;
  887. pre_poll_cb2_called = 0;
  888. pre_poll_cb_return_called = 0;
  889. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  890. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  891. assert((timeout_timer = timer_list_add(
  892. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  893. timeout_cb_called = 0;
  894. assert(pr_poll_loop_exec(poll_loop) == 0);
  895. assert(timeout_cb_called == 1);
  896. assert(pre_poll_cb1_called == 1);
  897. assert(pre_poll_cb2_called == 0);
  898. assert(pre_poll_cb_return_called == 0);
  899. /*
  900. * Test again
  901. */
  902. assert((timeout_timer = timer_list_add(
  903. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  904. timeout_cb_called = 0;
  905. assert(pr_poll_loop_exec(poll_loop) == 0);
  906. assert(timeout_cb_called == 1);
  907. assert(pre_poll_cb1_called == 2);
  908. assert(pre_poll_cb2_called == 0);
  909. assert(pre_poll_cb_return_called == 0);
  910. /*
  911. * Add second cb
  912. */
  913. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb2,
  914. &pre_poll_cb2_called, test_pre_poll_cb2) == 0);
  915. assert((timeout_timer = timer_list_add(
  916. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  917. timeout_cb_called = 0;
  918. assert(pr_poll_loop_exec(poll_loop) == 0);
  919. assert(timeout_cb_called == 1);
  920. assert(pre_poll_cb1_called == 3);
  921. assert(pre_poll_cb2_called == 1);
  922. assert(pre_poll_cb_return_called == 0);
  923. /*
  924. * Remove cb1
  925. */
  926. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  927. assert((timeout_timer = timer_list_add(
  928. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  929. timeout_cb_called = 0;
  930. assert(pr_poll_loop_exec(poll_loop) == 0);
  931. assert(timeout_cb_called == 1);
  932. assert(pre_poll_cb1_called == 3);
  933. assert(pre_poll_cb2_called == 2);
  934. assert(pre_poll_cb_return_called == 0);
  935. /*
  936. * Add cb1 and cb return
  937. */
  938. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  939. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  940. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb_return,
  941. &pre_poll_cb_return_called, test_pre_poll_cb_return) == 0);
  942. assert((timeout_timer = timer_list_add(
  943. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  944. timeout_cb_called = 0;
  945. assert(pr_poll_loop_exec(poll_loop) == -1);
  946. assert(timeout_cb_called == 0);
  947. assert(pre_poll_cb1_called == 4);
  948. assert(pre_poll_cb2_called == 3);
  949. assert(pre_poll_cb_return_called == 1);
  950. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  951. /*
  952. * Remove cb_return
  953. */
  954. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb_return) == 0);
  955. assert((timeout_timer = timer_list_add(
  956. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  957. timeout_cb_called = 0;
  958. assert(pr_poll_loop_exec(poll_loop) == 0);
  959. assert(timeout_cb_called == 1);
  960. assert(pre_poll_cb1_called == 5);
  961. assert(pre_poll_cb2_called == 4);
  962. assert(pre_poll_cb_return_called == 1);
  963. /*
  964. * Cleanup
  965. */
  966. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  967. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == 0);
  968. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb_return) == -1);
  969. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == -1);
  970. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == -1);
  971. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb_return) == -1);
  972. }
  973. int
  974. main(void)
  975. {
  976. struct pr_poll_loop poll_loop;
  977. PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
  978. pr_poll_loop_init(&poll_loop);
  979. test_fd_basics(&poll_loop);
  980. test_prfd_basics(&poll_loop);
  981. test_pre_poll_cb(&poll_loop);
  982. test_complex(&poll_loop);
  983. pr_poll_loop_destroy(&poll_loop);
  984. assert(PR_Cleanup() == PR_SUCCESS);
  985. return (0);
  986. }