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