diff --git a/include/pthread.h b/include/pthread.h index d8a9f4ab..9f6daf79 100644 --- a/include/pthread.h +++ b/include/pthread.h @@ -252,6 +252,27 @@ void pthread_cleanup_push(void (*routine)(void *), void *arg); void pthread_cleanup_pop(int execute); +int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); + + +int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); + + +int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); + + +int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); + + +int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); + + +int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); + + +int pthread_rwlock_init(pthread_rwlock_t *__restrict__ rwlock, const pthread_rwlockattr_t *__restrict__ attr); + + #ifdef __cplusplus } #endif diff --git a/include/sys/types.h b/include/sys/types.h index dd7b12e1..0a3d5534 100644 --- a/include/sys/types.h +++ b/include/sys/types.h @@ -54,6 +54,11 @@ typedef struct { volatile int initialized; } pthread_mutex_t; +/* TODO */ +typedef int pthread_rwlock_t; + +typedef int pthread_rwlockattr_t; + typedef struct lockAttr pthread_mutexattr_t; diff --git a/include/unistd.h b/include/unistd.h index dca551d7..a8082174 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -259,6 +259,9 @@ extern int ttyname_r(int fildes, char *name, size_t namesize); extern int pause(void); +int chroot(const char *path); + + extern char *optarg; diff --git a/pthread/pthread.c b/pthread/pthread.c index ff0381a3..5139229e 100644 --- a/pthread/pthread.c +++ b/pthread/pthread.c @@ -1340,6 +1340,57 @@ void pthread_cleanup_pop(int execute) } +/* FIXME: rwlocks are yet to be implemented, that breaks shared_mutex in cpp. */ +int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock) +{ + (void)rwlock; + return ENOSYS; +} + + +int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock) +{ + (void)rwlock; + return ENOSYS; +} + + +int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock) +{ + (void)rwlock; + return ENOSYS; +} + + +int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock) +{ + (void)rwlock; + return ENOSYS; +} + + +int pthread_rwlock_unlock(pthread_rwlock_t *rwlock) +{ + (void)rwlock; + return ENOSYS; +} + + +int pthread_rwlock_destroy(pthread_rwlock_t *rwlock) +{ + (void)rwlock; + return ENOSYS; +} + + +int pthread_rwlock_init(pthread_rwlock_t *__restrict__ rwlock, const pthread_rwlockattr_t *__restrict__ attr) +{ + (void)rwlock; + (void)attr; + return ENOSYS; +} + + void _pthread_init(void) { mutexCreate(&pthread_common.pthread_key_lock); diff --git a/string/string.c b/string/string.c index bdd61f26..983040a5 100644 --- a/string/string.c +++ b/string/string.c @@ -179,7 +179,9 @@ int memcmp(const void *s1, const void *s2, size_t count) #ifndef __STRLEN #define __STRLEN -size_t strlen(const char *s) +/* FIXME: long-standing bug in gcc https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102725 + * it occurs in strlen causing inf loop, can be avoided if all platform implement strlen in asm. */ +__attribute__((optimize("-fno-tree-loop-distribute-patterns"))) size_t strlen(const char *s) { unsigned int k; diff --git a/sys/socket.c b/sys/socket.c index 26b70f66..c3594618 100644 --- a/sys/socket.c +++ b/sys/socket.c @@ -42,7 +42,7 @@ WRAP_ERRNO_DEF(int, listen, (int socket, int backlog), (socket, backlog)) WRAP_ERRNO_DEF(ssize_t, recvfrom, (int socket, void *message, size_t length, int flags, struct sockaddr *src_addr, socklen_t *src_len), (socket, message, length, flags, src_addr, src_len)) WRAP_ERRNO_DEF(ssize_t, sendto, (int socket, const void *message, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t dest_len), (socket, message, length, flags, dest_addr, dest_len)) WRAP_ERRNO_DEF(int, socket, (int domain, int type, int protocol), (domain, type, protocol)) -WRAP_ERRNO_DEF(int, socketpair, (int domain, int type, int protocol, int *sv), (domain, type, protocol, sv)) +WRAP_ERRNO_DEF(int, socketpair, (int domain, int type, int protocol, int sv[2]), (domain, type, protocol, sv)) WRAP_ERRNO_DEF(int, shutdown, (int socket, int how), (socket, how)) WRAP_ERRNO_DEF(int, setsockopt, (int socket, int level, int optname, const void *optval, socklen_t optlen), (socket, level, optname, optval, optlen))