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

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [libstdc++-v3/] [testsuite/] [testsuite_hooks.cc] - Blame information for rev 19

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 19 jlechner
// -*- C++ -*-
2
 
3
// Utility subroutines for the C++ library testsuite. 
4
//
5
// Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6
//
7
// This file is part of the GNU ISO C++ Library.  This library is free
8
// software; you can redistribute it and/or modify it under the
9
// terms of the GNU General Public License as published by the
10
// Free Software Foundation; either version 2, or (at your option)
11
// any later version.
12
//
13
// This library is distributed in the hope that it will be useful,
14
// but WITHOUT ANY WARRANTY; without even the implied warranty of
15
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
// GNU General Public License for more details.
17
//
18
// You should have received a copy of the GNU General Public License along
19
// with this library; see the file COPYING.  If not, write to the Free
20
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
21
// USA.
22
//
23
// As a special exception, you may use this file as part of a free software
24
// library without restriction.  Specifically, if other files instantiate
25
// templates or use macros or inline functions from this file, or you compile
26
// this file and link it with other files to produce an executable, this
27
// file does not by itself cause the resulting executable to be covered by
28
// the GNU General Public License.  This exception does not however
29
// invalidate any other reasons why the executable file might be covered by
30
// the GNU General Public License.
31
 
32
#include <testsuite_hooks.h>
33
 
34
#ifdef _GLIBCXX_RES_LIMITS
35
#include <unistd.h>
36
#include <sys/time.h>
37
#include <sys/resource.h>
38
#endif
39
#include <list>
40
#include <string>
41
#include <stdexcept>
42
#include <clocale>
43
#include <locale>
44
#include <cxxabi.h>
45
 
46
// If we have <sys/types.h>, <sys/ipc.h>, and <sys/sem.h>, then assume
47
// that System V semaphores are available.
48
#if defined(_GLIBCXX_HAVE_SYS_TYPES_H)          \
49
    && defined(_GLIBCXX_HAVE_SYS_IPC_H)         \
50
    && defined(_GLIBCXX_HAVE_SYS_SEM_H)
51
#define _GLIBCXX_SYSV_SEM
52
#endif
53
 
54
#ifdef _GLIBCXX_SYSV_SEM
55
#include <sys/types.h>
56
#include <sys/ipc.h>
57
#include <sys/sem.h>
58
#endif
59
 
