try_lock.pass.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // UNSUPPORTED: libcpp-has-no-threads
  10. // <mutex>
  11. // template <class L1, class L2, class... L3>
  12. // int try_lock(L1&, L2&, L3&...);
  13. #include <mutex>
  14. #include <cassert>
  15. #include "test_macros.h"
  16. class L0
  17. {
  18. bool locked_;
  19. public:
  20. L0() : locked_(false) {}
  21. bool try_lock()
  22. {
  23. locked_ = true;
  24. return locked_;
  25. }
  26. void unlock() {locked_ = false;}
  27. bool locked() const {return locked_;}
  28. };
  29. class L1
  30. {
  31. bool locked_;
  32. public:
  33. L1() : locked_(false) {}
  34. bool try_lock()
  35. {
  36. locked_ = false;
  37. return locked_;
  38. }
  39. void unlock() {locked_ = false;}
  40. bool locked() const {return locked_;}
  41. };
  42. class L2
  43. {
  44. bool locked_;
  45. public:
  46. L2() : locked_(false) {}
  47. bool try_lock()
  48. {
  49. TEST_THROW(1);
  50. return locked_;
  51. }
  52. void unlock() {locked_ = false;}
  53. bool locked() const {return locked_;}
  54. };
  55. int main(int, char**)
  56. {
  57. {
  58. L0 l0;
  59. L0 l1;
  60. assert(std::try_lock(l0, l1) == -1);
  61. assert(l0.locked());
  62. assert(l1.locked());
  63. }
  64. {
  65. L0 l0;
  66. L1 l1;
  67. assert(std::try_lock(l0, l1) == 1);
  68. assert(!l0.locked());
  69. assert(!l1.locked());
  70. }
  71. {
  72. L1 l0;
  73. L0 l1;
  74. assert(std::try_lock(l0, l1) == 0);
  75. assert(!l0.locked());
  76. assert(!l1.locked());
  77. }
  78. #ifndef TEST_HAS_NO_EXCEPTIONS
  79. {
  80. L0 l0;
  81. L2 l1;
  82. try
  83. {
  84. (void)std::try_lock(l0, l1);
  85. assert(false);
  86. }
  87. catch (int)
  88. {
  89. assert(!l0.locked());
  90. assert(!l1.locked());
  91. }
  92. }
  93. {
  94. L2 l0;
  95. L0 l1;
  96. try
  97. {
  98. (void)std::try_lock(l0, l1);
  99. assert(false);
  100. }
  101. catch (int)
  102. {
  103. assert(!l0.locked());
  104. assert(!l1.locked());
  105. }
  106. }
  107. #endif
  108. #if TEST_STD_VER >= 11
  109. {
  110. L0 l0;
  111. L0 l1;
  112. L0 l2;
  113. assert(std::try_lock(l0, l1, l2) == -1);
  114. assert(l0.locked());
  115. assert(l1.locked());
  116. assert(l2.locked());
  117. }
  118. {
  119. L1 l0;
  120. L1 l1;
  121. L1 l2;
  122. assert(std::try_lock(l0, l1, l2) == 0);
  123. assert(!l0.locked());
  124. assert(!l1.locked());
  125. assert(!l2.locked());
  126. }
  127. #ifndef TEST_HAS_NO_EXCEPTIONS
  128. {
  129. L2 l0;
  130. L2 l1;
  131. L2 l2;
  132. try
  133. {
  134. (void)std::try_lock(l0, l1, l2);
  135. assert(false);
  136. }
  137. catch (int)
  138. {
  139. assert(!l0.locked());
  140. assert(!l1.locked());
  141. assert(!l2.locked());
  142. }
  143. }
  144. {
  145. L0 l0;
  146. L1 l1;
  147. L2 l2;
  148. assert(std::try_lock(l0, l1, l2) == 1);
  149. assert(!l0.locked());
  150. assert(!l1.locked());
  151. assert(!l2.locked());
  152. }
  153. #endif
  154. {
  155. L0 l0;
  156. L0 l1;
  157. L1 l2;
  158. assert(std::try_lock(l0, l1, l2) == 2);
  159. assert(!l0.locked());
  160. assert(!l1.locked());
  161. assert(!l2.locked());
  162. }
  163. {
  164. L0 l0;
  165. L1 l1;
  166. L0 l2;
  167. assert(std::try_lock(l0, l1, l2) == 1);
  168. assert(!l0.locked());
  169. assert(!l1.locked());
  170. assert(!l2.locked());
  171. }
  172. {
  173. L1 l0;
  174. L0 l1;
  175. L0 l2;
  176. assert(std::try_lock(l0, l1, l2) == 0);
  177. assert(!l0.locked());
  178. assert(!l1.locked());
  179. assert(!l2.locked());
  180. }
  181. #ifndef TEST_HAS_NO_EXCEPTIONS
  182. {
  183. L0 l0;
  184. L0 l1;
  185. L2 l2;
  186. try
  187. {
  188. (void)std::try_lock(l0, l1, l2);
  189. assert(false);
  190. }
  191. catch (int)
  192. {
  193. assert(!l0.locked());
  194. assert(!l1.locked());
  195. assert(!l2.locked());
  196. }
  197. }
  198. {
  199. L0 l0;
  200. L2 l1;
  201. L0 l2;
  202. try
  203. {
  204. (void)std::try_lock(l0, l1, l2);
  205. assert(false);
  206. }
  207. catch (int)
  208. {
  209. assert(!l0.locked());
  210. assert(!l1.locked());
  211. assert(!l2.locked());
  212. }
  213. }
  214. {
  215. L2 l0;
  216. L0 l1;
  217. L0 l2;
  218. try
  219. {
  220. (void)std::try_lock(l0, l1, l2);
  221. assert(false);
  222. }
  223. catch (int)
  224. {
  225. assert(!l0.locked());
  226. assert(!l1.locked());
  227. assert(!l2.locked());
  228. }
  229. }
  230. #endif
  231. {
  232. L1 l0;
  233. L1 l1;
  234. L0 l2;
  235. assert(std::try_lock(l0, l1, l2) == 0);
  236. assert(!l0.locked());
  237. assert(!l1.locked());
  238. assert(!l2.locked());
  239. }
  240. {
  241. L1 l0;
  242. L0 l1;
  243. L1 l2;
  244. assert(std::try_lock(l0, l1, l2) == 0);
  245. assert(!l0.locked());
  246. assert(!l1.locked());
  247. assert(!l2.locked());
  248. }
  249. {
  250. L0 l0;
  251. L1 l1;
  252. L1 l2;
  253. assert(std::try_lock(l0, l1, l2) == 1);
  254. assert(!l0.locked());
  255. assert(!l1.locked());
  256. assert(!l2.locked());
  257. }
  258. #ifndef TEST_HAS_NO_EXCEPTIONS
  259. {
  260. L1 l0;
  261. L1 l1;
  262. L2 l2;
  263. assert(std::try_lock(l0, l1, l2) == 0);
  264. assert(!l0.locked());
  265. assert(!l1.locked());
  266. assert(!l2.locked());
  267. }
  268. {
  269. L1 l0;
  270. L2 l1;
  271. L1 l2;
  272. assert(std::try_lock(l0, l1, l2) == 0);
  273. assert(!l0.locked());
  274. assert(!l1.locked());
  275. assert(!l2.locked());
  276. }
  277. {
  278. L2 l0;
  279. L1 l1;
  280. L1 l2;
  281. try
  282. {
  283. (void)std::try_lock(l0, l1, l2);
  284. assert(false);
  285. }
  286. catch (int)
  287. {
  288. assert(!l0.locked());
  289. assert(!l1.locked());
  290. assert(!l2.locked());
  291. }
  292. }
  293. {
  294. L2 l0;
  295. L2 l1;
  296. L0 l2;
  297. try
  298. {
  299. (void)std::try_lock(l0, l1, l2);
  300. assert(false);
  301. }
  302. catch (int)
  303. {
  304. assert(!l0.locked());
  305. assert(!l1.locked());
  306. assert(!l2.locked());
  307. }
  308. }
  309. {
  310. L2 l0;
  311. L0 l1;
  312. L2 l2;
  313. try
  314. {
  315. (void)std::try_lock(l0, l1, l2);
  316. assert(false);
  317. }
  318. catch (int)
  319. {
  320. assert(!l0.locked());
  321. assert(!l1.locked());
  322. assert(!l2.locked());
  323. }
  324. }
  325. {
  326. L0 l0;
  327. L2 l1;
  328. L2 l2;
  329. try
  330. {
  331. (void)std::try_lock(l0, l1, l2);
  332. assert(false);
  333. }
  334. catch (int)
  335. {
  336. assert(!l0.locked());
  337. assert(!l1.locked());
  338. assert(!l2.locked());
  339. }
  340. }
  341. {
  342. L2 l0;
  343. L2 l1;
  344. L1 l2;
  345. try
  346. {
  347. (void)std::try_lock(l0, l1, l2);
  348. assert(false);
  349. }
  350. catch (int)
  351. {
  352. assert(!l0.locked());
  353. assert(!l1.locked());
  354. assert(!l2.locked());
  355. }
  356. }
  357. {
  358. L2 l0;
  359. L1 l1;
  360. L2 l2;
  361. try
  362. {
  363. (void)std::try_lock(l0, l1, l2);
  364. assert(false);
  365. }
  366. catch (int)
  367. {
  368. assert(!l0.locked());
  369. assert(!l1.locked());
  370. assert(!l2.locked());
  371. }
  372. }
  373. {
  374. L1 l0;
  375. L2 l1;
  376. L2 l2;
  377. assert(std::try_lock(l0, l1, l2) == 0);
  378. assert(!l0.locked());
  379. assert(!l1.locked());
  380. assert(!l2.locked());
  381. }
  382. {
  383. L0 l0;
  384. L2 l1;
  385. L1 l2;
  386. try
  387. {
  388. (void)std::try_lock(l0, l1, l2);
  389. assert(false);
  390. }
  391. catch (int)
  392. {
  393. assert(!l0.locked());
  394. assert(!l1.locked());
  395. assert(!l2.locked());
  396. }
  397. }
  398. {
  399. L1 l0;
  400. L0 l1;
  401. L2 l2;
  402. assert(std::try_lock(l0, l1, l2) == 0);
  403. assert(!l0.locked());
  404. assert(!l1.locked());
  405. assert(!l2.locked());
  406. }
  407. {
  408. L1 l0;
  409. L2 l1;
  410. L0 l2;
  411. assert(std::try_lock(l0, l1, l2) == 0);
  412. assert(!l0.locked());
  413. assert(!l1.locked());
  414. assert(!l2.locked());
  415. }
  416. {
  417. L2 l0;
  418. L0 l1;
  419. L1 l2;
  420. try
  421. {
  422. (void)std::try_lock(l0, l1, l2);
  423. assert(false);
  424. }
  425. catch (int)
  426. {
  427. assert(!l0.locked());
  428. assert(!l1.locked());
  429. assert(!l2.locked());
  430. }
  431. }
  432. {
  433. L2 l0;
  434. L1 l1;
  435. L0 l2;
  436. try
  437. {
  438. (void)std::try_lock(l0, l1, l2);
  439. assert(false);
  440. }
  441. catch (int)
  442. {
  443. assert(!l0.locked());
  444. assert(!l1.locked());
  445. assert(!l2.locked());
  446. }
  447. }
  448. #endif // TEST_HAS_NO_EXCEPTIONS
  449. {
  450. L0 l0;
  451. L0 l1;
  452. L0 l2;
  453. L0 l3;
  454. assert(std::try_lock(l0, l1, l2, l3) == -1);
  455. assert(l0.locked());
  456. assert(l1.locked());
  457. assert(l2.locked());
  458. assert(l3.locked());
  459. }
  460. {
  461. L1 l0;
  462. L0 l1;
  463. L0 l2;
  464. L0 l3;
  465. assert(std::try_lock(l0, l1, l2, l3) == 0);
  466. assert(!l0.locked());
  467. assert(!l1.locked());
  468. assert(!l2.locked());
  469. assert(!l3.locked());
  470. }
  471. {
  472. L0 l0;
  473. L1 l1;
  474. L0 l2;
  475. L0 l3;
  476. assert(std::try_lock(l0, l1, l2, l3) == 1);
  477. assert(!l0.locked());
  478. assert(!l1.locked());
  479. assert(!l2.locked());
  480. assert(!l3.locked());
  481. }
  482. {
  483. L0 l0;
  484. L0 l1;
  485. L1 l2;
  486. L0 l3;
  487. assert(std::try_lock(l0, l1, l2, l3) == 2);
  488. assert(!l0.locked());
  489. assert(!l1.locked());
  490. assert(!l2.locked());
  491. assert(!l3.locked());
  492. }
  493. {
  494. L0 l0;
  495. L0 l1;
  496. L0 l2;
  497. L1 l3;
  498. assert(std::try_lock(l0, l1, l2, l3) == 3);
  499. assert(!l0.locked());
  500. assert(!l1.locked());
  501. assert(!l2.locked());
  502. assert(!l3.locked());
  503. }
  504. #endif // TEST_STD_VER >= 11
  505. return 0;
  506. }