Skip to content

Commit f2baa99

Browse files
authored
Merge pull request managarm#1661 from OBOS-dev/posix-get-current-stackinfo
options/posix: add sys_get_current_stack_info
2 parents 133924d + 6a15f6b commit f2baa99

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

options/posix/generic/pthread.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -265,12 +265,16 @@ int pthread_attr_setsigmask_np(pthread_attr_t *__restrict attr,
265265
}
266266

267267
namespace {
268-
void get_own_stackinfo(void **stack_addr, size_t *stack_size) {
268+
int get_own_stackinfo(void **stack_addr, size_t *stack_size) {
269+
if (mlibc::sys_get_current_stack_info) {
270+
return mlibc::sys_get_current_stack_info(stack_addr, stack_size);
271+
}
272+
273+
// Fallback to /proc/self/maps
269274
auto fp = fopen("/proc/self/maps", "r");
270275
if (!fp) {
271-
mlibc::infoLogger() << "mlibc pthreads: /proc/self/maps does not exist! Producing incorrect"
272-
" stack results!" << frg::endlog;
273-
return;
276+
mlibc::infoLogger() << "mlibc pthreads: /proc/self/maps does not exist! Returning ENOSYS." << frg::endlog;
277+
return ENOSYS;
274278
}
275279

276280
char line[256];
@@ -284,11 +288,12 @@ namespace {
284288
*stack_addr = reinterpret_cast<void*>(from);
285289
*stack_size = to - from;
286290
fclose(fp);
287-
return;
291+
return 0;
288292
}
289293
}
290294

291295
fclose(fp);
296+
return ESRCH;
292297
}
293298
} // namespace
294299

@@ -297,7 +302,9 @@ int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr) {
297302
*attr = pthread_attr_t{};
298303

299304
if (!tcb->stackAddr || !tcb->stackSize) {
300-
get_own_stackinfo(&attr->__mlibc_stackaddr, &attr->__mlibc_stacksize);
305+
if (int err = get_own_stackinfo(&attr->__mlibc_stackaddr, &attr->__mlibc_stacksize); err) {
306+
return err;
307+
}
301308
} else {
302309
attr->__mlibc_stacksize = tcb->stackSize;
303310
attr->__mlibc_stackaddr = tcb->stackAddr;

options/posix/include/mlibc/posix-sysdeps.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ int sys_vm_unmap(void *pointer, size_t size);
254254
[[gnu::weak]] int sys_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
255255
[[gnu::weak]] int sys_setthreadaffinity(pid_t tid, size_t cpusetsize, const cpu_set_t *mask);
256256

257+
[[gnu::weak]] int sys_get_current_stack_info(void **stack_base, size_t *stack_size);
258+
257259
[[gnu::weak]] int sys_waitid(idtype_t idtype, id_t id, siginfo_t *info, int options);
258260

259261
[[gnu::weak]] int sys_name_to_handle_at(int dirfd, const char *pathname, struct file_handle *handle, int *mount_id, int flags);

0 commit comments

Comments
 (0)