lock.pass.cpp 8.9 KB

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