summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/i386/sbrk.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2001-10-03 09:12:28 +0000
committerEric Andersen <andersen@codepoet.org>2001-10-03 09:12:28 +0000
commitb78d55926e729a670cb0b8225c22bb92b02f214b (patch)
tree6050526f541a6c8951bd89cc43ab5c1835f16e7d /libc/sysdeps/linux/i386/sbrk.c
parent29444b89ffa55645bc1846dbacf56c70e8bb04ed (diff)
Cleanup brk/sbrk
Diffstat (limited to 'libc/sysdeps/linux/i386/sbrk.c')
-rw-r--r--libc/sysdeps/linux/i386/sbrk.c65
1 files changed, 38 insertions, 27 deletions
diff --git a/libc/sysdeps/linux/i386/sbrk.c b/libc/sysdeps/linux/i386/sbrk.c
index 39db14945..a3b1c07b5 100644
--- a/libc/sysdeps/linux/i386/sbrk.c
+++ b/libc/sysdeps/linux/i386/sbrk.c
@@ -1,34 +1,45 @@
-/* From libc-5.3.12 */
+/* Copyright (C) 1991, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
#include <unistd.h>
-#include <sys/syscall.h>
#include <errno.h>
-extern void * ___brk_addr;
-
-extern int __init_brk (void);
+/* Defined in brk.c. */
+extern void *___brk_addr;
+extern int brk (void *addr);
-void *sbrk(intptr_t increment)
+/* Extend the process's data space by INCREMENT.
+ If INCREMENT is negative, shrink data space by - INCREMENT.
+ Return start of new space allocated, or -1 for errors. */
+void * sbrk (intptr_t increment)
{
- if (__init_brk () == 0)
- {
- void * tmp = ___brk_addr+increment;
-#if defined(__PIC__) || defined (__pic__)
- __asm__ volatile ("pushl %%ebx\n\t"
- "movl %%ecx,%%ebx\n\t"
- "int $0x80\n\t"
- "popl %%ebx"
- :"=a" (___brk_addr)
- :"0" (__NR_brk),"c" (tmp));
-#else
- __asm__ volatile ("int $0x80"
- :"=a" (___brk_addr)
- :"0" (__NR_brk),"b" (tmp));
-#endif
- if (___brk_addr == tmp)
- return tmp-increment;
- __set_errno(ENOMEM);
- return ((void *) -1);
- }
- return ((void *) -1);
+ void *oldbrk;
+
+ if (___brk_addr == NULL)
+ if (brk (0) < 0) /* Initialize the break. */
+ return (void *) -1;
+
+ if (increment == 0)
+ return ___brk_addr;
+
+ oldbrk = ___brk_addr;
+ if (brk (oldbrk + increment) < 0)
+ return (void *) -1;
+
+ return oldbrk;
}