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 : * NaCl Service Runtime. Mutex Descriptor / Handle abstraction.
9 : */
10 :
11 : #include "native_client/src/include/portability.h"
12 :
13 : #include <stdlib.h>
14 : #include <string.h>
15 :
16 : #include "native_client/src/shared/imc/nacl_imc_c.h"
17 : #include "native_client/src/trusted/desc/nacl_desc_base.h"
18 : #include "native_client/src/trusted/desc/nacl_desc_mutex.h"
19 :
20 : #include "native_client/src/shared/platform/nacl_host_desc.h"
21 : #include "native_client/src/shared/platform/nacl_log.h"
22 : #include "native_client/src/shared/platform/nacl_interruptible_mutex.h"
23 :
24 : #include "native_client/src/trusted/service_runtime/nacl_config.h"
25 : #include "native_client/src/trusted/service_runtime/internal_errno.h"
26 :
27 : #include "native_client/src/trusted/service_runtime/include/bits/mman.h"
28 : #include "native_client/src/trusted/service_runtime/include/sys/errno.h"
29 : #include "native_client/src/trusted/service_runtime/include/sys/fcntl.h"
30 : #include "native_client/src/trusted/service_runtime/include/sys/stat.h"
31 :
32 : /*
33 : * This file contains the implementation for the NaClDescMutex subclass
34 : * of NaClDesc.
35 : *
36 : * NaClDescMutex is the subclass that wraps host-OS mutex abstractions
37 : */
38 :
39 : static struct NaClDescVtbl const kNaClDescMutexVtbl; /* fwd */
40 :
41 : /*
42 : * Takes ownership of hd, will close in Dtor.
43 : */
44 0 : int NaClDescMutexCtor(struct NaClDescMutex *self) {
45 0 : struct NaClDesc *basep = (struct NaClDesc *) self;
46 :
47 0 : basep->base.vtbl = (struct NaClRefCountVtbl const *) NULL;
48 0 : if (!NaClDescCtor(basep)) {
49 0 : return 0;
50 : }
51 0 : if (!NaClIntrMutexCtor(&self->mu)) {
52 0 : (*basep->base.vtbl->Dtor)(&basep->base);
53 0 : return 0;
54 : }
55 :
56 0 : basep->base.vtbl = (struct NaClRefCountVtbl const *) &kNaClDescMutexVtbl;
57 0 : return 1;
58 0 : }
59 :
60 0 : static void NaClDescMutexDtor(struct NaClRefCount *vself) {
61 0 : struct NaClDescMutex *self = (struct NaClDescMutex *) vself;
62 :
63 0 : NaClLog(4, "NaClDescMutexDtor(0x%08"NACL_PRIxPTR").\n",
64 : (uintptr_t) vself);
65 0 : NaClIntrMutexDtor(&self->mu);
66 0 : vself->vtbl = (struct NaClRefCountVtbl const *) &kNaClDescVtbl;
67 0 : (*vself->vtbl->Dtor)(vself);
68 0 : }
69 :
70 0 : static int NaClDescMutexFstat(struct NaClDesc *vself,
71 0 : struct nacl_abi_stat *statbuf) {
72 0 : UNREFERENCED_PARAMETER(vself);
73 :
74 0 : memset(statbuf, 0, sizeof *statbuf);
75 0 : statbuf->nacl_abi_st_mode = NACL_ABI_S_IFMUTEX;
76 0 : return 0;
77 : }
78 :
79 0 : static int NaClDescMutexLock(struct NaClDesc *vself) {
80 0 : struct NaClDescMutex *self = (struct NaClDescMutex *) vself;
81 :
82 0 : NaClSyncStatus status = NaClIntrMutexLock(&self->mu);
83 :
84 0 : return -NaClXlateNaClSyncStatus(status);
85 : }
86 :
87 0 : static int NaClDescMutexTryLock(struct NaClDesc *vself) {
88 0 : struct NaClDescMutex *self = (struct NaClDescMutex *) vself;
89 :
90 0 : NaClSyncStatus status = NaClIntrMutexTryLock(&self->mu);
91 :
92 0 : return -NaClXlateNaClSyncStatus(status);
93 : }
94 :
95 0 : static int NaClDescMutexUnlock(struct NaClDesc *vself) {
96 0 : struct NaClDescMutex *self = (struct NaClDescMutex *) vself;
97 :
98 0 : NaClSyncStatus status = NaClIntrMutexUnlock(&self->mu);
99 :
100 0 : return -NaClXlateNaClSyncStatus(status);
101 : }
102 :
103 : static struct NaClDescVtbl const kNaClDescMutexVtbl = {
104 : {
105 : NaClDescMutexDtor,
106 : },
107 : NaClDescMapNotImplemented,
108 : NACL_DESC_UNMAP_NOT_IMPLEMENTED
109 : NaClDescReadNotImplemented,
110 : NaClDescWriteNotImplemented,
111 : NaClDescSeekNotImplemented,
112 : NaClDescPReadNotImplemented,
113 : NaClDescPWriteNotImplemented,
114 : NaClDescMutexFstat,
115 : NaClDescGetdentsNotImplemented,
116 : NaClDescExternalizeSizeNotImplemented,
117 : NaClDescExternalizeNotImplemented,
118 : NaClDescMutexLock,
119 : NaClDescMutexTryLock,
120 : NaClDescMutexUnlock,
121 : NaClDescWaitNotImplemented,
122 : NaClDescTimedWaitAbsNotImplemented,
123 : NaClDescSignalNotImplemented,
124 : NaClDescBroadcastNotImplemented,
125 : NaClDescSendMsgNotImplemented,
126 : NaClDescRecvMsgNotImplemented,
127 : NaClDescLowLevelSendMsgNotImplemented,
128 : NaClDescLowLevelRecvMsgNotImplemented,
129 : NaClDescConnectAddrNotImplemented,
130 : NaClDescAcceptConnNotImplemented,
131 : NaClDescPostNotImplemented,
132 : NaClDescSemWaitNotImplemented,
133 : NaClDescGetValueNotImplemented,
134 : NaClDescSetMetadata,
135 : NaClDescGetMetadata,
136 : NaClDescSetFlags,
137 : NaClDescGetFlags,
138 : NaClDescIsattyNotImplemented,
139 : NACL_DESC_MUTEX,
140 : };
|