1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *  * Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 *  * Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in
12 *    the documentation and/or other materials provided with the
13 *    distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28#include <sys/types.h>
29#include <unistd.h>
30#include <signal.h>
31#include <stdint.h>
32#include <stdio.h>
33#include <stdlib.h>
34#include <errno.h>
35#include <sys/atomics.h>
36#include <bionic_tls.h>
37#include <sys/mman.h>
38#include <pthread.h>
39#include <time.h>
40#include "pthread_internal.h"
41#include "thread_private.h"
42#include <limits.h>
43#include <memory.h>
44#include <assert.h>
45#include <malloc.h>
46#include <bionic_futex.h>
47#include <bionic_atomic_inline.h>
48#include <sys/prctl.h>
49#include <sys/stat.h>
50#include <fcntl.h>
51#include <stdio.h>
52
53extern int  __pthread_clone(int (*fn)(void*), void *child_stack, int flags, void *arg);
54extern void _exit_with_stack_teardown(void * stackBase, int stackSize, int retCode);
55extern void _exit_thread(int  retCode);
56extern int  __set_errno(int);
57
58int  __futex_wake_ex(volatile void *ftx, int pshared, int val)
59{
60    return __futex_syscall3(ftx, pshared ? FUTEX_WAKE : FUTEX_WAKE_PRIVATE, val);
61}
62
63int  __futex_wait_ex(volatile void *ftx, int pshared, int val, const struct timespec *timeout)
64{
65    return __futex_syscall4(ftx, pshared ? FUTEX_WAIT : FUTEX_WAIT_PRIVATE, val, timeout);
66}
67
68#define  __likely(cond)    __builtin_expect(!!(cond), 1)
69#define  __unlikely(cond)  __builtin_expect(!!(cond), 0)
70
71void _thread_created_hook(pid_t thread_id) __attribute__((noinline));
72
73#define PTHREAD_ATTR_FLAG_DETACHED      0x00000001
74#define PTHREAD_ATTR_FLAG_USER_STACK    0x00000002
75
76#define DEFAULT_STACKSIZE (1024 * 1024)
77#define STACKBASE 0x10000000
78
79static uint8_t * gStackBase = (uint8_t *)STACKBASE;
80
81static pthread_mutex_t mmap_lock = PTHREAD_MUTEX_INITIALIZER;
82
83
84static const pthread_attr_t gDefaultPthreadAttr = {
85    .flags = 0,
86    .stack_base = NULL,
87    .stack_size = DEFAULT_STACKSIZE,
88    .guard_size = PAGE_SIZE,
89    .sched_policy = SCHED_NORMAL,
90    .sched_priority = 0
91};
92
93#define  INIT_THREADS  1
94
95static pthread_internal_t*  gThreadList = NULL;
96static pthread_mutex_t gThreadListLock = PTHREAD_MUTEX_INITIALIZER;
97static pthread_mutex_t gDebuggerNotificationLock = PTHREAD_MUTEX_INITIALIZER;
98
99
100/* we simply malloc/free the internal pthread_internal_t structures. we may
101 * want to use a different allocation scheme in the future, but this one should
102 * be largely enough
103 */
104static pthread_internal_t*
105_pthread_internal_alloc(void)
106{
107    pthread_internal_t*   thread;
108
109    thread = calloc( sizeof(*thread), 1 );
110    if (thread)
111        thread->intern = 1;
112
113    return thread;
114}
115
116static void
117_pthread_internal_free( pthread_internal_t*  thread )
118{
119    if (thread && thread->intern) {
120        thread->intern = 0;  /* just in case */
121        free (thread);
122    }
123}
124
125
126static void
127_pthread_internal_remove_locked( pthread_internal_t*  thread )
128{
129    thread->next->pref = thread->pref;
130    thread->pref[0]    = thread->next;
131}
132
133static void
134_pthread_internal_remove( pthread_internal_t*  thread )
135{
136    pthread_mutex_lock(&gThreadListLock);
137    _pthread_internal_remove_locked(thread);
138    pthread_mutex_unlock(&gThreadListLock);
139}
140
141static void
142_pthread_internal_add( pthread_internal_t*  thread )
143{
144    pthread_mutex_lock(&gThreadListLock);
145    thread->pref = &gThreadList;
146    thread->next = thread->pref[0];
147    if (thread->next)
148        thread->next->pref = &thread->next;
149    thread->pref[0] = thread;
150    pthread_mutex_unlock(&gThreadListLock);
151}
152
153pthread_internal_t*
154__get_thread(void)
155{
156    void**  tls = (void**)__get_tls();
157
158    return  (pthread_internal_t*) tls[TLS_SLOT_THREAD_ID];
159}
160
161
162void*
163__get_stack_base(int  *p_stack_size)
164{
165    pthread_internal_t*  thread = __get_thread();
166
167    *p_stack_size = thread->attr.stack_size;
168    return thread->attr.stack_base;
169}
170
171
172void  __init_tls(void**  tls, void*  thread)
173{
174    int  nn;
175
176    ((pthread_internal_t*)thread)->tls = tls;
177
178    // slot 0 must point to the tls area, this is required by the implementation
179    // of the x86 Linux kernel thread-local-storage
180    tls[TLS_SLOT_SELF]      = (void*)tls;
181    tls[TLS_SLOT_THREAD_ID] = thread;
182    for (nn = TLS_SLOT_ERRNO; nn < BIONIC_TLS_SLOTS; nn++)
183       tls[nn] = 0;
184
185    __set_tls( (void*)tls );
186}
187
188
189/*
190 * This trampoline is called from the assembly clone() function
191 */
192void __thread_entry(int (*func)(void*), void *arg, void **tls)
193{
194    int retValue;
195    pthread_internal_t * thrInfo;
196
197    // Wait for our creating thread to release us. This lets it have time to
198    // notify gdb about this thread before it starts doing anything.
199    pthread_mutex_t * start_mutex = (pthread_mutex_t *)&tls[TLS_SLOT_SELF];
200    pthread_mutex_lock(start_mutex);
201    pthread_mutex_destroy(start_mutex);
202
203    thrInfo = (pthread_internal_t *) tls[TLS_SLOT_THREAD_ID];
204
205    __init_tls( tls, thrInfo );
206
207    pthread_exit( (void*)func(arg) );
208}
209
210void _init_thread(pthread_internal_t * thread, pid_t kernel_id, pthread_attr_t * attr, void * stack_base)
211{
212    if (attr == NULL) {
213        thread->attr = gDefaultPthreadAttr;
214    } else {
215        thread->attr = *attr;
216    }
217    thread->attr.stack_base = stack_base;
218    thread->kernel_id       = kernel_id;
219
220    // set the scheduling policy/priority of the thread
221    if (thread->attr.sched_policy != SCHED_NORMAL) {
222        struct sched_param param;
223        param.sched_priority = thread->attr.sched_priority;
224        sched_setscheduler(kernel_id, thread->attr.sched_policy, &param);
225    }
226
227    pthread_cond_init(&thread->join_cond, NULL);
228    thread->join_count = 0;
229
230    thread->cleanup_stack = NULL;
231
232    _pthread_internal_add(thread);
233}
234
235
236/* XXX stacks not reclaimed if thread spawn fails */
237/* XXX stacks address spaces should be reused if available again */
238
239static void *mkstack(size_t size, size_t guard_size)
240{
241    void * stack;
242
243    pthread_mutex_lock(&mmap_lock);
244
245    stack = mmap((void *)gStackBase, size,
246                 PROT_READ | PROT_WRITE,
247                 MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE,
248                 -1, 0);
249
250    if(stack == MAP_FAILED) {
251        stack = NULL;
252        goto done;
253    }
254
255    if(mprotect(stack, guard_size, PROT_NONE)){
256        munmap(stack, size);
257        stack = NULL;
258        goto done;
259    }
260
261done:
262    pthread_mutex_unlock(&mmap_lock);
263    return stack;
264}
265
266/*
267 * Create a new thread. The thread's stack is layed out like so:
268 *
269 * +---------------------------+
270 * |     pthread_internal_t    |
271 * +---------------------------+
272 * |                           |
273 * |          TLS area         |
274 * |                           |
275 * +---------------------------+
276 * |                           |
277 * .                           .
278 * .         stack area        .
279 * .                           .
280 * |                           |
281 * +---------------------------+
282 * |         guard page        |
283 * +---------------------------+
284 *
285 *  note that TLS[0] must be a pointer to itself, this is required
286 *  by the thread-local storage implementation of the x86 Linux
287 *  kernel, where the TLS pointer is read by reading fs:[0]
288 */
289int pthread_create(pthread_t *thread_out, pthread_attr_t const * attr,
290                   void *(*start_routine)(void *), void * arg)
291{
292    char*   stack;
293    void**  tls;
294    int tid;
295    pthread_mutex_t * start_mutex;
296    pthread_internal_t * thread;
297    int                  madestack = 0;
298    int     old_errno = errno;
299
300    /* this will inform the rest of the C library that at least one thread
301     * was created. this will enforce certain functions to acquire/release
302     * locks (e.g. atexit()) to protect shared global structures.
303     *
304     * this works because pthread_create() is not called by the C library
305     * initialization routine that sets up the main thread's data structures.
306     */
307    __isthreaded = 1;
308
309    thread = _pthread_internal_alloc();
310    if (thread == NULL)
311        return ENOMEM;
312
313    if (attr == NULL) {
314        attr = &gDefaultPthreadAttr;
315    }
316
317    // make sure the stack is PAGE_SIZE aligned
318    size_t stackSize = (attr->stack_size +
319                        (PAGE_SIZE-1)) & ~(PAGE_SIZE-1);
320
321    if (!attr->stack_base) {
322        stack = mkstack(stackSize, attr->guard_size);
323        if(stack == NULL) {
324            _pthread_internal_free(thread);
325            return ENOMEM;
326        }
327        madestack = 1;
328    } else {
329        stack = attr->stack_base;
330    }
331
332    // Make room for TLS
333    tls = (void**)(stack + stackSize - BIONIC_TLS_SLOTS*sizeof(void*));
334
335    // Create a mutex for the thread in TLS_SLOT_SELF to wait on once it starts so we can keep
336    // it from doing anything until after we notify the debugger about it
337    start_mutex = (pthread_mutex_t *) &tls[TLS_SLOT_SELF];
338    pthread_mutex_init(start_mutex, NULL);
339    pthread_mutex_lock(start_mutex);
340
341    tls[TLS_SLOT_THREAD_ID] = thread;
342
343    tid = __pthread_clone((int(*)(void*))start_routine, tls,
344                CLONE_FILES | CLONE_FS | CLONE_VM | CLONE_SIGHAND
345                | CLONE_THREAD | CLONE_SYSVSEM | CLONE_DETACHED,
346                arg);
347
348    if(tid < 0) {
349        int  result;
350        if (madestack)
351            munmap(stack, stackSize);
352        _pthread_internal_free(thread);
353        result = errno;
354        errno = old_errno;
355        return result;
356    }
357
358    _init_thread(thread, tid, (pthread_attr_t*)attr, stack);
359
360    if (!madestack)
361        thread->attr.flags |= PTHREAD_ATTR_FLAG_USER_STACK;
362
363    // Notify any debuggers about the new thread
364    pthread_mutex_lock(&gDebuggerNotificationLock);
365    _thread_created_hook(tid);
366    pthread_mutex_unlock(&gDebuggerNotificationLock);
367
368    // Let the thread do it's thing
369    pthread_mutex_unlock(start_mutex);
370
371    *thread_out = (pthread_t)thread;
372    return 0;
373}
374
375
376int pthread_attr_init(pthread_attr_t * attr)
377{
378    *attr = gDefaultPthreadAttr;
379    return 0;
380}
381
382int pthread_attr_destroy(pthread_attr_t * attr)
383{
384    memset(attr, 0x42, sizeof(pthread_attr_t));
385    return 0;
386}
387
388int pthread_attr_setdetachstate(pthread_attr_t * attr, int state)
389{
390    if (state == PTHREAD_CREATE_DETACHED) {
391        attr->flags |= PTHREAD_ATTR_FLAG_DETACHED;
392    } else if (state == PTHREAD_CREATE_JOINABLE) {
393        attr->flags &= ~PTHREAD_ATTR_FLAG_DETACHED;
394    } else {
395        return EINVAL;
396    }
397    return 0;
398}
399
400int pthread_attr_getdetachstate(pthread_attr_t const * attr, int * state)
401{
402    *state = (attr->flags & PTHREAD_ATTR_FLAG_DETACHED)
403           ? PTHREAD_CREATE_DETACHED
404           : PTHREAD_CREATE_JOINABLE;
405    return 0;
406}
407
408int pthread_attr_setschedpolicy(pthread_attr_t * attr, int policy)
409{
410    attr->sched_policy = policy;
411    return 0;
412}
413
414int pthread_attr_getschedpolicy(pthread_attr_t const * attr, int * policy)
415{
416    *policy = attr->sched_policy;
417    return 0;
418}
419
420int pthread_attr_setschedparam(pthread_attr_t * attr, struct sched_param const * param)
421{
422    attr->sched_priority = param->sched_priority;
423    return 0;
424}
425
426int pthread_attr_getschedparam(pthread_attr_t const * attr, struct sched_param * param)
427{
428    param->sched_priority = attr->sched_priority;
429    return 0;
430}
431
432int pthread_attr_setstacksize(pthread_attr_t * attr, size_t stack_size)
433{
434    if ((stack_size & (PAGE_SIZE - 1) || stack_size < PTHREAD_STACK_MIN)) {
435        return EINVAL;
436    }
437    attr->stack_size = stack_size;
438    return 0;
439}
440
441int pthread_attr_getstacksize(pthread_attr_t const * attr, size_t * stack_size)
442{
443    *stack_size = attr->stack_size;
444    return 0;
445}
446
447int pthread_attr_setstackaddr(pthread_attr_t * attr, void * stack_addr)
448{
449#if 1
450    // It's not clear if this is setting the top or bottom of the stack, so don't handle it for now.
451    return ENOSYS;
452#else
453    if ((uint32_t)stack_addr & (PAGE_SIZE - 1)) {
454        return EINVAL;
455    }
456    attr->stack_base = stack_addr;
457    return 0;
458#endif
459}
460
461int pthread_attr_getstackaddr(pthread_attr_t const * attr, void ** stack_addr)
462{
463    *stack_addr = (char*)attr->stack_base + attr->stack_size;
464    return 0;
465}
466
467int pthread_attr_setstack(pthread_attr_t * attr, void * stack_base, size_t stack_size)
468{
469    if ((stack_size & (PAGE_SIZE - 1) || stack_size < PTHREAD_STACK_MIN)) {
470        return EINVAL;
471    }
472    if ((uint32_t)stack_base & (PAGE_SIZE - 1)) {
473        return EINVAL;
474    }
475    attr->stack_base = stack_base;
476    attr->stack_size = stack_size;
477    return 0;
478}
479
480int pthread_attr_getstack(pthread_attr_t const * attr, void ** stack_base, size_t * stack_size)
481{
482    *stack_base = attr->stack_base;
483    *stack_size = attr->stack_size;
484    return 0;
485}
486
487int pthread_attr_setguardsize(pthread_attr_t * attr, size_t guard_size)
488{
489    if (guard_size & (PAGE_SIZE - 1) || guard_size < PAGE_SIZE) {
490        return EINVAL;
491    }
492
493    attr->guard_size = guard_size;
494    return 0;
495}
496
497int pthread_attr_getguardsize(pthread_attr_t const * attr, size_t * guard_size)
498{
499    *guard_size = attr->guard_size;
500    return 0;
501}
502
503int pthread_getattr_np(pthread_t thid, pthread_attr_t * attr)
504{
505    pthread_internal_t * thread = (pthread_internal_t *)thid;
506    *attr = thread->attr;
507    return 0;
508}
509
510int pthread_attr_setscope(pthread_attr_t *attr, int  scope)
511{
512    if (scope == PTHREAD_SCOPE_SYSTEM)
513        return 0;
514    if (scope == PTHREAD_SCOPE_PROCESS)
515        return ENOTSUP;
516
517    return EINVAL;
518}
519
520int pthread_attr_getscope(pthread_attr_t const *attr)
521{
522    return PTHREAD_SCOPE_SYSTEM;
523}
524
525
526/* CAVEAT: our implementation of pthread_cleanup_push/pop doesn't support C++ exceptions
527 *         and thread cancelation
528 */
529
530void __pthread_cleanup_push( __pthread_cleanup_t*      c,
531                             __pthread_cleanup_func_t  routine,
532                             void*                     arg )
533{
534    pthread_internal_t*  thread = __get_thread();
535
536    c->__cleanup_routine  = routine;
537    c->__cleanup_arg      = arg;
538    c->__cleanup_prev     = thread->cleanup_stack;
539    thread->cleanup_stack = c;
540}
541
542void __pthread_cleanup_pop( __pthread_cleanup_t*  c, int  execute )
543{
544    pthread_internal_t*  thread = __get_thread();
545
546    thread->cleanup_stack = c->__cleanup_prev;
547    if (execute)
548        c->__cleanup_routine(c->__cleanup_arg);
549}
550
551/* used by pthread_exit() to clean all TLS keys of the current thread */
552static void pthread_key_clean_all(void);
553
554void pthread_exit(void * retval)
555{
556    pthread_internal_t*  thread     = __get_thread();
557    void*                stack_base = thread->attr.stack_base;
558    int                  stack_size = thread->attr.stack_size;
559    int                  user_stack = (thread->attr.flags & PTHREAD_ATTR_FLAG_USER_STACK) != 0;
560
561    // call the cleanup handlers first
562    while (thread->cleanup_stack) {
563        __pthread_cleanup_t*  c = thread->cleanup_stack;
564        thread->cleanup_stack   = c->__cleanup_prev;
565        c->__cleanup_routine(c->__cleanup_arg);
566    }
567
568    // call the TLS destructors, it is important to do that before removing this
569    // thread from the global list. this will ensure that if someone else deletes
570    // a TLS key, the corresponding value will be set to NULL in this thread's TLS
571    // space (see pthread_key_delete)
572    pthread_key_clean_all();
573
574    // if the thread is detached, destroy the pthread_internal_t
575    // otherwise, keep it in memory and signal any joiners
576    if (thread->attr.flags & PTHREAD_ATTR_FLAG_DETACHED) {
577        _pthread_internal_remove(thread);
578        _pthread_internal_free(thread);
579    } else {
580       /* the join_count field is used to store the number of threads waiting for
581        * the termination of this thread with pthread_join(),
582        *
583        * if it is positive we need to signal the waiters, and we do not touch
584        * the count (it will be decremented by the waiters, the last one will
585        * also remove/free the thread structure
586        *
587        * if it is zero, we set the count value to -1 to indicate that the
588        * thread is in 'zombie' state: it has stopped executing, and its stack
589        * is gone (as well as its TLS area). when another thread calls pthread_join()
590        * on it, it will immediately free the thread and return.
591        */
592        pthread_mutex_lock(&gThreadListLock);
593        thread->return_value = retval;
594        if (thread->join_count > 0) {
595            pthread_cond_broadcast(&thread->join_cond);
596        } else {
597            thread->join_count = -1;  /* zombie thread */
598        }
599        pthread_mutex_unlock(&gThreadListLock);
600    }
601
602    // destroy the thread stack
603    if (user_stack)
604        _exit_thread((int)retval);
605    else
606        _exit_with_stack_teardown(stack_base, stack_size, (int)retval);
607}
608
609int pthread_join(pthread_t thid, void ** ret_val)
610{
611    pthread_internal_t*  thread = (pthread_internal_t*)thid;
612    int                  count;
613
614    // check that the thread still exists and is not detached
615    pthread_mutex_lock(&gThreadListLock);
616
617    for (thread = gThreadList; thread != NULL; thread = thread->next)
618        if (thread == (pthread_internal_t*)thid)
619            goto FoundIt;
620
621    pthread_mutex_unlock(&gThreadListLock);
622    return ESRCH;
623
624FoundIt:
625    if (thread->attr.flags & PTHREAD_ATTR_FLAG_DETACHED) {
626        pthread_mutex_unlock(&gThreadListLock);
627        return EINVAL;
628    }
629
630   /* wait for thread death when needed
631    *
632    * if the 'join_count' is negative, this is a 'zombie' thread that
633    * is already dead and without stack/TLS
634    *
635    * otherwise, we need to increment 'join-count' and wait to be signaled
636    */
637   count = thread->join_count;
638    if (count >= 0) {
639        thread->join_count += 1;
640        pthread_cond_wait( &thread->join_cond, &gThreadListLock );
641        count = --thread->join_count;
642    }
643    if (ret_val)
644        *ret_val = thread->return_value;
645
646    /* remove thread descriptor when we're the last joiner or when the
647     * thread was already a zombie.
648     */
649    if (count <= 0) {
650        _pthread_internal_remove_locked(thread);
651        _pthread_internal_free(thread);
652    }
653    pthread_mutex_unlock(&gThreadListLock);
654    return 0;
655}
656
657int  pthread_detach( pthread_t  thid )
658{
659    pthread_internal_t*  thread;
660    int                  result = 0;
661    int                  flags;
662
663    pthread_mutex_lock(&gThreadListLock);
664    for (thread = gThreadList; thread != NULL; thread = thread->next)
665        if (thread == (pthread_internal_t*)thid)
666            goto FoundIt;
667
668    result = ESRCH;
669    goto Exit;
670
671FoundIt:
672    do {
673        flags = thread->attr.flags;
674
675        if ( flags & PTHREAD_ATTR_FLAG_DETACHED ) {
676            /* thread is not joinable ! */
677            result = EINVAL;
678            goto Exit;
679        }
680    }
681    while ( __atomic_cmpxchg( flags, flags | PTHREAD_ATTR_FLAG_DETACHED,
682                              (volatile int*)&thread->attr.flags ) != 0 );
683Exit:
684    pthread_mutex_unlock(&gThreadListLock);
685    return result;
686}
687
688pthread_t pthread_self(void)
689{
690    return (pthread_t)__get_thread();
691}
692
693int pthread_equal(pthread_t one, pthread_t two)
694{
695    return (one == two ? 1 : 0);
696}
697
698int pthread_getschedparam(pthread_t thid, int * policy,
699                          struct sched_param * param)
700{
701    int  old_errno = errno;
702
703    pthread_internal_t * thread = (pthread_internal_t *)thid;
704    int err = sched_getparam(thread->kernel_id, param);
705    if (!err) {
706        *policy = sched_getscheduler(thread->kernel_id);
707    } else {
708        err = errno;
709        errno = old_errno;
710    }
711    return err;
712}
713
714int pthread_setschedparam(pthread_t thid, int policy,
715                          struct sched_param const * param)
716{
717    pthread_internal_t * thread = (pthread_internal_t *)thid;
718    int                  old_errno = errno;
719    int                  ret;
720
721    ret = sched_setscheduler(thread->kernel_id, policy, param);
722    if (ret < 0) {
723        ret = errno;
724        errno = old_errno;
725    }
726    return ret;
727}
728
729
730// mutex lock states
731//
732// 0: unlocked
733// 1: locked, no waiters
734// 2: locked, maybe waiters
735
736/* a mutex is implemented as a 32-bit integer holding the following fields
737 *
738 * bits:     name     description
739 * 31-16     tid      owner thread's kernel id (recursive and errorcheck only)
740 * 15-14     type     mutex type
741 * 13        shared   process-shared flag
742 * 12-2      counter  counter of recursive mutexes
743 * 1-0       state    lock state (0, 1 or 2)
744 */
745
746
747#define  MUTEX_OWNER(m)  (((m)->value >> 16) & 0xffff)
748#define  MUTEX_COUNTER(m) (((m)->value >> 2) & 0xfff)
749
750#define  MUTEX_TYPE_MASK       0xc000
751#define  MUTEX_TYPE_NORMAL     0x0000
752#define  MUTEX_TYPE_RECURSIVE  0x4000
753#define  MUTEX_TYPE_ERRORCHECK 0x8000
754
755#define  MUTEX_COUNTER_SHIFT  2
756#define  MUTEX_COUNTER_MASK   0x1ffc
757#define  MUTEX_SHARED_MASK    0x2000
758
759/* a mutex attribute holds the following fields
760 *
761 * bits:     name       description
762 * 0-3       type       type of mutex
763 * 4         shared     process-shared flag
764 */
765#define  MUTEXATTR_TYPE_MASK   0x000f
766#define  MUTEXATTR_SHARED_MASK 0x0010
767
768
769int pthread_mutexattr_init(pthread_mutexattr_t *attr)
770{
771    if (attr) {
772        *attr = PTHREAD_MUTEX_DEFAULT;
773        return 0;
774    } else {
775        return EINVAL;
776    }
777}
778
779int pthread_mutexattr_destroy(pthread_mutexattr_t *attr)
780{
781    if (attr) {
782        *attr = -1;
783        return 0;
784    } else {
785        return EINVAL;
786    }
787}
788
789int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type)
790{
791    if (attr) {
792        int  atype = (*attr & MUTEXATTR_TYPE_MASK);
793
794         if (atype >= PTHREAD_MUTEX_NORMAL &&
795             atype <= PTHREAD_MUTEX_ERRORCHECK) {
796            *type = atype;
797            return 0;
798        }
799    }
800    return EINVAL;
801}
802
803int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type)
804{
805    if (attr && type >= PTHREAD_MUTEX_NORMAL &&
806                type <= PTHREAD_MUTEX_ERRORCHECK ) {
807        *attr = (*attr & ~MUTEXATTR_TYPE_MASK) | type;
808        return 0;
809    }
810    return EINVAL;
811}
812
813/* process-shared mutexes are not supported at the moment */
814
815int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int  pshared)
816{
817    if (!attr)
818        return EINVAL;
819
820    switch (pshared) {
821    case PTHREAD_PROCESS_PRIVATE:
822        *attr &= ~MUTEXATTR_SHARED_MASK;
823        return 0;
824
825    case PTHREAD_PROCESS_SHARED:
826        /* our current implementation of pthread actually supports shared
827         * mutexes but won't cleanup if a process dies with the mutex held.
828         * Nevertheless, it's better than nothing. Shared mutexes are used
829         * by surfaceflinger and audioflinger.
830         */
831        *attr |= MUTEXATTR_SHARED_MASK;
832        return 0;
833    }
834    return EINVAL;
835}
836
837int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr, int *pshared)
838{
839    if (!attr || !pshared)
840        return EINVAL;
841
842    *pshared = (*attr & MUTEXATTR_SHARED_MASK) ? PTHREAD_PROCESS_SHARED
843                                               : PTHREAD_PROCESS_PRIVATE;
844    return 0;
845}
846
847int pthread_mutex_init(pthread_mutex_t *mutex,
848                       const pthread_mutexattr_t *attr)
849{
850    int value = 0;
851
852    if (mutex == NULL)
853        return EINVAL;
854
855    if (__likely(attr == NULL)) {
856        mutex->value = MUTEX_TYPE_NORMAL;
857        return 0;
858    }
859
860    if ((*attr & MUTEXATTR_SHARED_MASK) != 0)
861        value |= MUTEX_SHARED_MASK;
862
863    switch (*attr & MUTEXATTR_TYPE_MASK) {
864    case PTHREAD_MUTEX_NORMAL:
865        value |= MUTEX_TYPE_NORMAL;
866        break;
867    case PTHREAD_MUTEX_RECURSIVE:
868        value |= MUTEX_TYPE_RECURSIVE;
869        break;
870    case PTHREAD_MUTEX_ERRORCHECK:
871        value |= MUTEX_TYPE_ERRORCHECK;
872        break;
873    default:
874        return EINVAL;
875    }
876
877    mutex->value = value;
878    return 0;
879}
880
881int pthread_mutex_destroy(pthread_mutex_t *mutex)
882{
883    int ret;
884
885    /* use trylock to ensure that the mutex value is
886     * valid and is not already locked. */
887    ret = pthread_mutex_trylock(mutex);
888    if (ret != 0)
889        return ret;
890
891    mutex->value = 0xdead10cc;
892    return 0;
893}
894
895
896/*
897 * Lock a non-recursive mutex.
898 *
899 * As noted above, there are three states:
900 *   0 (unlocked, no contention)
901 *   1 (locked, no contention)
902 *   2 (locked, contention)
903 *
904 * Non-recursive mutexes don't use the thread-id or counter fields, and the
905 * "type" value is zero, so the only bits that will be set are the ones in
906 * the lock state field.
907 */
908static __inline__ void
909_normal_lock(pthread_mutex_t*  mutex)
910{
911    /* We need to preserve the shared flag during operations */
912    int  shared = mutex->value & MUTEX_SHARED_MASK;
913    /*
914     * The common case is an unlocked mutex, so we begin by trying to
915     * change the lock's state from 0 to 1.  __atomic_cmpxchg() returns 0
916     * if it made the swap successfully.  If the result is nonzero, this
917     * lock is already held by another thread.
918     */
919    if (__atomic_cmpxchg(shared|0, shared|1, &mutex->value ) != 0) {
920        /*
921         * We want to go to sleep until the mutex is available, which
922         * requires promoting it to state 2.  We need to swap in the new
923         * state value and then wait until somebody wakes us up.
924         *
925         * __atomic_swap() returns the previous value.  We swap 2 in and
926         * see if we got zero back; if so, we have acquired the lock.  If
927         * not, another thread still holds the lock and we wait again.
928         *
929         * The second argument to the __futex_wait() call is compared
930         * against the current value.  If it doesn't match, __futex_wait()
931         * returns immediately (otherwise, it sleeps for a time specified
932         * by the third argument; 0 means sleep forever).  This ensures
933         * that the mutex is in state 2 when we go to sleep on it, which
934         * guarantees a wake-up call.
935         */
936        while (__atomic_swap(shared|2, &mutex->value ) != (shared|0))
937            __futex_wait_ex(&mutex->value, shared, shared|2, 0);
938    }
939    ANDROID_MEMBAR_FULL();
940}
941
942/*
943 * Release a non-recursive mutex.  The caller is responsible for determining
944 * that we are in fact the owner of this lock.
945 */
946static __inline__ void
947_normal_unlock(pthread_mutex_t*  mutex)
948{
949    ANDROID_MEMBAR_FULL();
950
951    /* We need to preserve the shared flag during operations */
952    int  shared = mutex->value & MUTEX_SHARED_MASK;
953
954    /*
955     * The mutex state will be 1 or (rarely) 2.  We use an atomic decrement
956     * to release the lock.  __atomic_dec() returns the previous value;
957     * if it wasn't 1 we have to do some additional work.
958     */
959    if (__atomic_dec(&mutex->value) != (shared|1)) {
960        /*
961         * Start by releasing the lock.  The decrement changed it from
962         * "contended lock" to "uncontended lock", which means we still
963         * hold it, and anybody who tries to sneak in will push it back
964         * to state 2.
965         *
966         * Once we set it to zero the lock is up for grabs.  We follow
967         * this with a __futex_wake() to ensure that one of the waiting
968         * threads has a chance to grab it.
969         *
970         * This doesn't cause a race with the swap/wait pair in
971         * _normal_lock(), because the __futex_wait() call there will
972         * return immediately if the mutex value isn't 2.
973         */
974        mutex->value = shared;
975
976        /*
977         * Wake up one waiting thread.  We don't know which thread will be
978         * woken or when it'll start executing -- futexes make no guarantees
979         * here.  There may not even be a thread waiting.
980         *
981         * The newly-woken thread will replace the 0 we just set above
982         * with 2, which means that when it eventually releases the mutex
983         * it will also call FUTEX_WAKE.  This results in one extra wake
984         * call whenever a lock is contended, but lets us avoid forgetting
985         * anyone without requiring us to track the number of sleepers.
986         *
987         * It's possible for another thread to sneak in and grab the lock
988         * between the zero assignment above and the wake call below.  If
989         * the new thread is "slow" and holds the lock for a while, we'll
990         * wake up a sleeper, which will swap in a 2 and then go back to
991         * sleep since the lock is still held.  If the new thread is "fast",
992         * running to completion before we call wake, the thread we
993         * eventually wake will find an unlocked mutex and will execute.
994         * Either way we have correct behavior and nobody is orphaned on
995         * the wait queue.
996         */
997        __futex_wake_ex(&mutex->value, shared, 1);
998    }
999}
1000
1001static pthread_mutex_t  __recursive_lock = PTHREAD_MUTEX_INITIALIZER;
1002
1003static void
1004_recursive_lock(void)
1005{
1006    _normal_lock(&__recursive_lock);
1007}
1008
1009static void
1010_recursive_unlock(void)
1011{
1012    _normal_unlock(&__recursive_lock );
1013}
1014
1015int pthread_mutex_lock(pthread_mutex_t *mutex)
1016{
1017    int mtype, tid, new_lock_type, shared;
1018
1019    if (__unlikely(mutex == NULL))
1020        return EINVAL;
1021
1022    mtype = (mutex->value & MUTEX_TYPE_MASK);
1023    shared = (mutex->value & MUTEX_SHARED_MASK);
1024
1025    /* Handle normal case first */
1026    if ( __likely(mtype == MUTEX_TYPE_NORMAL) ) {
1027        _normal_lock(mutex);
1028        return 0;
1029    }
1030
1031    /* Do we already own this recursive or error-check mutex ? */
1032    tid = __get_thread()->kernel_id;
1033    if ( tid == MUTEX_OWNER(mutex) )
1034    {
1035        int  oldv, counter;
1036
1037        if (mtype == MUTEX_TYPE_ERRORCHECK) {
1038            /* trying to re-lock a mutex we already acquired */
1039            return EDEADLK;
1040        }
1041        /*
1042         * We own the mutex, but other threads are able to change
1043         * the contents (e.g. promoting it to "contended"), so we
1044         * need to hold the global lock.
1045         */
1046        _recursive_lock();
1047        oldv         = mutex->value;
1048        counter      = (oldv + (1 << MUTEX_COUNTER_SHIFT)) & MUTEX_COUNTER_MASK;
1049        mutex->value = (oldv & ~MUTEX_COUNTER_MASK) | counter;
1050        _recursive_unlock();
1051        return 0;
1052    }
1053
1054    /* We don't own the mutex, so try to get it.
1055     *
1056     * First, we try to change its state from 0 to 1, if this
1057     * doesn't work, try to change it to state 2.
1058     */
1059    new_lock_type = 1;
1060
1061    /* compute futex wait opcode and restore shared flag in mtype */
1062    mtype |= shared;
1063
1064    for (;;) {
1065        int  oldv;
1066
1067        _recursive_lock();
1068        oldv = mutex->value;
1069        if (oldv == mtype) { /* uncontended released lock => 1 or 2 */
1070            mutex->value = ((tid << 16) | mtype | new_lock_type);
1071        } else if ((oldv & 3) == 1) { /* locked state 1 => state 2 */
1072            oldv ^= 3;
1073            mutex->value = oldv;
1074        }
1075        _recursive_unlock();
1076
1077        if (oldv == mtype)
1078            break;
1079
1080        /*
1081         * The lock was held, possibly contended by others.  From
1082         * now on, if we manage to acquire the lock, we have to
1083         * assume that others are still contending for it so that
1084         * we'll wake them when we unlock it.
1085         */
1086        new_lock_type = 2;
1087
1088        __futex_wait_ex(&mutex->value, shared, oldv, NULL);
1089    }
1090    return 0;
1091}
1092
1093
1094int pthread_mutex_unlock(pthread_mutex_t *mutex)
1095{
1096    int mtype, tid, oldv, shared;
1097
1098    if (__unlikely(mutex == NULL))
1099        return EINVAL;
1100
1101    mtype  = (mutex->value & MUTEX_TYPE_MASK);
1102    shared = (mutex->value & MUTEX_SHARED_MASK);
1103
1104    /* Handle common case first */
1105    if (__likely(mtype == MUTEX_TYPE_NORMAL)) {
1106        _normal_unlock(mutex);
1107        return 0;
1108    }
1109
1110    /* Do we already own this recursive or error-check mutex ? */
1111    tid = __get_thread()->kernel_id;
1112    if ( tid != MUTEX_OWNER(mutex) )
1113        return EPERM;
1114
1115    /* We do, decrement counter or release the mutex if it is 0 */
1116    _recursive_lock();
1117    oldv = mutex->value;
1118    if (oldv & MUTEX_COUNTER_MASK) {
1119        mutex->value = oldv - (1 << MUTEX_COUNTER_SHIFT);
1120        oldv = 0;
1121    } else {
1122        mutex->value = shared | mtype;
1123    }
1124    _recursive_unlock();
1125
1126    /* Wake one waiting thread, if any */
1127    if ((oldv & 3) == 2) {
1128        __futex_wake_ex(&mutex->value, shared, 1);
1129    }
1130    return 0;
1131}
1132
1133
1134int pthread_mutex_trylock(pthread_mutex_t *mutex)
1135{
1136    int mtype, tid, oldv, shared;
1137
1138    if (__unlikely(mutex == NULL))
1139        return EINVAL;
1140
1141    mtype  = (mutex->value & MUTEX_TYPE_MASK);
1142    shared = (mutex->value & MUTEX_SHARED_MASK);
1143
1144    /* Handle common case first */
1145    if ( __likely(mtype == MUTEX_TYPE_NORMAL) )
1146    {
1147        if (__atomic_cmpxchg(shared|0, shared|1, &mutex->value) == 0) {
1148            ANDROID_MEMBAR_FULL();
1149            return 0;
1150        }
1151
1152        return EBUSY;
1153    }
1154
1155    /* Do we already own this recursive or error-check mutex ? */
1156    tid = __get_thread()->kernel_id;
1157    if ( tid == MUTEX_OWNER(mutex) )
1158    {
1159        int counter;
1160
1161        if (mtype == MUTEX_TYPE_ERRORCHECK) {
1162            /* already locked by ourselves */
1163            return EDEADLK;
1164        }
1165
1166        _recursive_lock();
1167        oldv = mutex->value;
1168        counter = (oldv + (1 << MUTEX_COUNTER_SHIFT)) & MUTEX_COUNTER_MASK;
1169        mutex->value = (oldv & ~MUTEX_COUNTER_MASK) | counter;
1170        _recursive_unlock();
1171        return 0;
1172    }
1173
1174    /* Restore sharing bit in mtype */
1175    mtype |= shared;
1176
1177    /* Try to lock it, just once. */
1178    _recursive_lock();
1179    oldv = mutex->value;
1180    if (oldv == mtype)  /* uncontended released lock => state 1 */
1181        mutex->value = ((tid << 16) | mtype | 1);
1182    _recursive_unlock();
1183
1184    if (oldv != mtype)
1185        return EBUSY;
1186
1187    return 0;
1188}
1189
1190
1191/* initialize 'ts' with the difference between 'abstime' and the current time
1192 * according to 'clock'. Returns -1 if abstime already expired, or 0 otherwise.
1193 */
1194static int
1195__timespec_to_absolute(struct timespec*  ts, const struct timespec*  abstime, clockid_t  clock)
1196{
1197    clock_gettime(clock, ts);
1198    ts->tv_sec  = abstime->tv_sec - ts->tv_sec;
1199    ts->tv_nsec = abstime->tv_nsec - ts->tv_nsec;
1200    if (ts->tv_nsec < 0) {
1201        ts->tv_sec--;
1202        ts->tv_nsec += 1000000000;
1203    }
1204    if ((ts->tv_nsec < 0) || (ts->tv_sec < 0))
1205        return -1;
1206
1207    return 0;
1208}
1209
1210/* initialize 'abstime' to the current time according to 'clock' plus 'msecs'
1211 * milliseconds.
1212 */
1213static void
1214__timespec_to_relative_msec(struct timespec*  abstime, unsigned  msecs, clockid_t  clock)
1215{
1216    clock_gettime(clock, abstime);
1217    abstime->tv_sec  += msecs/1000;
1218    abstime->tv_nsec += (msecs%1000)*1000000;
1219    if (abstime->tv_nsec >= 1000000000) {
1220        abstime->tv_sec++;
1221        abstime->tv_nsec -= 1000000000;
1222    }
1223}
1224
1225int pthread_mutex_lock_timeout_np(pthread_mutex_t *mutex, unsigned msecs)
1226{
1227    clockid_t        clock = CLOCK_MONOTONIC;
1228    struct timespec  abstime;
1229    struct timespec  ts;
1230    int              mtype, tid, oldv, new_lock_type, shared;
1231
1232    /* compute absolute expiration time */
1233    __timespec_to_relative_msec(&abstime, msecs, clock);
1234
1235    if (__unlikely(mutex == NULL))
1236        return EINVAL;
1237
1238    mtype  = (mutex->value & MUTEX_TYPE_MASK);
1239    shared = (mutex->value & MUTEX_SHARED_MASK);
1240
1241    /* Handle common case first */
1242    if ( __likely(mtype == MUTEX_TYPE_NORMAL) )
1243    {
1244        /* fast path for uncontended lock */
1245        if (__atomic_cmpxchg(shared|0, shared|1, &mutex->value) == 0) {
1246            ANDROID_MEMBAR_FULL();
1247            return 0;
1248        }
1249
1250        /* loop while needed */
1251        while (__atomic_swap(shared|2, &mutex->value) != (shared|0)) {
1252            if (__timespec_to_absolute(&ts, &abstime, clock) < 0)
1253                return EBUSY;
1254
1255            __futex_wait_ex(&mutex->value, shared, shared|2, &ts);
1256        }
1257        ANDROID_MEMBAR_FULL();
1258        return 0;
1259    }
1260
1261    /* Do we already own this recursive or error-check mutex ? */
1262    tid = __get_thread()->kernel_id;
1263    if ( tid == MUTEX_OWNER(mutex) )
1264    {
1265        int  oldv, counter;
1266
1267        if (mtype == MUTEX_TYPE_ERRORCHECK) {
1268            /* already locked by ourselves */
1269            return EDEADLK;
1270        }
1271
1272        _recursive_lock();
1273        oldv = mutex->value;
1274        counter = (oldv + (1 << MUTEX_COUNTER_SHIFT)) & MUTEX_COUNTER_MASK;
1275        mutex->value = (oldv & ~MUTEX_COUNTER_MASK) | counter;
1276        _recursive_unlock();
1277        return 0;
1278    }
1279
1280    /* We don't own the mutex, so try to get it.
1281     *
1282     * First, we try to change its state from 0 to 1, if this
1283     * doesn't work, try to change it to state 2.
1284     */
1285    new_lock_type = 1;
1286
1287    /* Compute wait op and restore sharing bit in mtype */
1288    mtype  |= shared;
1289
1290    for (;;) {
1291        int  oldv;
1292        struct timespec  ts;
1293
1294        _recursive_lock();
1295        oldv = mutex->value;
1296        if (oldv == mtype) { /* uncontended released lock => 1 or 2 */
1297            mutex->value = ((tid << 16) | mtype | new_lock_type);
1298        } else if ((oldv & 3) == 1) { /* locked state 1 => state 2 */
1299            oldv ^= 3;
1300            mutex->value = oldv;
1301        }
1302        _recursive_unlock();
1303
1304        if (oldv == mtype)
1305            break;
1306
1307        /*
1308         * The lock was held, possibly contended by others.  From
1309         * now on, if we manage to acquire the lock, we have to
1310         * assume that others are still contending for it so that
1311         * we'll wake them when we unlock it.
1312         */
1313        new_lock_type = 2;
1314
1315        if (__timespec_to_absolute(&ts, &abstime, clock) < 0)
1316            return EBUSY;
1317
1318        __futex_wait_ex(&mutex->value, shared, oldv, &ts);
1319    }
1320    return 0;
1321}
1322
1323int pthread_condattr_init(pthread_condattr_t *attr)
1324{
1325    if (attr == NULL)
1326        return EINVAL;
1327
1328    *attr = PTHREAD_PROCESS_PRIVATE;
1329    return 0;
1330}
1331
1332int pthread_condattr_getpshared(pthread_condattr_t *attr, int *pshared)
1333{
1334    if (attr == NULL || pshared == NULL)
1335        return EINVAL;
1336
1337    *pshared = *attr;
1338    return 0;
1339}
1340
1341int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared)
1342{
1343    if (attr == NULL)
1344        return EINVAL;
1345
1346    if (pshared != PTHREAD_PROCESS_SHARED &&
1347        pshared != PTHREAD_PROCESS_PRIVATE)
1348        return EINVAL;
1349
1350    *attr = pshared;
1351    return 0;
1352}
1353
1354int pthread_condattr_destroy(pthread_condattr_t *attr)
1355{
1356    if (attr == NULL)
1357        return EINVAL;
1358
1359    *attr = 0xdeada11d;
1360    return 0;
1361}
1362
1363/* We use one bit in condition variable values as the 'shared' flag
1364 * The rest is a counter.
1365 */
1366#define COND_SHARED_MASK        0x0001
1367#define COND_COUNTER_INCREMENT  0x0002
1368#define COND_COUNTER_MASK       (~COND_SHARED_MASK)
1369
1370#define COND_IS_SHARED(c)  (((c)->value & COND_SHARED_MASK) != 0)
1371
1372/* XXX *technically* there is a race condition that could allow
1373 * XXX a signal to be missed.  If thread A is preempted in _wait()
1374 * XXX after unlocking the mutex and before waiting, and if other
1375 * XXX threads call signal or broadcast UINT_MAX/2 times (exactly),
1376 * XXX before thread A is scheduled again and calls futex_wait(),
1377 * XXX then the signal will be lost.
1378 */
1379
1380int pthread_cond_init(pthread_cond_t *cond,
1381                      const pthread_condattr_t *attr)
1382{
1383    if (cond == NULL)
1384        return EINVAL;
1385
1386    cond->value = 0;
1387
1388    if (attr != NULL && *attr == PTHREAD_PROCESS_SHARED)
1389        cond->value |= COND_SHARED_MASK;
1390
1391    return 0;
1392}
1393
1394int pthread_cond_destroy(pthread_cond_t *cond)
1395{
1396    if (cond == NULL)
1397        return EINVAL;
1398
1399    cond->value = 0xdeadc04d;
1400    return 0;
1401}
1402
1403/* This function is used by pthread_cond_broadcast and
1404 * pthread_cond_signal to atomically decrement the counter
1405 * then wake-up 'counter' threads.
1406 */
1407static int
1408__pthread_cond_pulse(pthread_cond_t *cond, int  counter)
1409{
1410    long flags;
1411
1412    if (__unlikely(cond == NULL))
1413        return EINVAL;
1414
1415    flags = (cond->value & ~COND_COUNTER_MASK);
1416    for (;;) {
1417        long oldval = cond->value;
1418        long newval = ((oldval - COND_COUNTER_INCREMENT) & COND_COUNTER_MASK)
1419                      | flags;
1420        if (__atomic_cmpxchg(oldval, newval, &cond->value) == 0)
1421            break;
1422    }
1423
1424    __futex_wake_ex(&cond->value, COND_IS_SHARED(cond), counter);
1425    return 0;
1426}
1427
1428int pthread_cond_broadcast(pthread_cond_t *cond)
1429{
1430    return __pthread_cond_pulse(cond, INT_MAX);
1431}
1432
1433int pthread_cond_signal(pthread_cond_t *cond)
1434{
1435    return __pthread_cond_pulse(cond, 1);
1436}
1437
1438int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
1439{
1440    return pthread_cond_timedwait(cond, mutex, NULL);
1441}
1442
1443int __pthread_cond_timedwait_relative(pthread_cond_t *cond,
1444                                      pthread_mutex_t * mutex,
1445                                      const struct timespec *reltime)
1446{
1447    int  status;
1448    int  oldvalue = cond->value;
1449
1450    pthread_mutex_unlock(mutex);
1451    status = __futex_wait_ex(&cond->value, COND_IS_SHARED(cond), oldvalue, reltime);
1452    pthread_mutex_lock(mutex);
1453
1454    if (status == (-ETIMEDOUT)) return ETIMEDOUT;
1455    return 0;
1456}
1457
1458int __pthread_cond_timedwait(pthread_cond_t *cond,
1459                             pthread_mutex_t * mutex,
1460                             const struct timespec *abstime,
1461                             clockid_t clock)
1462{
1463    struct timespec ts;
1464    struct timespec * tsp;
1465
1466    if (abstime != NULL) {
1467        if (__timespec_to_absolute(&ts, abstime, clock) < 0)
1468            return ETIMEDOUT;
1469        tsp = &ts;
1470    } else {
1471        tsp = NULL;
1472    }
1473
1474    return __pthread_cond_timedwait_relative(cond, mutex, tsp);
1475}
1476
1477int pthread_cond_timedwait(pthread_cond_t *cond,
1478                           pthread_mutex_t * mutex,
1479                           const struct timespec *abstime)
1480{
1481    return __pthread_cond_timedwait(cond, mutex, abstime, CLOCK_REALTIME);
1482}
1483
1484
1485/* this one exists only for backward binary compatibility */
1486int pthread_cond_timedwait_monotonic(pthread_cond_t *cond,
1487                                     pthread_mutex_t * mutex,
1488                                     const struct timespec *abstime)
1489{
1490    return __pthread_cond_timedwait(cond, mutex, abstime, CLOCK_MONOTONIC);
1491}
1492
1493int pthread_cond_timedwait_monotonic_np(pthread_cond_t *cond,
1494                                     pthread_mutex_t * mutex,
1495                                     const struct timespec *abstime)
1496{
1497    return __pthread_cond_timedwait(cond, mutex, abstime, CLOCK_MONOTONIC);
1498}
1499
1500int pthread_cond_timedwait_relative_np(pthread_cond_t *cond,
1501                                      pthread_mutex_t * mutex,
1502                                      const struct timespec *reltime)
1503{
1504    return __pthread_cond_timedwait_relative(cond, mutex, reltime);
1505}
1506
1507int pthread_cond_timeout_np(pthread_cond_t *cond,
1508                            pthread_mutex_t * mutex,
1509                            unsigned msecs)
1510{
1511    struct timespec ts;
1512
1513    ts.tv_sec = msecs / 1000;
1514    ts.tv_nsec = (msecs % 1000) * 1000000;
1515
1516    return __pthread_cond_timedwait_relative(cond, mutex, &ts);
1517}
1518
1519
1520
1521/* A technical note regarding our thread-local-storage (TLS) implementation:
1522 *
1523 * There can be up to TLSMAP_SIZE independent TLS keys in a given process,
1524 * though the first TLSMAP_START keys are reserved for Bionic to hold
1525 * special thread-specific variables like errno or a pointer to
1526 * the current thread's descriptor.
1527 *
1528 * while stored in the TLS area, these entries cannot be accessed through
1529 * pthread_getspecific() / pthread_setspecific() and pthread_key_delete()
1530 *
1531 * also, some entries in the key table are pre-allocated (see tlsmap_lock)
1532 * to greatly simplify and speedup some OpenGL-related operations. though the
1533 * initialy value will be NULL on all threads.
1534 *
1535 * you can use pthread_getspecific()/setspecific() on these, and in theory
1536 * you could also call pthread_key_delete() as well, though this would
1537 * probably break some apps.
1538 *
1539 * The 'tlsmap_t' type defined below implements a shared global map of
1540 * currently created/allocated TLS keys and the destructors associated
1541 * with them. You should use tlsmap_lock/unlock to access it to avoid
1542 * any race condition.
1543 *
1544 * the global TLS map simply contains a bitmap of allocated keys, and
1545 * an array of destructors.
1546 *
1547 * each thread has a TLS area that is a simple array of TLSMAP_SIZE void*
1548 * pointers. the TLS area of the main thread is stack-allocated in
1549 * __libc_init_common, while the TLS area of other threads is placed at
1550 * the top of their stack in pthread_create.
1551 *
1552 * when pthread_key_create() is called, it finds the first free key in the
1553 * bitmap, then set it to 1, saving the destructor altogether
1554 *
1555 * when pthread_key_delete() is called. it will erase the key's bitmap bit
1556 * and its destructor, and will also clear the key data in the TLS area of
1557 * all created threads. As mandated by Posix, it is the responsability of
1558 * the caller of pthread_key_delete() to properly reclaim the objects that
1559 * were pointed to by these data fields (either before or after the call).
1560 *
1561 */
1562
1563/* TLS Map implementation
1564 */
1565
1566#define TLSMAP_START      (TLS_SLOT_MAX_WELL_KNOWN+1)
1567#define TLSMAP_SIZE       BIONIC_TLS_SLOTS
1568#define TLSMAP_BITS       32
1569#define TLSMAP_WORDS      ((TLSMAP_SIZE+TLSMAP_BITS-1)/TLSMAP_BITS)
1570#define TLSMAP_WORD(m,k)  (m)->map[(k)/TLSMAP_BITS]
1571#define TLSMAP_MASK(k)    (1U << ((k)&(TLSMAP_BITS-1)))
1572
1573/* this macro is used to quickly check that a key belongs to a reasonable range */
1574#define TLSMAP_VALIDATE_KEY(key)  \
1575    ((key) >= TLSMAP_START && (key) < TLSMAP_SIZE)
1576
1577/* the type of tls key destructor functions */
1578typedef void (*tls_dtor_t)(void*);
1579
1580typedef struct {
1581    int         init;                  /* see comment in tlsmap_lock() */
1582    uint32_t    map[TLSMAP_WORDS];     /* bitmap of allocated keys */
1583    tls_dtor_t  dtors[TLSMAP_SIZE];    /* key destructors */
1584} tlsmap_t;
1585
1586static pthread_mutex_t  _tlsmap_lock = PTHREAD_MUTEX_INITIALIZER;
1587static tlsmap_t         _tlsmap;
1588
1589/* lock the global TLS map lock and return a handle to it */
1590static __inline__ tlsmap_t* tlsmap_lock(void)
1591{
1592    tlsmap_t*   m = &_tlsmap;
1593
1594    pthread_mutex_lock(&_tlsmap_lock);
1595    /* we need to initialize the first entry of the 'map' array
1596     * with the value TLS_DEFAULT_ALLOC_MAP. doing it statically
1597     * when declaring _tlsmap is a bit awkward and is going to
1598     * produce warnings, so do it the first time we use the map
1599     * instead
1600     */
1601    if (__unlikely(!m->init)) {
1602        TLSMAP_WORD(m,0) = TLS_DEFAULT_ALLOC_MAP;
1603        m->init          = 1;
1604    }
1605    return m;
1606}
1607
1608/* unlock the global TLS map */
1609static __inline__ void tlsmap_unlock(tlsmap_t*  m)
1610{
1611    pthread_mutex_unlock(&_tlsmap_lock);
1612    (void)m;  /* a good compiler is a happy compiler */
1613}
1614
1615/* test to see wether a key is allocated */
1616static __inline__ int tlsmap_test(tlsmap_t*  m, int  key)
1617{
1618    return (TLSMAP_WORD(m,key) & TLSMAP_MASK(key)) != 0;
1619}
1620
1621/* set the destructor and bit flag on a newly allocated key */
1622static __inline__ void tlsmap_set(tlsmap_t*  m, int  key, tls_dtor_t  dtor)
1623{
1624    TLSMAP_WORD(m,key) |= TLSMAP_MASK(key);
1625    m->dtors[key]       = dtor;
1626}
1627
1628/* clear the destructor and bit flag on an existing key */
1629static __inline__ void  tlsmap_clear(tlsmap_t*  m, int  key)
1630{
1631    TLSMAP_WORD(m,key) &= ~TLSMAP_MASK(key);
1632    m->dtors[key]       = NULL;
1633}
1634
1635/* allocate a new TLS key, return -1 if no room left */
1636static int tlsmap_alloc(tlsmap_t*  m, tls_dtor_t  dtor)
1637{
1638    int  key;
1639
1640    for ( key = TLSMAP_START; key < TLSMAP_SIZE; key++ ) {
1641        if ( !tlsmap_test(m, key) ) {
1642            tlsmap_set(m, key, dtor);
1643            return key;
1644        }
1645    }
1646    return -1;
1647}
1648
1649
1650int pthread_key_create(pthread_key_t *key, void (*destructor_function)(void *))
1651{
1652    uint32_t   err = ENOMEM;
1653    tlsmap_t*  map = tlsmap_lock();
1654    int        k   = tlsmap_alloc(map, destructor_function);
1655
1656    if (k >= 0) {
1657        *key = k;
1658        err  = 0;
1659    }
1660    tlsmap_unlock(map);
1661    return err;
1662}
1663
1664
1665/* This deletes a pthread_key_t. note that the standard mandates that this does
1666 * not call the destructor of non-NULL key values. Instead, it is the
1667 * responsability of the caller to properly dispose of the corresponding data
1668 * and resources, using any mean it finds suitable.
1669 *
1670 * On the other hand, this function will clear the corresponding key data
1671 * values in all known threads. this prevents later (invalid) calls to
1672 * pthread_getspecific() to receive invalid/stale values.
1673 */
1674int pthread_key_delete(pthread_key_t key)
1675{
1676    uint32_t             err;
1677    pthread_internal_t*  thr;
1678    tlsmap_t*            map;
1679
1680    if (!TLSMAP_VALIDATE_KEY(key)) {
1681        return EINVAL;
1682    }
1683
1684    map = tlsmap_lock();
1685
1686    if (!tlsmap_test(map, key)) {
1687        err = EINVAL;
1688        goto err1;
1689    }
1690
1691    /* clear value in all threads */
1692    pthread_mutex_lock(&gThreadListLock);
1693    for ( thr = gThreadList; thr != NULL; thr = thr->next ) {
1694        /* avoid zombie threads with a negative 'join_count'. these are really
1695         * already dead and don't have a TLS area anymore.
1696         *
1697         * similarly, it is possible to have thr->tls == NULL for threads that
1698         * were just recently created through pthread_create() but whose
1699         * startup trampoline (__thread_entry) hasn't been run yet by the
1700         * scheduler. so check for this too.
1701         */
1702        if (thr->join_count < 0 || !thr->tls)
1703            continue;
1704
1705        thr->tls[key] = NULL;
1706    }
1707    tlsmap_clear(map, key);
1708
1709    pthread_mutex_unlock(&gThreadListLock);
1710    err = 0;
1711
1712err1:
1713    tlsmap_unlock(map);
1714    return err;
1715}
1716
1717
1718int pthread_setspecific(pthread_key_t key, const void *ptr)
1719{
1720    int        err = EINVAL;
1721    tlsmap_t*  map;
1722
1723    if (TLSMAP_VALIDATE_KEY(key)) {
1724        /* check that we're trying to set data for an allocated key */
1725        map = tlsmap_lock();
1726        if (tlsmap_test(map, key)) {
1727            ((uint32_t *)__get_tls())[key] = (uint32_t)ptr;
1728            err = 0;
1729        }
1730        tlsmap_unlock(map);
1731    }
1732    return err;
1733}
1734
1735void * pthread_getspecific(pthread_key_t key)
1736{
1737    if (!TLSMAP_VALIDATE_KEY(key)) {
1738        return NULL;
1739    }
1740
1741    /* for performance reason, we do not lock/unlock the global TLS map
1742     * to check that the key is properly allocated. if the key was not
1743     * allocated, the value read from the TLS should always be NULL
1744     * due to pthread_key_delete() clearing the values for all threads.
1745     */
1746    return (void *)(((unsigned *)__get_tls())[key]);
1747}
1748
1749/* Posix mandates that this be defined in <limits.h> but we don't have
1750 * it just yet.
1751 */
1752#ifndef PTHREAD_DESTRUCTOR_ITERATIONS
1753#  define PTHREAD_DESTRUCTOR_ITERATIONS  4
1754#endif
1755
1756/* this function is called from pthread_exit() to remove all TLS key data
1757 * from this thread's TLS area. this must call the destructor of all keys
1758 * that have a non-NULL data value (and a non-NULL destructor).
1759 *
1760 * because destructors can do funky things like deleting/creating other
1761 * keys, we need to implement this in a loop
1762 */
1763static void pthread_key_clean_all(void)
1764{
1765    tlsmap_t*    map;
1766    void**       tls = (void**)__get_tls();
1767    int          rounds = PTHREAD_DESTRUCTOR_ITERATIONS;
1768
1769    map = tlsmap_lock();
1770
1771    for (rounds = PTHREAD_DESTRUCTOR_ITERATIONS; rounds > 0; rounds--)
1772    {
1773        int  kk, count = 0;
1774
1775        for (kk = TLSMAP_START; kk < TLSMAP_SIZE; kk++) {
1776            if ( tlsmap_test(map, kk) )
1777            {
1778                void*       data = tls[kk];
1779                tls_dtor_t  dtor = map->dtors[kk];
1780
1781                if (data != NULL && dtor != NULL)
1782                {
1783                   /* we need to clear the key data now, this will prevent the
1784                    * destructor (or a later one) from seeing the old value if
1785                    * it calls pthread_getspecific() for some odd reason
1786                    *
1787                    * we do not do this if 'dtor == NULL' just in case another
1788                    * destructor function might be responsible for manually
1789                    * releasing the corresponding data.
1790                    */
1791                    tls[kk] = NULL;
1792
1793                   /* because the destructor is free to call pthread_key_create
1794                    * and/or pthread_key_delete, we need to temporarily unlock
1795                    * the TLS map
1796                    */
1797                    tlsmap_unlock(map);
1798                    (*dtor)(data);
1799                    map = tlsmap_lock();
1800
1801                    count += 1;
1802                }
1803            }
1804        }
1805
1806        /* if we didn't call any destructor, there is no need to check the
1807         * TLS data again
1808         */
1809        if (count == 0)
1810            break;
1811    }
1812    tlsmap_unlock(map);
1813}
1814
1815// man says this should be in <linux/unistd.h>, but it isn't
1816extern int tkill(int tid, int sig);
1817
1818int pthread_kill(pthread_t tid, int sig)
1819{
1820    int  ret;
1821    int  old_errno = errno;
1822    pthread_internal_t * thread = (pthread_internal_t *)tid;
1823
1824    ret = tkill(thread->kernel_id, sig);
1825    if (ret < 0) {
1826        ret = errno;
1827        errno = old_errno;
1828    }
1829
1830    return ret;
1831}
1832
1833extern int __rt_sigprocmask(int, const sigset_t *, sigset_t *, size_t);
1834
1835int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
1836{
1837    /* pthread_sigmask must return the error code, but the syscall
1838     * will set errno instead and return 0/-1
1839     */
1840    int ret, old_errno = errno;
1841
1842    ret = __rt_sigprocmask(how, set, oset, _NSIG / 8);
1843    if (ret < 0)
1844        ret = errno;
1845
1846    errno = old_errno;
1847    return ret;
1848}
1849
1850
1851int pthread_getcpuclockid(pthread_t  tid, clockid_t  *clockid)
1852{
1853    const int            CLOCK_IDTYPE_BITS = 3;
1854    pthread_internal_t*  thread = (pthread_internal_t*)tid;
1855
1856    if (!thread)
1857        return ESRCH;
1858
1859    *clockid = CLOCK_THREAD_CPUTIME_ID | (thread->kernel_id << CLOCK_IDTYPE_BITS);
1860    return 0;
1861}
1862
1863
1864/* NOTE: this implementation doesn't support a init function that throws a C++ exception
1865 *       or calls fork()
1866 */
1867int  pthread_once( pthread_once_t*  once_control,  void (*init_routine)(void) )
1868{
1869    static pthread_mutex_t   once_lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
1870
1871    if (*once_control == PTHREAD_ONCE_INIT) {
1872        pthread_mutex_lock( &once_lock );
1873        if (*once_control == PTHREAD_ONCE_INIT) {
1874            (*init_routine)();
1875            *once_control = ~PTHREAD_ONCE_INIT;
1876        }
1877        pthread_mutex_unlock( &once_lock );
1878    }
1879    return 0;
1880}
1881
1882/* This value is not exported by kernel headers, so hardcode it here */
1883#define MAX_TASK_COMM_LEN	16
1884#define TASK_COMM_FMT 		"/proc/self/task/%u/comm"
1885
1886int pthread_setname_np(pthread_t thid, const char *thname)
1887{
1888    size_t thname_len;
1889    int saved_errno, ret;
1890
1891    if (thid == 0 || thname == NULL)
1892        return EINVAL;
1893
1894    thname_len = strlen(thname);
1895    if (thname_len >= MAX_TASK_COMM_LEN)
1896        return ERANGE;
1897
1898    saved_errno = errno;
1899    if (thid == pthread_self())
1900    {
1901        ret = prctl(PR_SET_NAME, (unsigned long)thname, 0, 0, 0) ? errno : 0;
1902    }
1903    else
1904    {
1905        /* Have to change another thread's name */
1906        pthread_internal_t *thread = (pthread_internal_t *)thid;
1907        char comm_name[sizeof(TASK_COMM_FMT) + 8];
1908        ssize_t n;
1909        int fd;
1910
1911        snprintf(comm_name, sizeof(comm_name), TASK_COMM_FMT, (unsigned int)thread->kernel_id);
1912        fd = open(comm_name, O_RDWR);
1913        if (fd == -1)
1914        {
1915            ret = errno;
1916            goto exit;
1917        }
1918        n = TEMP_FAILURE_RETRY(write(fd, thname, thname_len));
1919        close(fd);
1920
1921        if (n < 0)
1922            ret = errno;
1923        else if ((size_t)n != thname_len)
1924            ret = EIO;
1925        else
1926            ret = 0;
1927    }
1928exit:
1929    errno = saved_errno;
1930    return ret;
1931}
1932