]>
Commit | Line | Data |
---|---|---|
1 | /* Copyright (C) 1991-2015 Free Software Foundation, Inc. | |
2 | This file is part of the GNU C Library. | |
3 | ||
4 | The GNU C Library is free software; you can redistribute it and/or | |
5 | modify it under the terms of the GNU Lesser General Public | |
6 | License as published by the Free Software Foundation; either | |
7 | version 2.1 of the License, or (at your option) any later version. | |
8 | ||
9 | The GNU C Library is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | Lesser General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU Lesser General Public | |
15 | License along with the GNU C Library; if not, see | |
16 | <http://www.gnu.org/licenses/>. */ | |
17 | ||
18 | #include <errno.h> | |
19 | #include <stdint.h> | |
20 | #include <unistd.h> | |
21 | ||
22 | /* Defined in brk.c. */ | |
23 | extern void *__curbrk; | |
24 | extern int __brk (void *addr); | |
25 | ||
26 | /* Defined in init-first.c. */ | |
27 | extern int __libc_multiple_libcs attribute_hidden; | |
28 | ||
29 | /* Extend the process's data space by INCREMENT. | |
30 | If INCREMENT is negative, shrink data space by - INCREMENT. | |
31 | Return start of new space allocated, or -1 for errors. */ | |
32 | void * | |
33 | __sbrk (intptr_t increment) | |
34 | { | |
35 | void *oldbrk; | |
36 | ||
37 | /* If this is not part of the dynamic library or the library is used | |
38 | via dynamic loading in a statically linked program update | |
39 | __curbrk from the kernel's brk value. That way two separate | |
40 | instances of __brk and __sbrk can share the heap, returning | |
41 | interleaved pieces of it. */ | |
42 | if (__curbrk == NULL || __libc_multiple_libcs) | |
43 | if (__brk (0) < 0) /* Initialize the break. */ | |
44 | return (void *) -1; | |
45 | ||
46 | if (increment == 0) | |
47 | return __curbrk; | |
48 | ||
49 | oldbrk = __curbrk; | |
50 | if ((increment > 0 | |
51 | ? ((uintptr_t) oldbrk + (uintptr_t) increment < (uintptr_t) oldbrk) | |
52 | : ((uintptr_t) oldbrk < (uintptr_t) -increment)) | |
53 | || __brk (oldbrk + increment) < 0) | |
54 | return (void *) -1; | |
55 | ||
56 | return oldbrk; | |
57 | } | |
58 | libc_hidden_def (__sbrk) | |
59 | weak_alias (__sbrk, sbrk) |