60
namespace __gnu_test
61
{
62
#ifdef _GLIBCXX_RES_LIMITS
63
  void
64
  set_memory_limits(float size)
65
  {
66
    struct rlimit r;
67
    // Cater to the absence of rlim_t.
68
    __typeof__ (r.rlim_cur) limit = (__typeof__ (r.rlim_cur))(size * 1048576);
69
 
70
    // Heap size, seems to be common.
71
#if _GLIBCXX_HAVE_LIMIT_DATA
72
    getrlimit(RLIMIT_DATA, &r);
73
    r.rlim_cur = limit;
74
    setrlimit(RLIMIT_DATA, &r);
75
#endif
76
 
77
    // Resident set size.
78
#if _GLIBCXX_HAVE_LIMIT_RSS
79
    getrlimit(RLIMIT_RSS, &r);
80
    r.rlim_cur = limit;
81
    setrlimit(RLIMIT_RSS, &r);
82
#endif
83
 
84
    // Mapped memory (brk + mmap).
85
#if _GLIBCXX_HAVE_LIMIT_VMEM
86
    getrlimit(RLIMIT_VMEM, &r);
87
    r.rlim_cur = limit;
88
    setrlimit(RLIMIT_VMEM, &r);
89
#endif
90
 
91
    // Virtual memory.
92
    // On HP-UX 11.23, a trivial C++ program that sets RLIMIT_AS to
93
    // anything less than 128MB cannot "malloc" even 1K of memory.
94
    // Therefore, we skip RLIMIT_AS on HP-UX.
95
#if _GLIBCXX_HAVE_LIMIT_AS && !defined(__hpux__)
96
    getrlimit(RLIMIT_AS, &r);
97
    r.rlim_cur = limit;
98
    setrlimit(RLIMIT_AS, &r);
99
#endif
100
  }
101
 
102
#else
103
  void
104
  set_memory_limits(float) { }
105
#endif 
106
 
107
#ifdef _GLIBCXX_RES_LIMITS
108
  void
109
  set_file_limit(unsigned long size)
110
  {
111
#if _GLIBCXX_HAVE_LIMIT_FSIZE
112
    struct rlimit r;
113
    // Cater to the absence of rlim_t.
114
    __typeof__ (r.rlim_cur) limit = (__typeof__ (r.rlim_cur))(size);
115
 
116
    getrlimit(RLIMIT_FSIZE, &r);
117
    r.rlim_cur = limit;
118
    setrlimit(RLIMIT_FSIZE, &r);
119
#endif
120
  }
121
 
122
#else
123
  void
124
  set_file_limit(unsigned long) { }
125
#endif 
126
 
127
  void
128
  verify_demangle(const char* mangled, const char* wanted)
129
  {
130
    int status = 0;
131
    const char* s = abi::__cxa_demangle(mangled, 0, 0, &status);
132
    if (!s)
133
      {
134
        switch (status)
135
          {
136
          case 0:
137
            s = "error code = 0: success";
138
            break;
139
          case -1:
140
            s = "error code = -1: memory allocation failure";
141
            break;
142
          case -2:
143
            s = "error code = -2: invalid mangled name";
144
            break;
145
          case -3:
146
            s = "error code = -3: invalid arguments";
147
            break;
148
          default:
149
            s = "error code unknown - who knows what happened";
150
          }
151
      }
152
 
153
    std::string w(wanted);
154
    if (w != s)
155
      std::__throw_runtime_error(s);
156
  }
157
 
158
  void
159
  run_tests_wrapped_locale(const char* name, const func_callback& l)
160
  {
161
    using namespace std;
162
    bool test = true;
163
 
164
    // Set the global locale. 
165
    locale loc_name = locale(name);
166
    locale orig = locale::global(loc_name);
167
 
168
    const char* res = setlocale(LC_ALL, name);
169
    if (res != NULL)
170
      {
171
        string preLC_ALL = res;
172
        const func_callback::test_type* tests = l.tests();
173
        for (int i = 0; i < l.size(); ++i)
174
          (*tests[i])();
175
        string postLC_ALL= setlocale(LC_ALL, NULL);
176
        VERIFY( preLC_ALL == postLC_ALL );
177
      }
178
    else
179
      {
180
        string s("LC_ALL for ");
181
        s += name;
182
        __throw_runtime_error(s.c_str());
183
      }
184
  }
185
 
186
  void
187
  run_tests_wrapped_env(const char* name, const char* env,
188
                        const func_callback& l)
189
  {
190
    using namespace std;
191
    bool test = true;
192
 
193
#ifdef _GLIBCXX_HAVE_SETENV 
194
    // Set the global locale. 
195
    locale loc_name = locale(name);
196
    locale orig = locale::global(loc_name);
197
 
198
    // Set environment variable env to value in name. 
199
    const char* oldENV = getenv(env);
200
    if (!setenv(env, name, 1))
201
      {
202
        const func_callback::test_type* tests = l.tests();
203
        for (int i = 0; i < l.size(); ++i)
204
          (*tests[i])();
205
        setenv(env, oldENV ? oldENV : "", 1);
206
      }
207
    else
208
      {
209
        string s(env);
210
        s += string(" to ");
211
        s += string(name);
212
        __throw_runtime_error(s.c_str());
213
      }
214
#endif
215
  }
216
 
217
  counter::size_type  counter::count = 0;
218
  unsigned int copy_constructor::count_ = 0;
219
  unsigned int copy_constructor::throw_on_ = 0;
220
  unsigned int assignment_operator::count_ = 0;
221
  unsigned int assignment_operator::throw_on_ = 0;
222
  unsigned int destructor::_M_count = 0;
223
  int copy_tracker::next_id_ = 0;
224
 
225
#ifdef _GLIBCXX_SYSV_SEM
226
  // This union is not declared in system headers.  Instead, it must
227
  // be defined by user programs.
228
  union semun
229
  {
230
    int val;
231
    struct semid_ds *buf;
232
    unsigned short *array;
233
  };
234
#endif
235
 
236
  semaphore::semaphore()
237
  {
238
#ifdef _GLIBCXX_SYSV_SEM
239
    // Remeber the PID for the process that created the semaphore set
240
    // so that only one process will destroy the set.
241
    pid_ = getpid();
242
 
243
    // GLIBC does not define SEM_R and SEM_A.
244
#ifndef SEM_R
245
#define SEM_R 0400
246
#endif
247
 
248
#ifndef SEM_A
249
#define SEM_A 0200
250
#endif
251
 
252
    // Get a semaphore set with one semaphore.
253
    sem_set_ = semget(IPC_PRIVATE, 1, SEM_R | SEM_A);
254
    if (sem_set_ == -1)
255
      std::__throw_runtime_error("could not obtain semaphore set");
256
 
257
    // Initialize the semaphore.
258
    union semun val;
259
    val.val = 0;
260
    if (semctl(sem_set_, 0, SETVAL, val) == -1)
261
      std::__throw_runtime_error("could not initialize semaphore");
262
#else
263
    // There are no semaphores on this system.  We have no way to mark
264
    // a test as "unsupported" at runtime, so we just exit, pretending
265
    // that the test passed.
266
    exit(0);
267
#endif
268
  }
269
 
270
  semaphore::~semaphore()
271
  {
272
#ifdef _GLIBCXX_SYSV_SEM
273
    union semun val;
274
    // Destroy the semaphore set only in the process that created it. 
275
    if (pid_ == getpid())
276
      semctl(sem_set_, 0, IPC_RMID, val);
277
#endif
278
  }
279
 
280
  void
281
  semaphore::signal()
282
  {
283
#ifdef _GLIBCXX_SYSV_SEM
284
    struct sembuf op[1] =
285
      {
286
        { 0, 1, 0 }
287
      };
288
    if (semop(sem_set_, op, 1) == -1)
289
      std::__throw_runtime_error("could not signal semaphore");
290
#endif
291
  }
292
 
293
  void
294
  semaphore::wait()
295
  {
296
#ifdef _GLIBCXX_SYSV_SEM
297
    struct sembuf op[1] =
298
      {
299
        { 0, -1, SEM_UNDO }
300
      };
301
    if (semop(sem_set_, op, 1) == -1)
302
      std::__throw_runtime_error("could not wait for semaphore");
303
#endif    
304
  }
305
 
306
  // For use in 22_locale/time_get and time_put.
307
  tm
308
  test_tm(int sec, int min, int hour, int mday, int mon,
309
          int year, int wday, int yday, int isdst)
310
  {
311
    static tm tmp;
312
    tmp.tm_sec = sec;
313
    tmp.tm_min = min;
314
    tmp.tm_hour = hour;
315
    tmp.tm_mday = mday;
316
    tmp.tm_mon = mon;
317
    tmp.tm_year = year;
318
    tmp.tm_wday = wday;
319
    tmp.tm_yday = yday;
320
    tmp.tm_isdst = isdst;
321
    return tmp;
322
  }
323
}; // namespace __gnu_test

powered by: WebSVN 2.1.0

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