test-pr-poll-loop.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306
  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. timeout_timer = timer_list_add(
  378. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  379. assert(timeout_timer != NULL);
  380. timeout_cb_called = 0;
  381. assert(pr_poll_loop_exec(poll_loop) == 0);
  382. assert(timeout_cb_called == 1);
  383. /*
  384. * Test user_data passing
  385. */
  386. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, fd_set_events_cb1_return,
  387. NULL, NULL, NULL, (void *)&fd_set_events_cb1_return_called, NULL) == 0);
  388. fd_set_events_cb1_return_called = 0;
  389. timeout_timer = timer_list_add(
  390. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  391. assert(timeout_timer != NULL);
  392. assert(pr_poll_loop_exec(poll_loop) == -1);
  393. assert(fd_set_events_cb1_return_called == 1);
  394. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  395. /*
  396. * Remove entry and try with zero events and -2 return callback
  397. */
  398. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  399. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], 0, fd_set_events_cb1_return,
  400. NULL, NULL, NULL, (void *)&fd_set_events_cb1_return_called, NULL) == 0);
  401. fd_set_events_cb1_return_called = 0;
  402. timeout_timer = timer_list_add(
  403. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  404. assert(timeout_timer != NULL);
  405. assert(pr_poll_loop_exec(poll_loop) == -1);
  406. assert(fd_set_events_cb1_return_called == 1);
  407. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  408. /*
  409. * Remove entry and try different cb
  410. */
  411. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  412. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[1], POLLOUT, fd_set_events_cb2_return,
  413. NULL, NULL, NULL, NULL, (void *)&fd_set_events_cb2_return_called) == 0);
  414. fd_set_events_cb1_return_called = 0;
  415. fd_set_events_cb2_return_called = 0;
  416. timeout_timer = timer_list_add(
  417. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  418. assert(timeout_timer != NULL);
  419. assert(pr_poll_loop_exec(poll_loop) == -1);
  420. assert(fd_set_events_cb1_return_called == 0);
  421. assert(fd_set_events_cb2_return_called == 1);
  422. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  423. /*
  424. * Delete entry and try timeout again
  425. */
  426. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == -1);
  427. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[1]) == 0);
  428. timeout_timer = timer_list_add(
  429. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  430. assert(timeout_timer != NULL);
  431. timeout_cb_called = 0;
  432. assert(pr_poll_loop_exec(poll_loop) == 0);
  433. assert(timeout_cb_called == 1);
  434. /*
  435. * Try reading
  436. */
  437. assert(write(pipe_fd1[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  438. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, NULL,
  439. fd_read_cb1, NULL, NULL,
  440. &fd_read_cb1_called, fd_read_cb1) == 0);
  441. fd_read_cb1_called = 0;
  442. timeout_cb_called = 0;
  443. timeout_timer = timer_list_add(
  444. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  445. assert(timeout_timer != NULL);
  446. assert(pr_poll_loop_exec(poll_loop) == 0);
  447. assert(fd_read_cb1_called == 1);
  448. assert(timeout_cb_called == 0);
  449. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  450. /*
  451. * Try timeout with valid entry
  452. */
  453. timeout_timer = timer_list_add(
  454. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  455. assert(timeout_timer != NULL);
  456. timeout_cb_called = 0;
  457. fd_read_cb1_called = 0;
  458. assert(pr_poll_loop_exec(poll_loop) == 0);
  459. assert(timeout_cb_called == 1);
  460. assert(fd_read_cb1_called == 0);
  461. /*
  462. * Try reading where cb returns err
  463. */
  464. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  465. assert(write(pipe_fd1[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  466. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, NULL,
  467. fd_read_cb2, NULL, NULL,
  468. &fd_read_cb2_called, fd_read_cb2) == 0);
  469. fd_read_cb1_called = 0;
  470. fd_read_cb2_called = 0;
  471. timeout_cb_called = 0;
  472. timeout_timer = timer_list_add(
  473. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  474. assert(timeout_timer != NULL);
  475. assert(pr_poll_loop_exec(poll_loop) == -1);
  476. assert(fd_read_cb1_called == 0);
  477. assert(fd_read_cb2_called == 1);
  478. assert(timeout_cb_called == 0);
  479. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  480. /*
  481. * Try writing
  482. */
  483. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  484. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[1], POLLOUT, NULL,
  485. NULL, fd_write_cb1, NULL,
  486. &fd_write_cb1_called, fd_write_cb1) == 0);
  487. fd_write_cb1_called = 0;
  488. timeout_cb_called = 0;
  489. timeout_timer = timer_list_add(
  490. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  491. assert(timeout_timer != NULL);
  492. assert(pr_poll_loop_exec(poll_loop) == 0);
  493. assert(fd_write_cb1_called == 1);
  494. assert(timeout_cb_called == 0);
  495. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  496. /*
  497. * Try err cb
  498. */
  499. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[1]) == 0);
  500. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, NULL,
  501. NULL, NULL, fd_err_cb1,
  502. &fd_err_cb1_called, fd_err_cb1) == 0);
  503. assert(close(pipe_fd1[0]) == 0);
  504. assert(close(pipe_fd1[1]) == 0);
  505. fd_err_cb1_called = 0;
  506. timeout_cb_called = 0;
  507. fd_write_cb1_called = 0;
  508. timeout_timer = timer_list_add(
  509. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  510. assert(timeout_timer != NULL);
  511. assert(pr_poll_loop_exec(poll_loop) == 0);
  512. assert(fd_err_cb1_called == 1);
  513. assert(fd_write_cb1_called == 0);
  514. assert(timeout_cb_called == 0);
  515. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  516. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  517. }
  518. static void
  519. test_prfd_basics(struct pr_poll_loop *poll_loop)
  520. {
  521. PRFileDesc *read_pipe;
  522. PRFileDesc *write_pipe;
  523. struct timer_list_entry *timeout_timer;
  524. int pipe_fd1[2];
  525. init_global_vars();
  526. assert(PR_CreatePipe(&read_pipe, &write_pipe) == PR_SUCCESS);
  527. /*
  528. * Add POLLNVAL -> failure
  529. */
  530. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLNVAL, NULL, NULL, NULL, NULL,
  531. NULL, NULL) == -1);
  532. /*
  533. * Del non-existing fdL -> failure
  534. */
  535. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == -1);
  536. /*
  537. * Add and delete fd twice
  538. */
  539. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, 0, NULL, NULL, NULL, NULL,
  540. NULL, NULL) == 0);
  541. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, 0, NULL, NULL, NULL, NULL,
  542. NULL, NULL) == -1);
  543. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  544. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == -1);
  545. /*
  546. * Test user_data passing
  547. */
  548. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, prfd_set_events_cb1_return,
  549. NULL, NULL, NULL, (void *)&prfd_set_events_cb1_return_called, NULL) == 0);
  550. prfd_set_events_cb1_return_called = 0;
  551. timeout_timer = timer_list_add(
  552. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  553. assert(timeout_timer != NULL);
  554. assert(pr_poll_loop_exec(poll_loop) == -1);
  555. assert(prfd_set_events_cb1_return_called == 1);
  556. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  557. /*
  558. * Remove entry and try different cb
  559. */
  560. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  561. assert(pr_poll_loop_add_prfd(poll_loop, write_pipe, POLLOUT, prfd_set_events_cb2_return,
  562. NULL, NULL, NULL, NULL, (void *)&prfd_set_events_cb2_return_called) == 0);
  563. prfd_set_events_cb1_return_called = 0;
  564. prfd_set_events_cb2_return_called = 0;
  565. timeout_timer = timer_list_add(
  566. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  567. assert(timeout_timer != NULL);
  568. assert(pr_poll_loop_exec(poll_loop) == -1);
  569. assert(prfd_set_events_cb1_return_called == 0);
  570. assert(prfd_set_events_cb2_return_called == 1);
  571. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  572. /*
  573. * Delete entry and try timeout again
  574. */
  575. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == -1);
  576. assert(pr_poll_loop_del_prfd(poll_loop, write_pipe) == 0);
  577. timeout_timer = timer_list_add(
  578. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  579. assert(timeout_timer != NULL);
  580. timeout_cb_called = 0;
  581. assert(pr_poll_loop_exec(poll_loop) == 0);
  582. assert(timeout_cb_called == 1);
  583. /*
  584. * Try reading
  585. */
  586. assert(PR_Write(write_pipe, READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  587. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, NULL,
  588. prfd_read_cb1, NULL, NULL,
  589. &prfd_read_cb1_called, prfd_read_cb1) == 0);
  590. prfd_read_cb1_called = 0;
  591. timeout_cb_called = 0;
  592. timeout_timer = timer_list_add(
  593. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  594. assert(timeout_timer != NULL);
  595. assert(pr_poll_loop_exec(poll_loop) == 0);
  596. assert(prfd_read_cb1_called == 1);
  597. assert(timeout_cb_called == 0);
  598. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  599. /*
  600. * Try timeout with valid entry
  601. */
  602. timeout_timer = timer_list_add(
  603. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  604. assert(timeout_timer != NULL);
  605. timeout_cb_called = 0;
  606. prfd_read_cb1_called = 0;
  607. assert(pr_poll_loop_exec(poll_loop) == 0);
  608. assert(timeout_cb_called == 1);
  609. assert(prfd_read_cb1_called == 0);
  610. /*
  611. * Try reading where cb returns err
  612. */
  613. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  614. assert(PR_Write(write_pipe, READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  615. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, NULL,
  616. prfd_read_cb2, NULL, NULL,
  617. &prfd_read_cb2_called, prfd_read_cb2) == 0);
  618. prfd_read_cb1_called = 0;
  619. prfd_read_cb2_called = 0;
  620. timeout_cb_called = 0;
  621. timeout_timer = timer_list_add(
  622. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  623. assert(timeout_timer != NULL);
  624. assert(pr_poll_loop_exec(poll_loop) == -1);
  625. assert(prfd_read_cb1_called == 0);
  626. assert(prfd_read_cb2_called == 1);
  627. assert(timeout_cb_called == 0);
  628. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  629. /*
  630. * Try writing
  631. */
  632. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  633. assert(pr_poll_loop_add_prfd(poll_loop, write_pipe, POLLOUT, NULL,
  634. NULL, prfd_write_cb1, NULL,
  635. &prfd_write_cb1_called, prfd_write_cb1) == 0);
  636. prfd_write_cb1_called = 0;
  637. timeout_cb_called = 0;
  638. timeout_timer = timer_list_add(
  639. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  640. assert(timeout_timer != NULL);
  641. assert(pr_poll_loop_exec(poll_loop) == 0);
  642. assert(prfd_write_cb1_called == 1);
  643. assert(timeout_cb_called == 0);
  644. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  645. assert(PR_Close(read_pipe) == 0);
  646. assert(PR_Close(write_pipe) == 0);
  647. /*
  648. * Try err cb
  649. */
  650. assert(pr_poll_loop_del_prfd(poll_loop, write_pipe) == 0);
  651. /*
  652. * Must use native pipe, because PR_Close deallocate PRFileDesc completelly
  653. */
  654. assert(pipe(pipe_fd1) == 0);
  655. read_pipe = PR_CreateSocketPollFd(pipe_fd1[0]);
  656. assert(read_pipe != NULL);
  657. assert(close(pipe_fd1[0]) == 0);
  658. assert(close(pipe_fd1[1]) == 0);
  659. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, NULL,
  660. NULL, NULL, prfd_err_cb1,
  661. &prfd_err_cb1_called, prfd_err_cb1) == 0);
  662. prfd_err_cb1_called = 0;
  663. timeout_cb_called = 0;
  664. prfd_write_cb1_called = 0;
  665. timeout_timer = timer_list_add(
  666. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  667. assert(timeout_timer != NULL);
  668. assert(pr_poll_loop_exec(poll_loop) == 0);
  669. assert(prfd_err_cb1_called == 1);
  670. assert(prfd_write_cb1_called == 0);
  671. assert(timeout_cb_called == 0);
  672. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  673. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  674. assert(PR_DestroySocketPollFd(read_pipe) == PR_SUCCESS);
  675. }
  676. static void
  677. test_complex(struct pr_poll_loop *poll_loop)
  678. {
  679. int pipe_fd1[2], pipe_fd2[2];
  680. PRFileDesc *read_pipe1;
  681. PRFileDesc *write_pipe2;
  682. struct timer_list_entry *timeout_timer;
  683. init_global_vars();
  684. assert(pipe(pipe_fd1) == 0);
  685. assert(pipe(pipe_fd2) == 0);
  686. test_complex_read_pipe1_fd = pipe_fd1[0];
  687. /*
  688. * Add pre poll cb1
  689. */
  690. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  691. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  692. read_pipe1 = PR_CreateSocketPollFd(pipe_fd1[0]);
  693. assert(read_pipe1 != NULL);
  694. write_pipe2 = PR_CreateSocketPollFd(pipe_fd2[1]);
  695. assert(write_pipe2 != NULL);
  696. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe1, 0, test_complex_set_events_pipe1_read_cb,
  697. test_complex_read_pipe1_read_cb, test_complex_write_pipe1_read_cb, NULL,
  698. &test_complex_set_events_pipe1_read_called, test_complex_set_events_pipe1_read_cb) == 0);
  699. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[1], 0, test_complex_set_events_pipe1_write_cb,
  700. test_complex_read_pipe1_write_cb, test_complex_write_pipe1_write_cb, NULL,
  701. &test_complex_set_events_pipe1_write_called, test_complex_set_events_pipe1_write_cb) == 0);
  702. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd2[0], POLLIN, test_complex_set_events_pipe2_read_cb,
  703. test_complex_read_pipe2_read_cb, test_complex_write_pipe2_read_cb, NULL,
  704. &test_complex_set_events_pipe2_read_called, test_complex_set_events_pipe2_read_cb) == 0);
  705. assert(pr_poll_loop_add_prfd(poll_loop, write_pipe2, POLLOUT, test_complex_set_events_pipe2_write_cb,
  706. test_complex_read_pipe2_write_cb, test_complex_write_pipe2_write_cb, NULL,
  707. &test_complex_set_events_pipe2_write_called, test_complex_set_events_pipe2_write_cb) == 0);
  708. timeout_cb_called = 0;
  709. test_complex_set_events_pipe1_read_called = 0;
  710. test_complex_read_pipe1_read_called = 0;
  711. test_complex_set_events_pipe1_write_called = 0;
  712. test_complex_write_pipe1_write_called = 0;
  713. test_complex_set_events_pipe2_read_called = 0;
  714. test_complex_read_pipe2_read_called = 0;
  715. test_complex_set_events_pipe2_write_called = 0;
  716. test_complex_write_pipe2_write_called = 0;
  717. pre_poll_cb1_called = 0;
  718. pre_poll_cb2_called = 0;
  719. /*
  720. * Call for first time -> all set_events should be called and pipe2_write should be called
  721. */
  722. timeout_timer = timer_list_add(
  723. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  724. assert(timeout_timer != NULL);
  725. assert(pr_poll_loop_exec(poll_loop) == 0);
  726. assert(pre_poll_cb1_called == 1);
  727. assert(pre_poll_cb2_called == 0);
  728. assert(test_complex_set_events_pipe1_read_called == 1);
  729. assert(test_complex_read_pipe1_read_called == 0);
  730. assert(test_complex_set_events_pipe1_write_called == 1);
  731. assert(test_complex_write_pipe1_write_called == 0);
  732. assert(test_complex_set_events_pipe2_read_called == 1);
  733. assert(test_complex_read_pipe2_read_called == 0);
  734. assert(test_complex_set_events_pipe2_write_called == 1);
  735. assert(test_complex_write_pipe2_write_called == 1);
  736. assert(timeout_cb_called == 0);
  737. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  738. /*
  739. * Call for second time -> same as first time
  740. */
  741. timeout_timer = timer_list_add(
  742. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  743. assert(timeout_timer != NULL);
  744. assert(pr_poll_loop_exec(poll_loop) == 0);
  745. assert(pre_poll_cb1_called == 2);
  746. assert(pre_poll_cb2_called == 0);
  747. assert(test_complex_set_events_pipe1_read_called == 2);
  748. assert(test_complex_read_pipe1_read_called == 0);
  749. assert(test_complex_set_events_pipe1_write_called == 2);
  750. assert(test_complex_write_pipe1_write_called == 0);
  751. assert(test_complex_set_events_pipe2_read_called == 2);
  752. assert(test_complex_read_pipe2_read_called == 0);
  753. assert(test_complex_set_events_pipe2_write_called == 2);
  754. assert(test_complex_write_pipe2_write_called == 2);
  755. assert(timeout_cb_called == 0);
  756. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  757. /*
  758. * Change state to prepare for writing
  759. */
  760. test_complex_state = 1;
  761. timeout_timer = timer_list_add(
  762. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  763. assert(timeout_timer != NULL);
  764. assert(pr_poll_loop_exec(poll_loop) == 0);
  765. assert(pre_poll_cb1_called == 3);
  766. assert(pre_poll_cb2_called == 0);
  767. assert(test_complex_set_events_pipe1_read_called == 3);
  768. assert(test_complex_read_pipe1_read_called == 0);
  769. assert(test_complex_set_events_pipe1_write_called == 3);
  770. assert(test_complex_write_pipe1_write_called == 1);
  771. assert(test_complex_set_events_pipe2_read_called == 3);
  772. assert(test_complex_read_pipe2_read_called == 0);
  773. assert(test_complex_set_events_pipe2_write_called == 3);
  774. assert(test_complex_write_pipe2_write_called == 3);
  775. assert(timeout_cb_called == 0);
  776. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  777. /*
  778. * Write to first pipe
  779. */
  780. assert(write(pipe_fd1[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  781. timeout_timer = timer_list_add(
  782. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  783. assert(timeout_timer != NULL);
  784. assert(pr_poll_loop_exec(poll_loop) == 0);
  785. assert(pre_poll_cb1_called == 4);
  786. assert(pre_poll_cb2_called == 0);
  787. assert(test_complex_set_events_pipe1_read_called == 4);
  788. assert(test_complex_read_pipe1_read_called == 0);
  789. assert(test_complex_set_events_pipe1_write_called == 4);
  790. assert(test_complex_write_pipe1_write_called == 2);
  791. assert(test_complex_set_events_pipe2_read_called == 4);
  792. assert(test_complex_read_pipe2_read_called == 0);
  793. assert(test_complex_set_events_pipe2_write_called == 4);
  794. assert(test_complex_write_pipe2_write_called == 4);
  795. assert(timeout_cb_called == 0);
  796. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  797. /*
  798. * Delete pre poll cb
  799. */
  800. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  801. /*
  802. * Change state so write can propagate
  803. */
  804. test_complex_state = 2;
  805. timeout_timer = timer_list_add(
  806. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  807. assert(timeout_timer != NULL);
  808. assert(pr_poll_loop_exec(poll_loop) == 0);
  809. assert(pre_poll_cb1_called == 4);
  810. assert(pre_poll_cb2_called == 0);
  811. assert(test_complex_set_events_pipe1_read_called == 5);
  812. assert(test_complex_read_pipe1_read_called == 1);
  813. assert(test_complex_set_events_pipe1_write_called == 5);
  814. assert(test_complex_write_pipe1_write_called == 2);
  815. assert(test_complex_set_events_pipe2_read_called == 5);
  816. assert(test_complex_read_pipe2_read_called == 0);
  817. assert(test_complex_set_events_pipe2_write_called == 5);
  818. assert(test_complex_write_pipe2_write_called == 5);
  819. assert(timeout_cb_called == 0);
  820. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  821. /*
  822. * Add pre poll cb 1 and 2
  823. */
  824. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  825. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  826. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb2,
  827. &pre_poll_cb2_called, test_pre_poll_cb2) == 0);
  828. /*
  829. * Change state so pipe1 events are not called any longer
  830. */
  831. test_complex_state = 4;
  832. timeout_timer = timer_list_add(
  833. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  834. assert(timeout_timer != NULL);
  835. assert(pr_poll_loop_exec(poll_loop) == 0);
  836. assert(pre_poll_cb1_called == 5);
  837. assert(pre_poll_cb2_called == 1);
  838. assert(test_complex_set_events_pipe1_read_called == 6);
  839. assert(test_complex_read_pipe1_read_called == 1);
  840. assert(test_complex_set_events_pipe1_write_called == 6);
  841. assert(test_complex_write_pipe1_write_called == 2);
  842. assert(test_complex_set_events_pipe2_read_called == 6);
  843. assert(test_complex_read_pipe2_read_called == 0);
  844. assert(test_complex_set_events_pipe2_write_called == 6);
  845. assert(test_complex_write_pipe2_write_called == 6);
  846. assert(timeout_cb_called == 0);
  847. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  848. /*
  849. * Write to second pipe
  850. */
  851. assert(write(pipe_fd2[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  852. timeout_timer = timer_list_add(
  853. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  854. assert(timeout_timer != NULL);
  855. assert(pr_poll_loop_exec(poll_loop) == 0);
  856. assert(pre_poll_cb1_called == 6);
  857. assert(pre_poll_cb2_called == 2);
  858. assert(test_complex_set_events_pipe1_read_called == 7);
  859. assert(test_complex_read_pipe1_read_called == 1);
  860. assert(test_complex_set_events_pipe1_write_called == 7);
  861. assert(test_complex_write_pipe1_write_called == 2);
  862. assert(test_complex_set_events_pipe2_read_called == 7);
  863. assert(test_complex_read_pipe2_read_called == 1);
  864. assert(test_complex_set_events_pipe2_write_called == 7);
  865. assert(test_complex_write_pipe2_write_called == 7);
  866. assert(timeout_cb_called == 0);
  867. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  868. /*
  869. * And call again
  870. */
  871. timeout_timer = timer_list_add(
  872. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL);
  873. assert(timeout_timer != NULL);
  874. assert(pr_poll_loop_exec(poll_loop) == 0);
  875. assert(pre_poll_cb1_called == 7);
  876. assert(pre_poll_cb2_called == 3);
  877. assert(test_complex_set_events_pipe1_read_called == 8);
  878. assert(test_complex_read_pipe1_read_called == 1);
  879. assert(test_complex_set_events_pipe1_write_called == 8);
  880. assert(test_complex_write_pipe1_write_called == 2);
  881. assert(test_complex_set_events_pipe2_read_called == 8);
  882. assert(test_complex_read_pipe2_read_called == 1);
  883. assert(test_complex_set_events_pipe2_write_called == 8);
  884. assert(test_complex_write_pipe2_write_called == 8);
  885. assert(timeout_cb_called == 0);
  886. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  887. assert(PR_DestroySocketPollFd(read_pipe1) == PR_SUCCESS);
  888. assert(PR_DestroySocketPollFd(write_pipe2) == PR_SUCCESS);
  889. assert(close(pipe_fd1[0]) == 0);
  890. assert(close(pipe_fd1[1]) == 0);
  891. assert(close(pipe_fd2[0]) == 0);
  892. assert(close(pipe_fd2[1]) == 0);
  893. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  894. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == 0);
  895. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe1) == 0);
  896. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[1]) == 0);
  897. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd2[0]) == 0);
  898. assert(pr_poll_loop_del_prfd(poll_loop, write_pipe2) == 0);
  899. }
  900. static void
  901. test_pre_poll_cb(struct pr_poll_loop *poll_loop)
  902. {
  903. struct timer_list_entry *timeout_timer;
  904. init_global_vars();
  905. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  906. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  907. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  908. &pre_poll_cb1_called, test_pre_poll_cb1) == -1);
  909. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  910. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == -1);
  911. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == -1);
  912. /*
  913. * Just one pre poll cb
  914. */
  915. pre_poll_cb1_called = 0;
  916. pre_poll_cb2_called = 0;
  917. pre_poll_cb_return_called = 0;
  918. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  919. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  920. timeout_timer = timer_list_add(
  921. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  922. assert(timeout_timer != NULL);
  923. timeout_cb_called = 0;
  924. assert(pr_poll_loop_exec(poll_loop) == 0);
  925. assert(timeout_cb_called == 1);
  926. assert(pre_poll_cb1_called == 1);
  927. assert(pre_poll_cb2_called == 0);
  928. assert(pre_poll_cb_return_called == 0);
  929. /*
  930. * Test again
  931. */
  932. timeout_timer = timer_list_add(
  933. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  934. assert(timeout_timer != NULL);
  935. timeout_cb_called = 0;
  936. assert(pr_poll_loop_exec(poll_loop) == 0);
  937. assert(timeout_cb_called == 1);
  938. assert(pre_poll_cb1_called == 2);
  939. assert(pre_poll_cb2_called == 0);
  940. assert(pre_poll_cb_return_called == 0);
  941. /*
  942. * Add second cb
  943. */
  944. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb2,
  945. &pre_poll_cb2_called, test_pre_poll_cb2) == 0);
  946. timeout_timer = timer_list_add(
  947. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  948. assert(timeout_timer != NULL);
  949. timeout_cb_called = 0;
  950. assert(pr_poll_loop_exec(poll_loop) == 0);
  951. assert(timeout_cb_called == 1);
  952. assert(pre_poll_cb1_called == 3);
  953. assert(pre_poll_cb2_called == 1);
  954. assert(pre_poll_cb_return_called == 0);
  955. /*
  956. * Remove cb1
  957. */
  958. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  959. timeout_timer = timer_list_add(
  960. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  961. assert(timeout_timer != NULL);
  962. timeout_cb_called = 0;
  963. assert(pr_poll_loop_exec(poll_loop) == 0);
  964. assert(timeout_cb_called == 1);
  965. assert(pre_poll_cb1_called == 3);
  966. assert(pre_poll_cb2_called == 2);
  967. assert(pre_poll_cb_return_called == 0);
  968. /*
  969. * Add cb1 and cb return
  970. */
  971. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  972. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  973. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb_return,
  974. &pre_poll_cb_return_called, test_pre_poll_cb_return) == 0);
  975. timeout_timer = timer_list_add(
  976. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  977. assert(timeout_timer != NULL);
  978. timeout_cb_called = 0;
  979. assert(pr_poll_loop_exec(poll_loop) == -1);
  980. assert(timeout_cb_called == 0);
  981. assert(pre_poll_cb1_called == 4);
  982. assert(pre_poll_cb2_called == 3);
  983. assert(pre_poll_cb_return_called == 1);
  984. timer_list_entry_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  985. /*
  986. * Remove cb_return
  987. */
  988. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb_return) == 0);
  989. timeout_timer = timer_list_add(
  990. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL);
  991. assert(timeout_timer != NULL);
  992. timeout_cb_called = 0;
  993. assert(pr_poll_loop_exec(poll_loop) == 0);
  994. assert(timeout_cb_called == 1);
  995. assert(pre_poll_cb1_called == 5);
  996. assert(pre_poll_cb2_called == 4);
  997. assert(pre_poll_cb_return_called == 1);
  998. /*
  999. * Cleanup
  1000. */
  1001. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  1002. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == 0);
  1003. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb_return) == -1);
  1004. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == -1);
  1005. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == -1);
  1006. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb_return) == -1);
  1007. }
  1008. int
  1009. main(void)
  1010. {
  1011. struct pr_poll_loop poll_loop;
  1012. PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
  1013. pr_poll_loop_init(&poll_loop);
  1014. test_fd_basics(&poll_loop);
  1015. test_prfd_basics(&poll_loop);
  1016. test_pre_poll_cb(&poll_loop);
  1017. test_complex(&poll_loop);
  1018. pr_poll_loop_destroy(&poll_loop);
  1019. assert(PR_Cleanup() == PR_SUCCESS);
  1020. return (0);
  1021. }