clean up handling of thread/nothread mode, locking
This commit is contained in:
parent
eb0e8fa0b1
commit
9080cc153c
8 changed files with 16 additions and 27 deletions
|
|
@ -17,7 +17,7 @@ long (__syscall_cp)(long nr, long u, long v, long w, long x, long y, long z)
|
|||
uintptr_t old_sp, old_ip;
|
||||
long r;
|
||||
|
||||
if (!libc.lock || (self = __pthread_self())->canceldisable)
|
||||
if (!libc.threaded || (self = __pthread_self())->canceldisable)
|
||||
return __syscall(nr, u, v, w, x, y, z);
|
||||
|
||||
old_sp = self->cp_sp;
|
||||
|
|
|
|||
|
|
@ -44,18 +44,6 @@ void __pthread_unwind_next(struct __ptcb *cb)
|
|||
__syscall(SYS_exit, 0);
|
||||
}
|
||||
|
||||
static void init_threads()
|
||||
{
|
||||
sigset_t set;
|
||||
libc.lock = __lock;
|
||||
libc.lockfile = __lockfile;
|
||||
|
||||
sigemptyset(&set);
|
||||
sigaddset(&set, SIGSYSCALL);
|
||||
sigaddset(&set, SIGCANCEL);
|
||||
__libc_sigprocmask(SIG_UNBLOCK, &set, 0);
|
||||
}
|
||||
|
||||
static int start(void *p)
|
||||
{
|
||||
struct pthread *self = p;
|
||||
|
|
@ -79,7 +67,6 @@ weak_alias(dummy, __pthread_tsd_size);
|
|||
|
||||
int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(void *), void *arg)
|
||||
{
|
||||
static int init;
|
||||
int ret;
|
||||
size_t size, guard;
|
||||
struct pthread *self = pthread_self(), *new;
|
||||
|
|
@ -87,7 +74,14 @@ int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(vo
|
|||
const pthread_attr_t default_attr = { 0 };
|
||||
|
||||
if (!self) return ENOSYS;
|
||||
if (!init && ++init) init_threads();
|
||||
if (!libc.threaded) {
|
||||
sigset_t set;
|
||||
sigemptyset(&set);
|
||||
sigaddset(&set, SIGSYSCALL);
|
||||
sigaddset(&set, SIGCANCEL);
|
||||
__libc_sigprocmask(SIG_UNBLOCK, &set, 0);
|
||||
libc.threaded = 1;
|
||||
}
|
||||
|
||||
if (!attr) attr = &default_attr;
|
||||
guard = ROUND(attr->_a_guardsize + DEFAULT_GUARD_SIZE);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
int pthread_setcancelstate(int new, int *old)
|
||||
{
|
||||
if (new > 1U) return EINVAL;
|
||||
if (libc.lock) {
|
||||
if (libc.threaded) {
|
||||
struct pthread *self = __pthread_self();
|
||||
if (old) *old = self->canceldisable;
|
||||
self->canceldisable = new;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue