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