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 82542 : int NaClMutexCtor(struct NaClMutex *mp) {
14 82542 : if (0 != pthread_mutex_init(&mp->mu, (pthread_mutexattr_t *) 0)) {
15 0 : return 0;
16 : }
17 82542 : return 1;
18 : }
19 :
20 77984 : void NaClMutexDtor(struct NaClMutex *mp) {
21 77984 : pthread_mutex_destroy(&mp->mu);
22 77989 : }
23 :
24 : #define MAP(E, S) case E: do { return S; } while (0)
25 :
26 4916510 : NaClSyncStatus NaClMutexLock(struct NaClMutex *mp) {
27 4916510 : switch (pthread_mutex_lock(&mp->mu)) {
28 4917321 : 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 : }
33 0 : return NACL_SYNC_INTERNAL_ERROR;
34 : }
35 :
36 4 : NaClSyncStatus NaClMutexTryLock(struct NaClMutex *mp) {
37 4 : switch (pthread_mutex_trylock(&mp->mu)) {
38 2 : MAP(0, NACL_SYNC_OK);
39 0 : MAP(EINVAL, NACL_SYNC_MUTEX_INVALID);
40 2 : MAP(EBUSY, NACL_SYNC_BUSY);
41 : /* no EAGAIN; we don't support recursive mutexes */
42 : }
43 0 : return NACL_SYNC_INTERNAL_ERROR;
44 : }
45 :
46 630281 : NaClSyncStatus NaClMutexUnlock(struct NaClMutex *mp) {
47 630281 : switch (pthread_mutex_unlock(&mp->mu)) {
48 4917214 : MAP(0, NACL_SYNC_OK);
49 0 : MAP(EINVAL, NACL_SYNC_MUTEX_INVALID);
50 0 : MAP(EPERM, NACL_SYNC_MUTEX_PERMISSION);
51 : }
52 0 : return NACL_SYNC_INTERNAL_ERROR;
53 : }
|