int pthread_barrier_destroy(pthread_barrier_t *b) { if (b->_b_limit < 0) { if (b->_b_lock) { int v; a_or(&b->_b_lock, INT_MIN); while ((v = b->_b_lock) & INT_MAX) __wait(&b->_b_lock, 0, v, 0); } __vm_wait(); } return 0; }
void* __mremap(void* old_addr, size_t old_len, size_t new_len, int flags, ...) { va_list ap; void* new_addr = 0; if (new_len >= PTRDIFF_MAX) { errno = ENOMEM; return MAP_FAILED; } if (flags & MREMAP_FIXED) { __vm_wait(); va_start(ap, flags); new_addr = va_arg(ap, void*); va_end(ap); }
void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off) { if (off & OFF_MASK) { errno = EINVAL; return MAP_FAILED; } if (len >= PTRDIFF_MAX) { errno = ENOMEM; return MAP_FAILED; } if (flags & MAP_FIXED) { __vm_wait(); } #ifdef SYS_mmap2 return (void *)syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT); #else return (void *)syscall(SYS_mmap, start, len, prot, flags, fd, off); #endif }
void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off) { long ret; if (off & OFF_MASK) { errno = EINVAL; return MAP_FAILED; } if (len >= PTRDIFF_MAX) { errno = ENOMEM; return MAP_FAILED; } if (flags & MAP_FIXED) { __vm_wait(); } #ifdef SYS_mmap2 ret = __syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT); #else ret = __syscall(SYS_mmap, start, len, prot, flags, fd, off); #endif /* Fixup incorrect EPERM from kernel. */ if (ret == -EPERM && !start && (flags&MAP_ANON) && !(flags&MAP_FIXED)) ret = -ENOMEM; return (void *)__syscall_ret(ret); }
int __munmap(void *start, size_t len) { __vm_wait(); return syscall(SYS_munmap, start, len); }