lock.pass.cpp 9.4 KB

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