brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.1 KiB · ac508b5 Raw
528 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// UNSUPPORTED: no-threads10 11// <mutex>12 13// template <class L1, class L2, class... L3>14//   int try_lock(L1&, L2&, L3&...);15 16#include <mutex>17#include <cassert>18 19#include "test_macros.h"20 21class L022{23    bool locked_;24 25public: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 39class L140{41    bool locked_;42 43public: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 57class L258{59    bool locked_;60 61public:62    L2() : locked_(false) {}63 64    bool try_lock()65    {66        TEST_THROW(1);67        return locked_;68    }69 70    void unlock() {locked_ = false;}71 72    bool locked() const {return locked_;}73};74 75int main(int, char**)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#ifndef TEST_HAS_NO_EXCEPTIONS99    {100        L0 l0;101        L2 l1;102        try103        {104            (void)std::try_lock(l0, l1);105            assert(false);106        }107        catch (int)108        {109            assert(!l0.locked());110            assert(!l1.locked());111        }112    }113    {114        L2 l0;115        L0 l1;116        try117        {118            (void)std::try_lock(l0, l1);119            assert(false);120        }121        catch (int)122        {123            assert(!l0.locked());124            assert(!l1.locked());125        }126    }127#endif128#if TEST_STD_VER >= 11129    {130        L0 l0;131        L0 l1;132        L0 l2;133        assert(std::try_lock(l0, l1, l2) == -1);134        assert(l0.locked());135        assert(l1.locked());136        assert(l2.locked());137    }138    {139        L1 l0;140        L1 l1;141        L1 l2;142        assert(std::try_lock(l0, l1, l2) == 0);143        assert(!l0.locked());144        assert(!l1.locked());145        assert(!l2.locked());146    }147#ifndef TEST_HAS_NO_EXCEPTIONS148    {149        L2 l0;150        L2 l1;151        L2 l2;152        try153        {154            (void)std::try_lock(l0, l1, l2);155            assert(false);156        }157        catch (int)158        {159            assert(!l0.locked());160            assert(!l1.locked());161            assert(!l2.locked());162        }163    }164    {165        L0 l0;166        L1 l1;167        L2 l2;168        assert(std::try_lock(l0, l1, l2) == 1);169        assert(!l0.locked());170        assert(!l1.locked());171        assert(!l2.locked());172    }173#endif174    {175        L0 l0;176        L0 l1;177        L1 l2;178        assert(std::try_lock(l0, l1, l2) == 2);179        assert(!l0.locked());180        assert(!l1.locked());181        assert(!l2.locked());182    }183    {184        L0 l0;185        L1 l1;186        L0 l2;187        assert(std::try_lock(l0, l1, l2) == 1);188        assert(!l0.locked());189        assert(!l1.locked());190        assert(!l2.locked());191    }192    {193        L1 l0;194        L0 l1;195        L0 l2;196        assert(std::try_lock(l0, l1, l2) == 0);197        assert(!l0.locked());198        assert(!l1.locked());199        assert(!l2.locked());200    }201#ifndef TEST_HAS_NO_EXCEPTIONS202    {203        L0 l0;204        L0 l1;205        L2 l2;206        try207        {208            (void)std::try_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    {219        L0 l0;220        L2 l1;221        L0 l2;222        try223        {224            (void)std::try_lock(l0, l1, l2);225            assert(false);226        }227        catch (int)228        {229            assert(!l0.locked());230            assert(!l1.locked());231            assert(!l2.locked());232        }233    }234    {235        L2 l0;236        L0 l1;237        L0 l2;238        try239        {240            (void)std::try_lock(l0, l1, l2);241            assert(false);242        }243        catch (int)244        {245            assert(!l0.locked());246            assert(!l1.locked());247            assert(!l2.locked());248        }249    }250#endif251    {252        L1 l0;253        L1 l1;254        L0 l2;255        assert(std::try_lock(l0, l1, l2) == 0);256        assert(!l0.locked());257        assert(!l1.locked());258        assert(!l2.locked());259    }260    {261        L1 l0;262        L0 l1;263        L1 l2;264        assert(std::try_lock(l0, l1, l2) == 0);265        assert(!l0.locked());266        assert(!l1.locked());267        assert(!l2.locked());268    }269    {270        L0 l0;271        L1 l1;272        L1 l2;273        assert(std::try_lock(l0, l1, l2) == 1);274        assert(!l0.locked());275        assert(!l1.locked());276        assert(!l2.locked());277    }278#ifndef TEST_HAS_NO_EXCEPTIONS279    {280        L1 l0;281        L1 l1;282        L2 l2;283        assert(std::try_lock(l0, l1, l2) == 0);284        assert(!l0.locked());285        assert(!l1.locked());286        assert(!l2.locked());287    }288    {289        L1 l0;290        L2 l1;291        L1 l2;292        assert(std::try_lock(l0, l1, l2) == 0);293        assert(!l0.locked());294        assert(!l1.locked());295        assert(!l2.locked());296    }297    {298        L2 l0;299        L1 l1;300        L1 l2;301        try302        {303            (void)std::try_lock(l0, l1, l2);304            assert(false);305        }306        catch (int)307        {308            assert(!l0.locked());309            assert(!l1.locked());310            assert(!l2.locked());311        }312    }313    {314        L2 l0;315        L2 l1;316        L0 l2;317        try318        {319            (void)std::try_lock(l0, l1, l2);320            assert(false);321        }322        catch (int)323        {324            assert(!l0.locked());325            assert(!l1.locked());326            assert(!l2.locked());327        }328    }329    {330        L2 l0;331        L0 l1;332        L2 l2;333        try334        {335            (void)std::try_lock(l0, l1, l2);336            assert(false);337        }338        catch (int)339        {340            assert(!l0.locked());341            assert(!l1.locked());342            assert(!l2.locked());343        }344    }345    {346        L0 l0;347        L2 l1;348        L2 l2;349        try350        {351            (void)std::try_lock(l0, l1, l2);352            assert(false);353        }354        catch (int)355        {356            assert(!l0.locked());357            assert(!l1.locked());358            assert(!l2.locked());359        }360    }361    {362        L2 l0;363        L2 l1;364        L1 l2;365        try366        {367            (void)std::try_lock(l0, l1, l2);368            assert(false);369        }370        catch (int)371        {372            assert(!l0.locked());373            assert(!l1.locked());374            assert(!l2.locked());375        }376    }377    {378        L2 l0;379        L1 l1;380        L2 l2;381        try382        {383            (void)std::try_lock(l0, l1, l2);384            assert(false);385        }386        catch (int)387        {388            assert(!l0.locked());389            assert(!l1.locked());390            assert(!l2.locked());391        }392    }393    {394        L1 l0;395        L2 l1;396        L2 l2;397        assert(std::try_lock(l0, l1, l2) == 0);398        assert(!l0.locked());399        assert(!l1.locked());400        assert(!l2.locked());401    }402    {403        L0 l0;404        L2 l1;405        L1 l2;406        try407        {408            (void)std::try_lock(l0, l1, l2);409            assert(false);410        }411        catch (int)412        {413            assert(!l0.locked());414            assert(!l1.locked());415            assert(!l2.locked());416        }417    }418    {419        L1 l0;420        L0 l1;421        L2 l2;422        assert(std::try_lock(l0, l1, l2) == 0);423        assert(!l0.locked());424        assert(!l1.locked());425        assert(!l2.locked());426    }427    {428        L1 l0;429        L2 l1;430        L0 l2;431        assert(std::try_lock(l0, l1, l2) == 0);432        assert(!l0.locked());433        assert(!l1.locked());434        assert(!l2.locked());435    }436    {437        L2 l0;438        L0 l1;439        L1 l2;440        try441        {442            (void)std::try_lock(l0, l1, l2);443            assert(false);444        }445        catch (int)446        {447            assert(!l0.locked());448            assert(!l1.locked());449            assert(!l2.locked());450        }451    }452    {453        L2 l0;454        L1 l1;455        L0 l2;456        try457        {458            (void)std::try_lock(l0, l1, l2);459            assert(false);460        }461        catch (int)462        {463            assert(!l0.locked());464            assert(!l1.locked());465            assert(!l2.locked());466        }467    }468#endif // TEST_HAS_NO_EXCEPTIONS469    {470        L0 l0;471        L0 l1;472        L0 l2;473        L0 l3;474        assert(std::try_lock(l0, l1, l2, l3) == -1);475        assert(l0.locked());476        assert(l1.locked());477        assert(l2.locked());478        assert(l3.locked());479    }480    {481        L1 l0;482        L0 l1;483        L0 l2;484        L0 l3;485        assert(std::try_lock(l0, l1, l2, l3) == 0);486        assert(!l0.locked());487        assert(!l1.locked());488        assert(!l2.locked());489        assert(!l3.locked());490    }491    {492        L0 l0;493        L1 l1;494        L0 l2;495        L0 l3;496        assert(std::try_lock(l0, l1, l2, l3) == 1);497        assert(!l0.locked());498        assert(!l1.locked());499        assert(!l2.locked());500        assert(!l3.locked());501    }502    {503        L0 l0;504        L0 l1;505        L1 l2;506        L0 l3;507        assert(std::try_lock(l0, l1, l2, l3) == 2);508        assert(!l0.locked());509        assert(!l1.locked());510        assert(!l2.locked());511        assert(!l3.locked());512    }513    {514        L0 l0;515        L0 l1;516        L0 l2;517        L1 l3;518        assert(std::try_lock(l0, l1, l2, l3) == 3);519        assert(!l0.locked());520        assert(!l1.locked());521        assert(!l2.locked());522        assert(!l3.locked());523    }524#endif // TEST_STD_VER >= 11525 526  return 0;527}528