mirror of https://git.musl-libc.org/git/musl
Browse Source
i originally omitted these (optional, per POSIX) interfaces because i considered them backwards implementation details. however, someone later brought to my attention a fairly legitimate use case: allocating thread stacks in memory that's setup for sharing and/or fast transfer between CPU and GPU so that the thread can move data to a GPU directly from automatic-storage buffers without having to go through additional buffer copies. perhaps there are other situations in which these interfaces are useful too.rs-1.0
4 changed files with 39 additions and 10 deletions
@ -0,0 +1,10 @@ |
|||
#include "pthread_impl.h" |
|||
|
|||
int pthread_attr_getstack(const pthread_attr_t *a, void **addr, size_t *size) |
|||
{ |
|||
if (!a->_a_stackaddr) |
|||
return EINVAL; |
|||
*size = a->_a_stacksize + DEFAULT_STACK_SIZE; |
|||
*addr = (void *)(a->_a_stackaddr - *size); |
|||
return 0; |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
#include "pthread_impl.h" |
|||
|
|||
/* pthread_key_create.c overrides this */ |
|||
static const size_t dummy = 0; |
|||
weak_alias(dummy, __pthread_tsd_size); |
|||
|
|||
int pthread_attr_setstack(pthread_attr_t *a, void *addr, size_t size) |
|||
{ |
|||
if (size-PTHREAD_STACK_MIN-__pthread_tsd_size > SIZE_MAX/4) |
|||
return EINVAL; |
|||
a->_a_stackaddr = (size_t)addr + size; |
|||
a->_a_stacksize = size - DEFAULT_STACK_SIZE; |
|||
return 0; |
|||
} |
|||
Loading…
Reference in new issue