summaryrefslogtreecommitdiff
path: root/mach_dep.c
diff options
context:
space:
mode:
Diffstat (limited to 'mach_dep.c')
-rw-r--r--mach_dep.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/mach_dep.c b/mach_dep.c
index 4cb49209..1fc1b587 100644
--- a/mach_dep.c
+++ b/mach_dep.c
@@ -37,27 +37,28 @@
word new_sz;
GC_ASSERT(0 == buf_sz || buf != NULL);
- GC_ASSERT(buf_sz % sizeof(word) == 0);
for (;;) {
- if (NULL == buf) {
- new_sz = 0;
- if (syscall(__NR_access_hw_stacks, E2K_GET_PROCEDURE_STACK_SIZE,
- NULL, NULL, 0, &new_sz) != -1) {
- GC_ASSERT(new_sz > 0 && new_sz % sizeof(word) == 0);
- break;
- }
- } else {
- word stack_ofs = 0;
-
- if (syscall(__NR_access_hw_stacks, E2K_READ_PROCEDURE_STACK_EX,
- &stack_ofs, buf, buf_sz, NULL) != -1) {
- new_sz = buf_sz;
- break;
- }
+ word stack_ofs;
+
+ new_sz = 0;
+ if (syscall(__NR_access_hw_stacks, E2K_GET_PROCEDURE_STACK_SIZE,
+ NULL, NULL, 0, &new_sz) == -1) {
+ if (errno != EAGAIN)
+ ABORT_ARG1("Cannot get size of procedure stack",
+ ": errno= %d", errno);
+ continue;
}
+ GC_ASSERT(new_sz > 0 && new_sz % sizeof(word) == 0);
+ if (new_sz > buf_sz)
+ break;
+ /* Immediately read the stack right after checking its size. */
+ stack_ofs = 0;
+ if (syscall(__NR_access_hw_stacks, E2K_READ_PROCEDURE_STACK_EX,
+ &stack_ofs, buf, new_sz, NULL) != -1)
+ break;
if (errno != EAGAIN)
ABORT_ARG2("Cannot read procedure stack",
- ": buf_sz= %lu, errno= %d", (unsigned long)buf_sz, errno);
+ ": new_sz= %lu, errno= %d", (unsigned long)new_sz, errno);
}
return (size_t)new_sz;
}