OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libstdc++-v3/] [testsuite/] [30_threads/] [lock/] [4.cc] - Blame information for rev 742

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 742 jeremybenn
// { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* alpha*-*-osf* mips-sgi-irix6* powerpc-ibm-aix* } }
2
// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* alpha*-*-osf* mips-sgi-irix6* powerpc-ibm-aix* } }
3
// { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } }
4
// { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } }
5
// { dg-require-cstdint "" }
6
// { dg-require-gthreads "" }
7
 
8
// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
9
//
10
// This file is part of the GNU ISO C++ Library.  This library is free
11
// software; you can redistribute it and/or modify it under the
12
// terms of the GNU General Public License as published by the
13
// Free Software Foundation; either version 3, or (at your option)
14
// any later version.
15
 
16
// This library is distributed in the hope that it will be useful,
17
// but WITHOUT ANY WARRANTY; without even the implied warranty of
18
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
// GNU General Public License for more details.
20
 
21
// You should have received a copy of the GNU General Public License along
22
// with this library; see the file COPYING3.  If not see
23
// <http://www.gnu.org/licenses/>.
24
 
25
 
26
#include <mutex>
27
#include <testsuite_hooks.h>
28
 
29
struct unreliable_lock
30
{
31
  std::mutex m;
32
  std::unique_lock<std::mutex> l;
33
 
34
  static int count;
35
  static int throw_on;
36
  static int lock_on;
37
 
38
  unreliable_lock() : l(m, std::defer_lock) { }
39
 
40
  ~unreliable_lock()
41
  {
42
    bool test __attribute__((unused)) = true;
43
    VERIFY( !l.owns_lock() );
44
  }
45
 
46
  void lock()
47
  {
48
    if (count == throw_on)
49
      throw throw_on;
50
    ++count;
51
    l.lock();
52
  }
53
  bool try_lock()
54
  {
55
    if (count == throw_on)
56
      throw throw_on;
57
    std::unique_lock<std::mutex> l2(m, std::defer_lock);
58
    if (count == lock_on)
59
      l2.lock();
60
    ++count;
61
    return l.try_lock();
62
  }
63
 
64
  void unlock()
65
  {
66
    bool test __attribute__((unused)) = true;
67
    VERIFY( l.owns_lock() );
68
    l.unlock();
69
  }
70
 
71
};
72
 
73
int unreliable_lock::count = 0;
74
int unreliable_lock::throw_on = -1;
75
int unreliable_lock::lock_on = -1;
76
 
77
void test01()
78
{
79
  bool test __attribute__((unused)) = true;
80
 
81
  unreliable_lock l1, l2, l3;
82
 
83
  try
84
    {
85
      unreliable_lock::count = 0;
86
      std::lock(l1, l2, l3);
87
      VERIFY( unreliable_lock::count == 3 );
88
      l1.unlock();
89
      l2.unlock();
90
      l3.unlock();
91
    }
92
  catch (...)
93
    {
94
      VERIFY( false );
95
    }
96
}
97
 
98
void test02()
99
{
100
  bool test __attribute__((unused)) = true;
101
 
102
  // test behaviour when a lock is already held
103
  try
104
    {
105
      unreliable_lock::lock_on = 1;
106
      while (unreliable_lock::lock_on < 3)
107
      {
108
        unreliable_lock::count = 0;
109
        unreliable_lock l1, l2, l3;
110
        std::lock(l1, l2, l3);
111
        VERIFY( unreliable_lock::count > 3 );
112
        l1.unlock();
113
        l2.unlock();
114
        l3.unlock();
115
        ++unreliable_lock::lock_on;
116
      }
117
    }
118
  catch (...)
119
    {
120
      VERIFY( false );
121
    }
122
}
123
 
124
void test03()
125
{
126
  // test behaviour when an exception is thrown
127
  unreliable_lock::throw_on = 0;
128
  while (unreliable_lock::throw_on < 3)
129
  {
130
    unreliable_lock::count = 0;
131
    unreliable_lock l1, l2, l3;
132
    bool test = false;
133
    try
134
      {
135
        std::lock(l1, l2, l3);
136
      }
137
    catch (...)
138
      {
139
        test = true;
140
      }
141
    VERIFY( test );
142
    ++unreliable_lock::throw_on;
143
  }
144
}
145
 
146
int main()
147
{
148
  test01();
149
  test02();
150
  test03();
151
  return 0;
152
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.