111
|
1 /* Increase stack size limit if possible.
|
131
|
2 Copyright (C) 2011-2018 Free Software Foundation, Inc.
|
111
|
3
|
|
4 This file is part of the libiberty library. This library is free
|
|
5 software; you can redistribute it and/or modify it under the
|
|
6 terms of the GNU General Public License as published by the
|
|
7 Free Software Foundation; either version 2, or (at your option)
|
|
8 any later version.
|
|
9
|
|
10 This library is distributed in the hope that it will be useful,
|
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13 GNU General Public License for more details.
|
|
14
|
|
15 You should have received a copy of the GNU General Public License
|
|
16 along with GNU CC; see the file COPYING. If not, write to
|
|
17 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
|
|
18 Boston, MA 02110-1301, USA.
|
|
19
|
|
20 As a special exception, if you link this library with files
|
|
21 compiled with a GNU compiler to produce an executable, this does not cause
|
|
22 the resulting executable to be covered by the GNU General Public License.
|
|
23 This exception does not however invalidate any other reasons why
|
|
24 the executable file might be covered by the GNU General Public License. */
|
|
25
|
|
26 /*
|
|
27
|
|
28 @deftypefn Extension void stack_limit_increase (unsigned long @var{pref})
|
|
29
|
|
30 Attempt to increase stack size limit to @var{pref} bytes if possible.
|
|
31
|
|
32 @end deftypefn
|
|
33
|
|
34 */
|
|
35
|
|
36 #include "config.h"
|
|
37 #include "ansidecl.h"
|
|
38
|
|
39 #ifdef HAVE_STDINT_H
|
|
40 #include <stdint.h>
|
|
41 #endif
|
|
42 #ifdef HAVE_SYS_RESOURCE_H
|
|
43 #include <sys/resource.h>
|
|
44 #endif
|
|
45
|
|
46 void
|
|
47 stack_limit_increase (unsigned long pref ATTRIBUTE_UNUSED)
|
|
48 {
|
|
49 #if defined(HAVE_SETRLIMIT) && defined(HAVE_GETRLIMIT) \
|
|
50 && defined(RLIMIT_STACK) && defined(RLIM_INFINITY)
|
|
51 struct rlimit rlim;
|
|
52 if (getrlimit (RLIMIT_STACK, &rlim) == 0
|
|
53 && rlim.rlim_cur != RLIM_INFINITY
|
|
54 && rlim.rlim_cur < pref
|
|
55 && (rlim.rlim_max == RLIM_INFINITY || rlim.rlim_cur < rlim.rlim_max))
|
|
56 {
|
|
57 rlim.rlim_cur = pref;
|
|
58 if (rlim.rlim_max != RLIM_INFINITY && rlim.rlim_cur > rlim.rlim_max)
|
|
59 rlim.rlim_cur = rlim.rlim_max;
|
|
60 setrlimit (RLIMIT_STACK, &rlim);
|
|
61 }
|
|
62 #endif
|
|
63 }
|