1 : /*
2 : * Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 : * Use of this source code is governed by a BSD-style license that can be
4 : * found in the LICENSE file.
5 : */
6 :
7 :
8 : #include <pthread.h>
9 : #include <errno.h>
10 : #include "native_client/src/include/nacl_macros.h"
11 : #include "native_client/src/shared/platform/nacl_sync.h"
12 :
13 47259 : int NaClMutexCtor(struct NaClMutex *mp) {
14 47259 : if (0 != pthread_mutex_init(&mp->mu, (pthread_mutexattr_t *) 0)) {
15 0 : return 0;
16 : }
17 47259 : return 1;
18 47259 : }
19 :
20 42320 : void NaClMutexDtor(struct NaClMutex *mp) {
21 42320 : pthread_mutex_destroy(&mp->mu);
22 42320 : }
23 :
24 : #define MAP(E, S) case E: do { return S; } while (0)
25 :
26 12782718 : NaClSyncStatus NaClMutexLock(struct NaClMutex *mp) {
27 12782718 : switch (pthread_mutex_lock(&mp->mu)) {
28 25565286 : MAP(0, NACL_SYNC_OK);
29 0 : MAP(EINVAL, NACL_SYNC_MUTEX_INVALID);
30 : /* no EAGAIN; we don't support recursive mutexes */
31 0 : MAP(EDEADLK, NACL_SYNC_MUTEX_DEADLOCK);
32 0 : }
33 0 : return NACL_SYNC_INTERNAL_ERROR;
34 12782615 : }
35 :
36 4 : NaClSyncStatus NaClMutexTryLock(struct NaClMutex *mp) {
37 4 : switch (pthread_mutex_trylock(&mp->mu)) {
38 4 : MAP(0, NACL_SYNC_OK);
39 0 : MAP(EINVAL, NACL_SYNC_MUTEX_INVALID);
40 4 : MAP(EBUSY, NACL_SYNC_BUSY);
41 : /* no EAGAIN; we don't support recursive mutexes */
42 0 : }
43 0 : return NACL_SYNC_INTERNAL_ERROR;
44 4 : }
45 :
46 12782887 : NaClSyncStatus NaClMutexUnlock(struct NaClMutex *mp) {
47 12782887 : switch (pthread_mutex_unlock(&mp->mu)) {
48 25565611 : MAP(0, NACL_SYNC_OK);
49 0 : MAP(EINVAL, NACL_SYNC_MUTEX_INVALID);
50 0 : MAP(EPERM, NACL_SYNC_MUTEX_PERMISSION);
51 0 : }
52 0 : return NACL_SYNC_INTERNAL_ERROR;
53 12782789 : }
|