summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/aio/aio_readwrite.c3
-rw-r--r--src/aio/lio_listio.c3
-rw-r--r--src/conf/sysconf.c4
-rw-r--r--src/env/__init_tls.c2
-rw-r--r--src/internal/floatscan.c1
-rw-r--r--src/internal/i386/syscall.s3
-rw-r--r--src/internal/intscan.c1
-rw-r--r--src/internal/pthread_impl.h13
-rw-r--r--src/internal/stdio_impl.h17
-rw-r--r--src/ldso/dynlink.c11
-rw-r--r--src/process/fork.c1
-rw-r--r--src/process/posix_spawnattr_sched.c25
-rw-r--r--src/sched/sched_get_priority_max.c5
-rw-r--r--src/sched/sched_getparam.c3
-rw-r--r--src/sched/sched_getscheduler.c3
-rw-r--r--src/sched/sched_rr_get_interval.c1
-rw-r--r--src/sched/sched_setparam.c4
-rw-r--r--src/sched/sched_setscheduler.c4
-rw-r--r--src/signal/sigaction.c1
-rw-r--r--src/stdio/__fdopen.c6
-rw-r--r--src/stdio/__fopen_rb_ca.c2
-rw-r--r--src/stdio/__stdio_read.c1
-rw-r--r--src/stdio/__stdio_write.c1
-rw-r--r--src/stdio/__stdout_write.c2
-rw-r--r--src/stdio/__string_read.c1
-rw-r--r--src/stdio/fgetln.c1
-rw-r--r--src/stdio/fgets.c1
-rw-r--r--src/stdio/fgetwc.c2
-rw-r--r--src/stdio/fgetws.c1
-rw-r--r--src/stdio/fmemopen.c16
-rw-r--r--src/stdio/fopen.c3
-rw-r--r--src/stdio/fputs.c1
-rw-r--r--src/stdio/fputwc.c3
-rw-r--r--src/stdio/fputws.c1
-rw-r--r--src/stdio/fread.c1
-rw-r--r--src/stdio/freopen.c1
-rw-r--r--src/stdio/ftell.c2
-rw-r--r--src/stdio/ftrylockfile.c1
-rw-r--r--src/stdio/fwrite.c1
-rw-r--r--src/stdio/getdelim.c3
-rw-r--r--src/stdio/gets.c2
-rw-r--r--src/stdio/getwc.c1
-rw-r--r--src/stdio/getwchar.c1
-rw-r--r--src/stdio/open_memstream.c16
-rw-r--r--src/stdio/open_wmemstream.c17
-rw-r--r--src/stdio/pclose.c3
-rw-r--r--src/stdio/popen.c3
-rw-r--r--src/stdio/putwc.c1
-rw-r--r--src/stdio/putwchar.c1
-rw-r--r--src/stdio/ungetwc.c4
-rw-r--r--src/stdio/vfprintf.c9
-rw-r--r--src/stdio/vfscanf.c2
-rw-r--r--src/stdio/vfwprintf.c7
-rw-r--r--src/stdio/vsnprintf.c4
-rw-r--r--src/stdio/vswprintf.c5
-rw-r--r--src/stdio/vswscanf.c1
-rw-r--r--src/stdlib/strtol.c3
-rw-r--r--src/stdlib/wcstod.c1
-rw-r--r--src/stdlib/wcstol.c4
-rw-r--r--src/thread/__wake.c1
-rw-r--r--src/thread/pthread_attr_get.c93
-rw-r--r--src/thread/pthread_attr_getdetachstate.c7
-rw-r--r--src/thread/pthread_attr_getguardsize.c7
-rw-r--r--src/thread/pthread_attr_getschedparam.c7
-rw-r--r--src/thread/pthread_attr_getscope.c6
-rw-r--r--src/thread/pthread_attr_getstack.c10
-rw-r--r--src/thread/pthread_attr_getstacksize.c7
-rw-r--r--src/thread/pthread_attr_init.c3
-rw-r--r--src/thread/pthread_attr_setinheritsched.c8
-rw-r--r--src/thread/pthread_attr_setschedparam.c2
-rw-r--r--src/thread/pthread_attr_setschedpolicy.c7
-rw-r--r--src/thread/pthread_attr_setscope.c10
-rw-r--r--src/thread/pthread_barrierattr_getpshared.c7
-rw-r--r--src/thread/pthread_barrierattr_init.c2
-rw-r--r--src/thread/pthread_cond_init.c2
-rw-r--r--src/thread/pthread_condattr_getclock.c7
-rw-r--r--src/thread/pthread_condattr_getpshared.c7
-rw-r--r--src/thread/pthread_condattr_init.c2
-rw-r--r--src/thread/pthread_create.c30
-rw-r--r--src/thread/pthread_getschedparam.c17
-rw-r--r--src/thread/pthread_join.c1
-rw-r--r--src/thread/pthread_mutex_init.c2
-rw-r--r--src/thread/pthread_mutexattr_getpshared.c7
-rw-r--r--src/thread/pthread_mutexattr_getrobust.c7
-rw-r--r--src/thread/pthread_mutexattr_gettype.c7
-rw-r--r--src/thread/pthread_mutexattr_init.c2
-rw-r--r--src/thread/pthread_rwlock_init.c2
-rw-r--r--src/thread/pthread_rwlockattr_getpshared.c7
-rw-r--r--src/thread/pthread_rwlockattr_init.c2
-rw-r--r--src/thread/pthread_setschedparam.c10
-rw-r--r--src/thread/pthread_setschedprio.c10
-rw-r--r--src/thread/synccall.c1
-rw-r--r--src/time/timer_create.c1
93 files changed, 377 insertions, 165 deletions
diff --git a/src/aio/aio_readwrite.c b/src/aio/aio_readwrite.c
index 584ccb3d..e4c95aa2 100644
--- a/src/aio/aio_readwrite.c
+++ b/src/aio/aio_readwrite.c
@@ -1,5 +1,8 @@
#include <aio.h>
#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <limits.h>
#include "pthread_impl.h"
static void dummy(void)
diff --git a/src/aio/lio_listio.c b/src/aio/lio_listio.c
index 30f7cc05..53f9f502 100644
--- a/src/aio/lio_listio.c
+++ b/src/aio/lio_listio.c
@@ -1,5 +1,8 @@
#include <aio.h>
#include <errno.h>
+#include <limits.h>
+#include <unistd.h>
+#include <string.h>
#include "pthread_impl.h"
struct lio_state {
diff --git a/src/conf/sysconf.c b/src/conf/sysconf.c
index d6691df8..9f0d97b2 100644
--- a/src/conf/sysconf.c
+++ b/src/conf/sysconf.c
@@ -89,9 +89,9 @@ long sysconf(int name)
[_SC_THREAD_KEYS_MAX] = PTHREAD_KEYS_MAX,
[_SC_THREAD_STACK_MIN] = PTHREAD_STACK_MIN,
[_SC_THREAD_THREADS_MAX] = -1,
- [_SC_THREAD_ATTR_STACKADDR] = -1,
+ [_SC_THREAD_ATTR_STACKADDR] = VER,
[_SC_THREAD_ATTR_STACKSIZE] = VER,
- [_SC_THREAD_PRIORITY_SCHEDULING] = -1,
+ [_SC_THREAD_PRIORITY_SCHEDULING] = VER,
[_SC_THREAD_PRIO_INHERIT] = -1,
[_SC_THREAD_PRIO_PROTECT] = -1,
[_SC_THREAD_PROCESS_SHARED] = VER,
diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c
index c71f49c1..3a1b1f56 100644
--- a/src/env/__init_tls.c
+++ b/src/env/__init_tls.c
@@ -1,5 +1,7 @@
#include <elf.h>
#include <limits.h>
+#include <sys/mman.h>
+#include <string.h>
#include "pthread_impl.h"
#include "libc.h"
#include "atomic.h"
diff --git a/src/internal/floatscan.c b/src/internal/floatscan.c
index 08251213..f6e331d4 100644
--- a/src/internal/floatscan.c
+++ b/src/internal/floatscan.c
@@ -4,6 +4,7 @@
#include <float.h>
#include <limits.h>
#include <errno.h>
+#include <ctype.h>
#include "shgetc.h"
#include "floatscan.h"
diff --git a/src/internal/i386/syscall.s b/src/internal/i386/syscall.s
index 291168c3..2914acee 100644
--- a/src/internal/i386/syscall.s
+++ b/src/internal/i386/syscall.s
@@ -16,7 +16,8 @@ __vsyscall:
mov 12(%esp),%edi
push %eax
call 1f
-2: pop %ebx
+2: mov %ebx,%edx
+ pop %ebx
pop %ebx
pop %edi
ret
diff --git a/src/internal/intscan.c b/src/internal/intscan.c
index 178cdf0d..69350efa 100644
--- a/src/internal/intscan.c
+++ b/src/internal/intscan.c
@@ -1,5 +1,6 @@
#include <limits.h>
#include <errno.h>
+#include <ctype.h>
#include "shgetc.h"
/* Lookup table for digit values. -1==255>=36 -> invalid */
diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h
index 0f10cc48..4215e67a 100644
--- a/src/internal/pthread_impl.h
+++ b/src/internal/pthread_impl.h
@@ -2,17 +2,9 @@
#define _PTHREAD_IMPL_H
#include <pthread.h>
-#include <sched.h>
#include <signal.h>
-#include <unistd.h>
-#include <sys/mman.h>
#include <errno.h>
#include <limits.h>
-#include <inttypes.h>
-#include <setjmp.h>
-#include <string.h>
-#include <time.h>
-#include <locale.h>
#include "libc.h"
#include "syscall.h"
#include "atomic.h"
@@ -48,6 +40,8 @@ struct pthread {
locale_t locale;
int killlock[2];
int exitlock[2];
+ int startlock[2];
+ unsigned long sigmask[__SYSCALL_SSLEN/sizeof(long)];
};
struct __timer {
@@ -61,6 +55,9 @@ struct __timer {
#define _a_guardsize __u.__s[1]
#define _a_stackaddr __u.__s[2]
#define _a_detach __u.__i[3*__SU+0]
+#define _a_sched __u.__i[3*__SU+1]
+#define _a_policy __u.__i[3*__SU+2]
+#define _a_prio __u.__i[3*__SU+3]
#define _m_type __u.__i[0]
#define _m_lock __u.__i[1]
#define _m_waiters __u.__i[2]
diff --git a/src/internal/stdio_impl.h b/src/internal/stdio_impl.h
index e9045f27..c9d20fac 100644
--- a/src/internal/stdio_impl.h
+++ b/src/internal/stdio_impl.h
@@ -2,23 +2,6 @@
#define _STDIO_IMPL_H
#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdarg.h>
-#include <string.h>
-#include <inttypes.h>
-#include <wchar.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <errno.h>
-#include <termios.h>
-#include <sys/ioctl.h>
-#include <ctype.h>
-#include <sys/wait.h>
-#include <math.h>
-#include <float.h>
-#include <sys/uio.h>
#include "syscall.h"
#include "libc.h"
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c
index 625f80cc..ba2f6129 100644
--- a/src/ldso/dynlink.c
+++ b/src/ldso/dynlink.c
@@ -478,13 +478,16 @@ static struct dso *load_library(const char *name)
if (!sys_path) {
FILE *f = fopen(ETC_LDSO_PATH, "rbe");
if (f) {
- if (getline(&sys_path, (size_t[1]){0}, f) > 0)
- sys_path[strlen(sys_path)-1]=0;
+ if (getline(&sys_path, (size_t[1]){0}, f) > 0) {
+ size_t l = strlen(sys_path);
+ if (l && sys_path[l-1]=='\n')
+ sys_path[-1] = 0;
+ }
fclose(f);
}
}
- if (sys_path) fd = path_open(name, sys_path, buf, sizeof buf);
- else fd = path_open(name, "/lib:/usr/local/lib:/usr/lib", buf, sizeof buf);
+ if (!sys_path) sys_path = "/lib:/usr/local/lib:/usr/lib";
+ fd = path_open(name, sys_path, buf, sizeof buf);
}
pathname = buf;
}
diff --git a/src/process/fork.c b/src/process/fork.c
index a8bdbe0b..fb8a430a 100644
--- a/src/process/fork.c
+++ b/src/process/fork.c
@@ -1,4 +1,5 @@
#include <unistd.h>
+#include <string.h>
#include "syscall.h"
#include "libc.h"
#include "pthread_impl.h"
diff --git a/src/process/posix_spawnattr_sched.c b/src/process/posix_spawnattr_sched.c
new file mode 100644
index 00000000..e2ba0d19
--- /dev/null
+++ b/src/process/posix_spawnattr_sched.c
@@ -0,0 +1,25 @@
+#include <spawn.h>
+#include <sched.h>
+#include <errno.h>
+
+int posix_spawnattr_getschedparam(const posix_spawnattr_t *restrict attr,
+ struct sched_param *restrict schedparam)
+{
+ return ENOSYS;
+}
+
+int posix_spawnattr_setschedparam(posix_spawnattr_t *restrict attr,
+ const struct sched_param *restrict schedparam)
+{
+ return ENOSYS;
+}
+
+int posix_spawnattr_getschedpolicy(const posix_spawnattr_t *restrict attr, int *policy)
+{
+ return ENOSYS;
+}
+
+int posix_spawnattr_setschedpolicy(posix_spawnattr_t *restrict attr, int policy)
+{
+ return ENOSYS;
+}
diff --git a/src/sched/sched_get_priority_max.c b/src/sched/sched_get_priority_max.c
index 64cbca93..30ae5100 100644
--- a/src/sched/sched_get_priority_max.c
+++ b/src/sched/sched_get_priority_max.c
@@ -1,11 +1,12 @@
#include <sched.h>
+#include "syscall.h"
int sched_get_priority_max(int policy)
{
- return 0;
+ return syscall(SYS_sched_get_priority_max, policy);
}
int sched_get_priority_min(int policy)
{
- return 0;
+ return syscall(SYS_sched_get_priority_min, policy);
}
diff --git a/src/sched/sched_getparam.c b/src/sched/sched_getparam.c
index 65be1075..76f10e49 100644
--- a/src/sched/sched_getparam.c
+++ b/src/sched/sched_getparam.c
@@ -1,7 +1,8 @@
#include <sched.h>
+#include <errno.h>
#include "syscall.h"
int sched_getparam(pid_t pid, struct sched_param *param)
{
- return syscall(SYS_sched_getparam, pid, param);
+ return __syscall_ret(-ENOSYS);
}
diff --git a/src/sched/sched_getscheduler.c b/src/sched/sched_getscheduler.c
index 4c922f69..394e508b 100644
--- a/src/sched/sched_getscheduler.c
+++ b/src/sched/sched_getscheduler.c
@@ -1,7 +1,8 @@
#include <sched.h>
+#include <errno.h>
#include "syscall.h"
int sched_getscheduler(pid_t pid)
{
- return syscall(SYS_sched_getscheduler, pid);
+ return __syscall_ret(-ENOSYS);
}
diff --git a/src/sched/sched_rr_get_interval.c b/src/sched/sched_rr_get_interval.c
index 43bc4904..4b01028f 100644
--- a/src/sched/sched_rr_get_interval.c
+++ b/src/sched/sched_rr_get_interval.c
@@ -5,4 +5,3 @@ int sched_rr_get_interval(pid_t pid, struct timespec *ts)
{
return syscall(SYS_sched_rr_get_interval, pid, ts);
}
-
diff --git a/src/sched/sched_setparam.c b/src/sched/sched_setparam.c
index 07d61aea..18623ee4 100644
--- a/src/sched/sched_setparam.c
+++ b/src/sched/sched_setparam.c
@@ -1,8 +1,8 @@
#include <sched.h>
+#include <errno.h>
#include "syscall.h"
int sched_setparam(pid_t pid, const struct sched_param *param)
{
- static const struct sched_param def;
- return syscall(SYS_sched_setparam, pid, &def);
+ return __syscall_ret(-ENOSYS);
}
diff --git a/src/sched/sched_setscheduler.c b/src/sched/sched_setscheduler.c
index 19580660..4435f216 100644
--- a/src/sched/sched_setscheduler.c
+++ b/src/sched/sched_setscheduler.c
@@ -1,8 +1,8 @@
#include <sched.h>
+#include <errno.h>
#include "syscall.h"
int sched_setscheduler(pid_t pid, int sched, const struct sched_param *param)
{
- static const struct sched_param def;
- return syscall(SYS_sched_setscheduler, pid, 0, &def);
+ return __syscall_ret(-ENOSYS);
}
diff --git a/src/signal/sigaction.c b/src/signal/sigaction.c
index d9535032..7a72a44b 100644
--- a/src/signal/sigaction.c
+++ b/src/signal/sigaction.c
@@ -1,6 +1,7 @@
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
+#include <string.h>
#include "syscall.h"
#include "pthread_impl.h"
#include "libc.h"
diff --git a/src/stdio/__fdopen.c b/src/stdio/__fdopen.c
index df6ed71d..59690f6d 100644
--- a/src/stdio/__fdopen.c
+++ b/src/stdio/__fdopen.c
@@ -1,4 +1,10 @@
#include "stdio_impl.h"
+#include <stdlib.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
FILE *__fdopen(int fd, const char *mode)
{
diff --git a/src/stdio/__fopen_rb_ca.c b/src/stdio/__fopen_rb_ca.c
index a1b1b3b6..9202c8ce 100644
--- a/src/stdio/__fopen_rb_ca.c
+++ b/src/stdio/__fopen_rb_ca.c
@@ -1,4 +1,6 @@
#include "stdio_impl.h"
+#include <fcntl.h>
+#include <string.h>
FILE *__fopen_rb_ca(const char *filename, FILE *f, unsigned char *buf, size_t len)
{
diff --git a/src/stdio/__stdio_read.c b/src/stdio/__stdio_read.c
index c99ca9a9..05e56f92 100644
--- a/src/stdio/__stdio_read.c
+++ b/src/stdio/__stdio_read.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <sys/uio.h>
#include <pthread.h>
static void cleanup(void *p)
diff --git a/src/stdio/__stdio_write.c b/src/stdio/__stdio_write.c
index cef7bbdc..e52e91ae 100644
--- a/src/stdio/__stdio_write.c
+++ b/src/stdio/__stdio_write.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <sys/uio.h>
#include <pthread.h>
static void cleanup(void *p)
diff --git a/src/stdio/__stdout_write.c b/src/stdio/__stdout_write.c
index 0cf71236..200fe2c9 100644
--- a/src/stdio/__stdout_write.c
+++ b/src/stdio/__stdout_write.c
@@ -1,4 +1,6 @@
#include "stdio_impl.h"
+#include <termios.h>
+#include <sys/ioctl.h>
size_t __stdout_write(FILE *f, const unsigned char *buf, size_t len)
{
diff --git a/src/stdio/__string_read.c b/src/stdio/__string_read.c
index de002fc1..7b50a7e1 100644
--- a/src/stdio/__string_read.c
+++ b/src/stdio/__string_read.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <string.h>
size_t __string_read(FILE *f, unsigned char *buf, size_t len)
{
diff --git a/src/stdio/fgetln.c b/src/stdio/fgetln.c
index 06b88837..a2e4bd3c 100644
--- a/src/stdio/fgetln.c
+++ b/src/stdio/fgetln.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <string.h>
char *fgetln(FILE *f, size_t *plen)
{
diff --git a/src/stdio/fgets.c b/src/stdio/fgets.c
index ee0ac30e..b01a4187 100644
--- a/src/stdio/fgets.c
+++ b/src/stdio/fgets.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <string.h>
#define MIN(a,b) ((a)<(b) ? (a) : (b))
diff --git a/src/stdio/fgetwc.c b/src/stdio/fgetwc.c
index 6f9f9ec2..8626d54c 100644
--- a/src/stdio/fgetwc.c
+++ b/src/stdio/fgetwc.c
@@ -1,4 +1,6 @@
#include "stdio_impl.h"
+#include <wchar.h>
+#include <errno.h>
wint_t __fgetwc_unlocked(FILE *f)
{
diff --git a/src/stdio/fgetws.c b/src/stdio/fgetws.c
index fab9bd0f..195cb435 100644
--- a/src/stdio/fgetws.c
+++ b/src/stdio/fgetws.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <wchar.h>
wint_t __fgetwc_unlocked(FILE *);
diff --git a/src/stdio/fmemopen.c b/src/stdio/fmemopen.c
index 770fd995..d7849609 100644
--- a/src/stdio/fmemopen.c
+++ b/src/stdio/fmemopen.c
@@ -1,4 +1,7 @@
#include "stdio_impl.h"
+#include <errno.h>
+#include <string.h>
+#include <inttypes.h>
struct cookie {
size_t pos, len, size;
@@ -105,12 +108,13 @@ FILE *fmemopen(void *restrict buf, size_t size, const char *restrict mode)
f->seek = mseek;
f->close = mclose;
- if (!libc.threaded) {
- f->lock = -1;
- f->next = libc.ofl_head;
- if (libc.ofl_head) libc.ofl_head->prev = f;
- libc.ofl_head = f;
- }
+ if (!libc.threaded) f->lock = -1;
+
+ OFLLOCK();
+ f->next = libc.ofl_head;
+ if (libc.ofl_head) libc.ofl_head->prev = f;
+ libc.ofl_head = f;
+ OFLUNLOCK();
return f;
}
diff --git a/src/stdio/fopen.c b/src/stdio/fopen.c
index c741aede..da17ce8b 100644
--- a/src/stdio/fopen.c
+++ b/src/stdio/fopen.c
@@ -1,4 +1,7 @@
#include "stdio_impl.h"
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
FILE *fopen(const char *restrict filename, const char *restrict mode)
{
diff --git a/src/stdio/fputs.c b/src/stdio/fputs.c
index b41bc8c7..1112b192 100644
--- a/src/stdio/fputs.c
+++ b/src/stdio/fputs.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <string.h>
int fputs(const char *restrict s, FILE *restrict f)
{
diff --git a/src/stdio/fputwc.c b/src/stdio/fputwc.c
index 45ea8c23..7b621dd2 100644
--- a/src/stdio/fputwc.c
+++ b/src/stdio/fputwc.c
@@ -1,4 +1,7 @@
#include "stdio_impl.h"
+#include <wchar.h>
+#include <limits.h>
+#include <ctype.h>
wint_t __fputwc_unlocked(wchar_t c, FILE *f)
{
diff --git a/src/stdio/fputws.c b/src/stdio/fputws.c
index 0b593c08..5723cbcd 100644
--- a/src/stdio/fputws.c
+++ b/src/stdio/fputws.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <wchar.h>
int fputws(const wchar_t *restrict ws, FILE *restrict f)
{
diff --git a/src/stdio/fread.c b/src/stdio/fread.c
index 3f31af8a..c461256c 100644
--- a/src/stdio/fread.c
+++ b/src/stdio/fread.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <string.h>
#define MIN(a,b) ((a)<(b) ? (a) : (b))
diff --git a/src/stdio/freopen.c b/src/stdio/freopen.c
index 7ae116d8..6c1b575f 100644
--- a/src/stdio/freopen.c
+++ b/src/stdio/freopen.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <fcntl.h>
/* The basic idea of this implementation is to open a new FILE,
* hack the necessary parts of the new FILE into the old one, then
diff --git a/src/stdio/ftell.c b/src/stdio/ftell.c
index 3904a1d8..82371e37 100644
--- a/src/stdio/ftell.c
+++ b/src/stdio/ftell.c
@@ -1,4 +1,6 @@
#include "stdio_impl.h"
+#include <limits.h>
+#include <errno.h>
off_t __ftello_unlocked(FILE *f)
{
diff --git a/src/stdio/ftrylockfile.c b/src/stdio/ftrylockfile.c
index 725c4c3e..eef4e250 100644
--- a/src/stdio/ftrylockfile.c
+++ b/src/stdio/ftrylockfile.c
@@ -1,5 +1,6 @@
#include "stdio_impl.h"
#include "pthread_impl.h"
+#include <limits.h>
int ftrylockfile(FILE *f)
{
diff --git a/src/stdio/fwrite.c b/src/stdio/fwrite.c
index 8027b306..d5f6542d 100644
--- a/src/stdio/fwrite.c
+++ b/src/stdio/fwrite.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <string.h>
size_t __fwritex(const unsigned char *restrict s, size_t l, FILE *restrict f)
{
diff --git a/src/stdio/getdelim.c b/src/stdio/getdelim.c
index 5015c3a6..26093a6c 100644
--- a/src/stdio/getdelim.c
+++ b/src/stdio/getdelim.c
@@ -1,4 +1,7 @@
#include "stdio_impl.h"
+#include <string.h>
+#include <inttypes.h>
+#include <errno.h>
#define MIN(a,b) ((a)<(b) ? (a) : (b))
diff --git a/src/stdio/gets.c b/src/stdio/gets.c
index 24319eb2..6c4645e5 100644
--- a/src/stdio/gets.c
+++ b/src/stdio/gets.c
@@ -1,4 +1,6 @@
#include "stdio_impl.h"
+#include <limits.h>
+#include <string.h>
char *gets(char *s)
{
diff --git a/src/stdio/getwc.c b/src/stdio/getwc.c
index a2818bc4..a5008f0e 100644
--- a/src/stdio/getwc.c
+++ b/src/stdio/getwc.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <wchar.h>
wint_t getwc(FILE *f)
{
diff --git a/src/stdio/getwchar.c b/src/stdio/getwchar.c
index 2295bd40..bd89e0ec 100644
--- a/src/stdio/getwchar.c
+++ b/src/stdio/getwchar.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <wchar.h>
wint_t getwchar(void)
{
diff --git a/src/stdio/open_memstream.c b/src/stdio/open_memstream.c
index 687e818d..9eafdfba 100644
--- a/src/stdio/open_memstream.c
+++ b/src/stdio/open_memstream.c
@@ -1,4 +1,7 @@
#include "stdio_impl.h"
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
struct cookie {
char **bufp;
@@ -74,12 +77,13 @@ FILE *open_memstream(char **bufp, size_t *sizep)
f->seek = ms_seek;
f->close = ms_close;
- if (!libc.threaded) {
- f->lock = -1;
- f->next = libc.ofl_head;
- if (libc.ofl_head) libc.ofl_head->prev = f;
- libc.ofl_head = f;
- }
+ if (!libc.threaded) f->lock = -1;
+
+ OFLLOCK();
+ f->next = libc.ofl_head;
+ if (libc.ofl_head) libc.ofl_head->prev = f;
+ libc.ofl_head = f;
+ OFLUNLOCK();
return f;
}
diff --git a/src/stdio/open_wmemstream.c b/src/stdio/open_wmemstream.c
index a830b143..35370309 100644
--- a/src/stdio/open_wmemstream.c
+++ b/src/stdio/open_wmemstream.c
@@ -1,4 +1,8 @@
#include "stdio_impl.h"
+#include <wchar.h>
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
struct cookie {
wchar_t **bufp;
@@ -75,12 +79,13 @@ FILE *open_wmemstream(wchar_t **bufp, size_t *sizep)
f->seek = wms_seek;
f->close = wms_close;
- if (!libc.threaded) {
- f->lock = -1;
- f->next = libc.ofl_head;
- if (libc.ofl_head) libc.ofl_head->prev = f;
- libc.ofl_head = f;
- }
+ if (!libc.threaded) f->lock = -1;
+
+ OFLLOCK();
+ f->next = libc.ofl_head;
+ if (libc.ofl_head) libc.ofl_head->prev = f;
+ libc.ofl_head = f;
+ OFLUNLOCK();
return f;
}
diff --git a/src/stdio/pclose.c b/src/stdio/pclose.c
index 7fb76ed4..080a4262 100644
--- a/src/stdio/pclose.c
+++ b/src/stdio/pclose.c
@@ -1,5 +1,6 @@
#include "stdio_impl.h"
-#include "syscall.h"
+#include <errno.h>
+#include <unistd.h>
int pclose(FILE *f)
{
diff --git a/src/stdio/popen.c b/src/stdio/popen.c
index ca3cdf9d..ed20f5a1 100644
--- a/src/stdio/popen.c
+++ b/src/stdio/popen.c
@@ -1,4 +1,7 @@
#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
#include "stdio_impl.h"
#include "pthread_impl.h"
#include "syscall.h"
diff --git a/src/stdio/putwc.c b/src/stdio/putwc.c
index 80b54a47..4bb74733 100644
--- a/src/stdio/putwc.c
+++ b/src/stdio/putwc.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <wchar.h>
wint_t putwc(wchar_t c, FILE *f)
{
diff --git a/src/stdio/putwchar.c b/src/stdio/putwchar.c
index 3aacc1cf..b249c4ac 100644
--- a/src/stdio/putwchar.c
+++ b/src/stdio/putwchar.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <wchar.h>
wint_t putwchar(wchar_t c)
{
diff --git a/src/stdio/ungetwc.c b/src/stdio/ungetwc.c
index 5282fee1..8cc85a6b 100644
--- a/src/stdio/ungetwc.c
+++ b/src/stdio/ungetwc.c
@@ -1,4 +1,8 @@
#include "stdio_impl.h"
+#include <wchar.h>
+#include <limits.h>
+#include <ctype.h>
+#include <string.h>
wint_t ungetwc(wint_t c, FILE *f)
{
diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
index 4a2752b2..1e7e6a47 100644
--- a/src/stdio/vfprintf.c
+++ b/src/stdio/vfprintf.c
@@ -1,4 +1,13 @@
#include "stdio_impl.h"
+#include <errno.h>
+#include <ctype.h>
+#include <limits.h>
+#include <string.h>
+#include <stdarg.h>
+#include <wchar.h>
+#include <inttypes.h>
+#include <math.h>
+#include <float.h>
/* Some useful macros */
diff --git a/src/stdio/vfscanf.c b/src/stdio/vfscanf.c
index 54d08495..fe071e95 100644
--- a/src/stdio/vfscanf.c
+++ b/src/stdio/vfscanf.c
@@ -1,4 +1,3 @@
-#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <ctype.h>
@@ -9,6 +8,7 @@
#include <errno.h>
#include <math.h>
#include <float.h>
+#include <inttypes.h>
#include "stdio_impl.h"
#include "shgetc.h"
diff --git a/src/stdio/vfwprintf.c b/src/stdio/vfwprintf.c
index a42ba195..eb079312 100644
--- a/src/stdio/vfwprintf.c
+++ b/src/stdio/vfwprintf.c
@@ -1,4 +1,11 @@
#include "stdio_impl.h"
+#include <errno.h>
+#include <ctype.h>
+#include <limits.h>
+#include <string.h>
+#include <stdarg.h>
+#include <wchar.h>
+#include <inttypes.h>
/* Convenient bit representation for modifier flags, which all fall
* within 31 codepoints of the space character. */
diff --git a/src/stdio/vsnprintf.c b/src/stdio/vsnprintf.c
index 6f19b028..be2c44eb 100644
--- a/src/stdio/vsnprintf.c
+++ b/src/stdio/vsnprintf.c
@@ -1,4 +1,8 @@
#include "stdio_impl.h"
+#include <limits.h>
+#include <string.h>
+#include <errno.h>
+#include <stdint.h>
static size_t sn_write(FILE *f, const unsigned char *s, size_t l)
{
diff --git a/src/stdio/vswprintf.c b/src/stdio/vswprintf.c
index f3d4fec1..7d237bae 100644
--- a/src/stdio/vswprintf.c
+++ b/src/stdio/vswprintf.c
@@ -1,4 +1,9 @@
#include "stdio_impl.h"
+#include <limits.h>
+#include <string.h>
+#include <errno.h>
+#include <stdint.h>
+#include <wchar.h>
struct cookie {
wchar_t *ws;
diff --git a/src/stdio/vswscanf.c b/src/stdio/vswscanf.c
index a205200a..7a2f7c7a 100644
--- a/src/stdio/vswscanf.c
+++ b/src/stdio/vswscanf.c
@@ -1,4 +1,5 @@
#include "stdio_impl.h"
+#include <wchar.h>
static size_t wstring_read(FILE *f, unsigned char *buf, size_t len)
{
diff --git a/src/stdlib/strtol.c b/src/stdlib/strtol.c
index 23a2f3b6..7ee88794 100644
--- a/src/stdlib/strtol.c
+++ b/src/stdlib/strtol.c
@@ -1,6 +1,9 @@
#include "stdio_impl.h"
#include "intscan.h"
#include "shgetc.h"
+#include <inttypes.h>
+#include <limits.h>
+#include <ctype.h>
static unsigned long long strtox(const char *s, char **p, int base, unsigned long long lim)
{
diff --git a/src/stdlib/wcstod.c b/src/stdlib/wcstod.c
index 03670b0b..83f308d3 100644
--- a/src/stdlib/wcstod.c
+++ b/src/stdlib/wcstod.c
@@ -1,6 +1,7 @@
#include "shgetc.h"
#include "floatscan.h"
#include "stdio_impl.h"
+#include <wctype.h>
/* This read function heavily cheats. It knows:
* (1) len will always be 1
diff --git a/src/stdlib/wcstol.c b/src/stdlib/wcstol.c
index 3d7c97da..4443f577 100644
--- a/src/stdlib/wcstol.c
+++ b/src/stdlib/wcstol.c
@@ -1,6 +1,10 @@
#include "stdio_impl.h"
#include "intscan.h"
#include "shgetc.h"
+#include <inttypes.h>
+#include <limits.h>
+#include <wctype.h>
+#include <wchar.h>
/* This read function heavily cheats. It knows:
* (1) len will always be 1
diff --git a/src/thread/__wake.c b/src/thread/__wake.c
index 8fd0599c..d8bf70f7 100644
--- a/src/thread/__wake.c
+++ b/src/thread/__wake.c
@@ -1,4 +1,5 @@
#include "pthread_impl.h"
+#include <limits.h>
void __wake(volatile int *addr, int cnt, int priv)
{
diff --git a/src/thread/pthread_attr_get.c b/src/thread/pthread_attr_get.c
new file mode 100644
index 00000000..f81103d8
--- /dev/null
+++ b/src/thread/pthread_attr_get.c
@@ -0,0 +1,93 @@
+#include "pthread_impl.h"
+
+int pthread_attr_getdetachstate(const pthread_attr_t *a, int *state)
+{
+ *state = a->_a_detach;
+ return 0;
+}
+int pthread_attr_getguardsize(const pthread_attr_t *restrict a, size_t *restrict size)
+{
+ *size = a->_a_guardsize + DEFAULT_GUARD_SIZE;
+ return 0;
+}
+
+int pthread_attr_getinheritsched(const pthread_attr_t *a, int *inherit)
+{
+ *inherit = a->_a_sched;
+ return 0;
+}
+
+int pthread_attr_getschedparam(const pthread_attr_t *restrict a, struct sched_param *restrict param)
+{
+ param->sched_priority = a->_a_prio;
+ return 0;
+}
+
+int pthread_attr_getschedpolicy(const pthread_attr_t *a, int *policy)
+{
+ *policy = a->_a_policy;
+ return 0;
+}
+
+int pthread_attr_getscope(const pthread_attr_t *restrict a, int *restrict scope)
+{
+ *scope = PTHREAD_SCOPE_SYSTEM;
+ return 0;
+}
+
+int pthread_attr_getstack(const pthread_attr_t *restrict a, void **restrict addr, size_t *restrict size)
+{
+ if (!a->_a_stackaddr)
+ return EINVAL;
+ *size = a->_a_stacksize + DEFAULT_STACK_SIZE;
+ *addr = (void *)(a->_a_stackaddr - *size);
+ return 0;
+}
+
+int pthread_attr_getstacksize(const pthread_attr_t *restrict a, size_t *restrict size)
+{
+ *size = a->_a_stacksize + DEFAULT_STACK_SIZE;
+ return 0;
+}
+
+int pthread_barrierattr_getpshared(const pthread_barrierattr_t *restrict a, int *restrict pshared)
+{
+ *pshared = !!*a;
+ return 0;
+}
+
+int pthread_condattr_getclock(const pthread_condattr_t *restrict a, clockid_t *restrict clk)
+{
+ *clk = *a & 0x7fffffff;
+ return 0;
+}
+
+int pthread_condattr_getpshared(const pthread_condattr_t *restrict a, int *restrict pshared)
+{
+ *pshared = *a>>31;
+ return 0;
+}
+
+int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict a, int *restrict pshared)
+{
+ *pshared = *a>>31;
+ return 0;
+}
+
+int pthread_mutexattr_getrobust(const pthread_mutexattr_t *restrict a, int *restrict robust)
+{
+ *robust = *a / 4U % 2;
+ return 0;
+}
+
+int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict a, int *restrict type)
+{
+ *type = *a & 3;
+ return 0;
+}
+
+int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict a, int *restrict pshared)
+{
+ *pshared = *(int *)a;
+ return 0;
+}
diff --git a/src/thread/pthread_attr_getdetachstate.c b/src/thread/pthread_attr_getdetachstate.c
deleted file mode 100644
index 47c4c023..00000000
--- a/src/thread/pthread_attr_getdetachstate.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_attr_getdetachstate(const pthread_attr_t *a, int *state)
-{
- *state = a->_a_detach;
- return 0;
-}
diff --git a/src/thread/pthread_attr_getguardsize.c b/src/thread/pthread_attr_getguardsize.c
deleted file mode 100644
index 93ba05dd..00000000
--- a/src/thread/pthread_attr_getguardsize.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_attr_getguardsize(const pthread_attr_t *restrict a, size_t *restrict size)
-{
- *size = a->_a_guardsize + DEFAULT_GUARD_SIZE;
- return 0;
-}
diff --git a/src/thread/pthread_attr_getschedparam.c b/src/thread/pthread_attr_getschedparam.c
deleted file mode 100644
index 5806bdf1..00000000
--- a/src/thread/pthread_attr_getschedparam.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_attr_getschedparam(const pthread_attr_t *restrict a, struct sched_param *restrict param)
-{
- param->sched_priority = 0;
- return 0;
-}
diff --git a/src/thread/pthread_attr_getscope.c b/src/thread/pthread_attr_getscope.c
deleted file mode 100644
index c0167b6a..00000000
--- a/src/thread/pthread_attr_getscope.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_attr_getscope(const pthread_attr_t *restrict a, int *restrict scope)
-{
- return 0;
-}
diff --git a/src/thread/pthread_attr_getstack.c b/src/thread/pthread_attr_getstack.c
deleted file mode 100644
index 70adbb03..00000000
--- a/src/thread/pthread_attr_getstack.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_attr_getstack(const pthread_attr_t *restrict a, void **restrict addr, size_t *restrict size)
-{
- if (!a->_a_stackaddr)
- return EINVAL;
- *size = a->_a_stacksize + DEFAULT_STACK_SIZE;
- *addr = (void *)(a->_a_stackaddr - *size);
- return 0;
-}
diff --git a/src/thread/pthread_attr_getstacksize.c b/src/thread/pthread_attr_getstacksize.c
deleted file mode 100644
index f69cc1e6..00000000
--- a/src/thread/pthread_attr_getstacksize.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_attr_getstacksize(const pthread_attr_t *restrict a, size_t *restrict size)
-{
- *size = a->_a_stacksize + DEFAULT_STACK_SIZE;
- return 0;
-}
diff --git a/src/thread/pthread_attr_init.c b/src/thread/pthread_attr_init.c
index d91bf157..66934889 100644
--- a/src/thread/pthread_attr_init.c
+++ b/src/thread/pthread_attr_init.c
@@ -1,7 +1,8 @@
#include "pthread_impl.h"
+#include <string.h>
int pthread_attr_init(pthread_attr_t *a)
{
- memset(a, 0, sizeof *a);
+ *a = (pthread_attr_t){0};
return 0;
}
diff --git a/src/thread/pthread_attr_setinheritsched.c b/src/thread/pthread_attr_setinheritsched.c
new file mode 100644
index 00000000..c91d8f83
--- /dev/null
+++ b/src/thread/pthread_attr_setinheritsched.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int pthread_attr_setinheritsched(pthread_attr_t *a, int inherit)
+{
+ if (inherit > 1U) return EINVAL;
+ a->_a_sched = inherit;
+ return 0;
+}
diff --git a/src/thread/pthread_attr_setschedparam.c b/src/thread/pthread_attr_setschedparam.c
index 77ce9c98..d4c1204f 100644
--- a/src/thread/pthread_attr_setschedparam.c
+++ b/src/thread/pthread_attr_setschedparam.c
@@ -2,6 +2,6 @@
int pthread_attr_setschedparam(pthread_attr_t *restrict a, const struct sched_param *restrict param)
{
- if (param->sched_priority) return ENOTSUP;
+ a->_a_prio = param->sched_priority;
return 0;
}
diff --git a/src/thread/pthread_attr_setschedpolicy.c b/src/thread/pthread_attr_setschedpolicy.c
new file mode 100644
index 00000000..bb71f393
--- /dev/null
+++ b/src/thread/pthread_attr_setschedpolicy.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+
+int pthread_attr_setschedpolicy(pthread_attr_t *a, int policy)
+{
+ a->_a_policy = policy;
+ return 0;
+}
diff --git a/src/thread/pthread_attr_setscope.c b/src/thread/pthread_attr_setscope.c
index d56ee391..46b520c0 100644
--- a/src/thread/pthread_attr_setscope.c
+++ b/src/thread/pthread_attr_setscope.c
@@ -2,6 +2,12 @@
int pthread_attr_setscope(pthread_attr_t *a, int scope)
{
- if (scope > 1U) return EINVAL;
- return 0;
+ switch (scope) {
+ case PTHREAD_SCOPE_SYSTEM:
+ return 0;
+ case PTHREAD_SCOPE_PROCESS:
+ return ENOTSUP;
+ default:
+ return EINVAL;
+ }
}
diff --git a/src/thread/pthread_barrierattr_getpshared.c b/src/thread/pthread_barrierattr_getpshared.c
deleted file mode 100644
index df337c29..00000000
--- a/src/thread/pthread_barrierattr_getpshared.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_barrierattr_getpshared(const pthread_barrierattr_t *restrict a, int *restrict pshared)
-{
- *pshared = !!*a;
- return 0;
-}
diff --git a/src/thread/pthread_barrierattr_init.c b/src/thread/pthread_barrierattr_init.c
index f2698272..fa742bb7 100644
--- a/src/thread/pthread_barrierattr_init.c
+++ b/src/thread/pthread_barrierattr_init.c
@@ -2,6 +2,6 @@
int pthread_barrierattr_init(pthread_barrierattr_t *a)
{
- memset(a, 0, sizeof *a);
+ *a = (pthread_barrierattr_t){0};
return 0;
}
diff --git a/src/thread/pthread_cond_init.c b/src/thread/pthread_cond_init.c
index 2eac30f1..71489bca 100644
--- a/src/thread/pthread_cond_init.c
+++ b/src/thread/pthread_cond_init.c
@@ -2,7 +2,7 @@
int pthread_cond_init(pthread_cond_t *restrict c, const pthread_condattr_t *restrict a)
{
- memset(c, 0, sizeof *c);
+ *c = (pthread_cond_t){0};
if (a) {
c->_c_clock = *a & 0x7fffffff;
if (*a>>31) c->_c_mutex = (void *)-1;
diff --git a/src/thread/pthread_condattr_getclock.c b/src/thread/pthread_condattr_getclock.c
deleted file mode 100644
index d2933843..00000000
--- a/src/thread/pthread_condattr_getclock.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_condattr_getclock(const pthread_condattr_t *restrict a, clockid_t *restrict clk)
-{
- *clk = *a & 0x7fffffff;
- return 0;
-}
diff --git a/src/thread/pthread_condattr_getpshared.c b/src/thread/pthread_condattr_getpshared.c
deleted file mode 100644
index 4991e495..00000000
--- a/src/thread/pthread_condattr_getpshared.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_condattr_getpshared(const pthread_condattr_t *restrict a, int *restrict pshared)
-{
- *pshared = *a>>31;
- return 0;
-}
diff --git a/src/thread/pthread_condattr_init.c b/src/thread/pthread_condattr_init.c
index 6d09ac1e..a41741b4 100644
--- a/src/thread/pthread_condattr_init.c
+++ b/src/thread/pthread_condattr_init.c
@@ -2,6 +2,6 @@
int pthread_condattr_init(pthread_condattr_t *a)
{
- memset(a, 0, sizeof *a);
+ *a = (pthread_condattr_t){0};
return 0;
}
diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c
index e67616e7..a65e88e1 100644
--- a/src/thread/pthread_create.c
+++ b/src/thread/pthread_create.c
@@ -1,5 +1,6 @@
#include "pthread_impl.h"
#include "stdio_impl.h"
+#include <sys/mman.h>
static void dummy_0()
{
@@ -61,6 +62,15 @@ void __do_cleanup_pop(struct __ptcb *cb)
static int start(void *p)
{
pthread_t self = p;
+ if (self->startlock[0]) {
+ __wait(self->startlock, 0, 1, 1);
+ if (self->startlock[0]) {
+ self->detached = 2;
+ pthread_exit(0);
+ }
+ __syscall(SYS_rt_sigprocmask, SIG_SETMASK,
+ self->sigmask, 0, __SYSCALL_SSLEN);
+ }
if (self->unblock_cancel)
__syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
SIGPT_SET, 0, __SYSCALL_SSLEN);
@@ -94,6 +104,7 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attr,
struct pthread *self = pthread_self(), *new;
unsigned char *map, *stack, *tsd;
unsigned flags = 0x7d8f00;
+ int do_sched = 0;
if (!self) return ENOSYS;
if (!libc.threaded) {
@@ -143,6 +154,11 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attr,
new->detached = 1;
flags -= 0x200000;
}
+ if (attr && attr->_a_sched) {
+ do_sched = new->startlock[0] = 1;
+ __syscall(SYS_rt_sigprocmask, SIG_BLOCK,
+ SIGALL_SET, self->sigmask, __SYSCALL_SSLEN);
+ }
new->unblock_cancel = self->cancel;
new->canary = self->canary;
@@ -151,11 +167,25 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attr,
__release_ptc();
+ if (do_sched) {
+ __syscall(SYS_rt_sigprocmask, SIG_SETMASK,
+ new->sigmask, 0, __SYSCALL_SSLEN);
+ }
+
if (ret < 0) {
a_dec(&libc.threads_minus_1);
munmap(map, size);
return EAGAIN;
}
+
+ if (do_sched) {
+ ret = __syscall(SYS_sched_setscheduler, new->tid,
+ attr->_a_policy, &attr->_a_prio);
+ a_store(new->startlock, ret<0 ? 2 : 0);
+ __wake(new->startlock, 1, 1);
+ if (ret < 0) return -ret;
+ }
+
*res = new;
return 0;
}
diff --git a/src/thread/pthread_getschedparam.c b/src/thread/pthread_getschedparam.c
new file mode 100644
index 00000000..7b6a95f1
--- /dev/null
+++ b/src/thread/pthread_getschedparam.c
@@ -0,0 +1,17 @@
+#include "pthread_impl.h"
+
+int pthread_getschedparam(pthread_t t, int *restrict policy, struct sched_param *restrict param)
+{
+ int r;
+ __lock(t->killlock);
+ if (t->dead) {
+ r = ESRCH;
+ } else {
+ r = -__syscall(SYS_sched_getparam, t->tid, &param);
+ if (!r) {
+ *policy = __syscall(SYS_sched_getscheduler, t->tid);
+ }
+ }
+ __unlock(t->killlock);
+ return r;
+}
diff --git a/src/thread/pthread_join.c b/src/thread/pthread_join.c
index 86191f25..719c91ca 100644
--- a/src/thread/pthread_join.c
+++ b/src/thread/pthread_join.c
@@ -1,4 +1,5 @@
#include "pthread_impl.h"
+#include <sys/mman.h>
static void dummy(void *p)
{
diff --git a/src/thread/pthread_mutex_init.c b/src/thread/pthread_mutex_init.c
index fb689271..a7ba39ba 100644
--- a/src/thread/pthread_mutex_init.c
+++ b/src/thread/pthread_mutex_init.c
@@ -2,7 +2,7 @@
int pthread_mutex_init(pthread_mutex_t *restrict m, const pthread_mutexattr_t *restrict a)
{
- memset(m, 0, sizeof *m);
+ *m = (pthread_mutex_t){0};
if (a) m->_m_type = *a & 7;
return 0;
}
diff --git a/src/thread/pthread_mutexattr_getpshared.c b/src/thread/pthread_mutexattr_getpshared.c
deleted file mode 100644
index e7340b1a..00000000
--- a/src/thread/pthread_mutexattr_getpshared.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict a, int *restrict pshared)
-{
- *pshared = *a>>31;
- return 0;
-}
diff --git a/src/thread/pthread_mutexattr_getrobust.c b/src/thread/pthread_mutexattr_getrobust.c
deleted file mode 100644
index 4d176f20..00000000
--- a/src/thread/pthread_mutexattr_getrobust.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_mutexattr_getrobust(const pthread_mutexattr_t *restrict a, int *restrict robust)
-{
- *robust = *a / 4U % 2;
- return 0;
-}
diff --git a/src/thread/pthread_mutexattr_gettype.c b/src/thread/pthread_mutexattr_gettype.c
deleted file mode 100644
index 7688b068..00000000
--- a/src/thread/pthread_mutexattr_gettype.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict a, int *restrict type)
-{
- *type = *a & 3;
- return 0;
-}
diff --git a/src/thread/pthread_mutexattr_init.c b/src/thread/pthread_mutexattr_init.c
index ea631069..0b72c1ba 100644
--- a/src/thread/pthread_mutexattr_init.c
+++ b/src/thread/pthread_mutexattr_init.c
@@ -2,6 +2,6 @@
int pthread_mutexattr_init(pthread_mutexattr_t *a)
{
- memset(a, 0, sizeof *a);
+ *a = (pthread_mutexattr_t){0};
return 0;
}
diff --git a/src/thread/pthread_rwlock_init.c b/src/thread/pthread_rwlock_init.c
index 29003bc6..82df52e2 100644
--- a/src/thread/pthread_rwlock_init.c
+++ b/src/thread/pthread_rwlock_init.c
@@ -2,7 +2,7 @@
int pthread_rwlock_init(pthread_rwlock_t *restrict rw, const pthread_rwlockattr_t *restrict a)
{
- memset(rw, 0, sizeof *rw);
+ *rw = (pthread_rwlock_t){0};
if (a) {
}
return 0;
diff --git a/src/thread/pthread_rwlockattr_getpshared.c b/src/thread/pthread_rwlockattr_getpshared.c
deleted file mode 100644
index 02fd8c80..00000000
--- a/src/thread/pthread_rwlockattr_getpshared.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "pthread_impl.h"
-
-int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict a, int *restrict pshared)
-{
- *pshared = *(int *)a;
- return 0;
-}
diff --git a/src/thread/pthread_rwlockattr_init.c b/src/thread/pthread_rwlockattr_init.c
index e0893d67..e7420694 100644
--- a/src/thread/pthread_rwlockattr_init.c
+++ b/src/thread/pthread_rwlockattr_init.c
@@ -2,6 +2,6 @@
int pthread_rwlockattr_init(pthread_rwlockattr_t *a)
{
- memset(a, 0, sizeof *a);
+ *a = (pthread_rwlockattr_t){0};
return 0;
}
diff --git a/src/thread/pthread_setschedparam.c b/src/thread/pthread_setschedparam.c
new file mode 100644
index 00000000..8e8b5a19
--- /dev/null
+++ b/src/thread/pthread_setschedparam.c
@@ -0,0 +1,10 @@
+#include "pthread_impl.h"
+
+int pthread_setschedparam(pthread_t t, int policy, const struct sched_param *param)
+{
+ int r;
+ __lock(t->killlock);
+ r = t->dead ? ESRCH : -__syscall(SYS_sched_setscheduler, t->tid, policy, &param);
+ __unlock(t->killlock);
+ return r;
+}
diff --git a/src/thread/pthread_setschedprio.c b/src/thread/pthread_setschedprio.c
new file mode 100644
index 00000000..e0bdc03b
--- /dev/null
+++ b/src/thread/pthread_setschedprio.c
@@ -0,0 +1,10 @@
+#include "pthread_impl.h"
+
+int pthread_setschedprio(pthread_t t, int prio)
+{
+ int r;
+ __lock(t->killlock);
+ r = t->dead ? ESRCH : -__syscall(SYS_sched_setparam, t->tid, &prio);
+ __unlock(t->killlock);
+ return r;
+}
diff --git a/src/thread/synccall.c b/src/thread/synccall.c
index 2b7eac25..dc59863f 100644
--- a/src/thread/synccall.c
+++ b/src/thread/synccall.c
@@ -1,5 +1,6 @@
#include "pthread_impl.h"
#include <semaphore.h>
+#include <string.h>
static struct chain {
struct chain *next;
diff --git a/src/time/timer_create.c b/src/time/timer_create.c
index 560f1a84..60a18c71 100644
--- a/src/time/timer_create.c
+++ b/src/time/timer_create.c
@@ -1,4 +1,5 @@
#include <time.h>
+#include <setjmp.h>
#include "pthread_impl.h"
struct ksigevent {