try_lock.pass.cpp 9.7 KB

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