summaryrefslogtreecommitdiffstats
path: root/boehm-gc/os_dep.c
diff options
context:
space:
mode:
authorbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>2000-05-07 00:43:49 +0000
committerbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>2000-05-07 00:43:49 +0000
commitff457641f1961586e13e4b95b4f000c8b2615f99 (patch)
tree0d22c55f1ff05d1e504f0d4e95fc271a3ca6203f /boehm-gc/os_dep.c
parent9fd99fa7fb2136182a2f4d6c4184807febd5d6a4 (diff)
downloadppe42-gcc-ff457641f1961586e13e4b95b4f000c8b2615f99.tar.gz
ppe42-gcc-ff457641f1961586e13e4b95b4f000c8b2615f99.zip
2000-05-07 Bryce McKinlay <bryce@albatross.co.nz>
Imported version 5.0alpha7. * acinclude.m4: Update version to 5.0a7. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33750 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'boehm-gc/os_dep.c')
-rw-r--r--boehm-gc/os_dep.c35
1 files changed, 26 insertions, 9 deletions
diff --git a/boehm-gc/os_dep.c b/boehm-gc/os_dep.c
index 76e909f7971..636495ed039 100644
--- a/boehm-gc/os_dep.c
+++ b/boehm-gc/os_dep.c
@@ -642,31 +642,48 @@ ptr_t GC_get_stack_base()
#ifdef LINUX_STACKBOTTOM
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
# define STAT_SKIP 27 /* Number of fields preceding startstack */
/* field in /proc/self/stat */
ptr_t GC_linux_stack_base(void)
{
- FILE *f;
+ /* We read the stack base value from /proc/self/stat. We do this */
+ /* using direct I/O system calls in order to avoid calling malloc */
+ /* in case REDIRECT_MALLOC is defined. */
+# define STAT_BUF_SIZE 4096
+# ifdef USE_LD_WRAP
+# define STAT_READ __real_read
+# else
+# define STAT_READ read
+# endif
+ char stat_buf[STAT_BUF_SIZE];
+ int f;
char c;
word result = 0;
- int i;
+ size_t i, buf_offset = 0;
- f = fopen("/proc/self/stat", "r");
- if (NULL == f) ABORT("Couldn't open /proc/self/stat");
- c = getc(f);
+ f = open("/proc/self/stat", O_RDONLY);
+ if (f < 0 || read(f, stat_buf, STAT_BUF_SIZE) < 2 * STAT_SKIP) {
+ ABORT("Couldn't read /proc/self/stat");
+ }
+ c = stat_buf[buf_offset++];
/* Skip the required number of fields. This number is hopefully */
/* constant across all Linux implementations. */
for (i = 0; i < STAT_SKIP; ++i) {
- while (isspace(c)) c = getc(f);
- while (!isspace(c)) c = getc(f);
+ while (isspace(c)) c = stat_buf[buf_offset++];
+ while (!isspace(c)) c = stat_buf[buf_offset++];
}
- while (isspace(c)) c = getc(f);
+ while (isspace(c)) c = stat_buf[buf_offset++];
while (isdigit(c)) {
result *= 10;
result += c - '0';
- c = getc(f);
+ c = stat_buf[buf_offset++];
}
+ close(f);
if (result < 0x10000000) ABORT("Absurd stack bottom value");
return (ptr_t)result;
}
OpenPOWER on IntegriCloud