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. Semaphore 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 :
18 : #include "native_client/src/shared/platform/nacl_host_desc.h"
19 : #include "native_client/src/shared/platform/nacl_log.h"
20 : #include "native_client/src/shared/platform/nacl_semaphore.h"
21 :
22 : #include "native_client/src/trusted/desc/nacl_desc_base.h"
23 : #include "native_client/src/trusted/desc/nacl_desc_semaphore.h"
24 :
25 : #include "native_client/src/trusted/service_runtime/internal_errno.h"
26 : #include "native_client/src/trusted/service_runtime/nacl_config.h"
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 : /*
34 : * This file contains the implementation for the NaClDescSemaphore subclass
35 : * of NaClDesc.
36 : *
37 : * NaClDescSemaphore is the subclass that wraps host-OS semaphore abstractions
38 : */
39 :
40 : static struct NaClDescVtbl const kNaClDescSemaphoreVtbl; /* fwd */
41 :
42 0 : int NaClDescSemaphoreCtor(struct NaClDescSemaphore *self, int value) {
43 0 : struct NaClDesc *basep = (struct NaClDesc *) self;
44 :
45 0 : basep->base.vtbl = (struct NaClRefCountVtbl const *) NULL;
46 0 : if (!NaClDescCtor(basep)) {
47 0 : return 0;
48 : }
49 0 : if (!NaClSemCtor(&self->sem, value)) {
50 0 : (*basep->base.vtbl->Dtor)(&basep->base);
51 0 : return 0;
52 : }
53 :
54 0 : basep->base.vtbl = (struct NaClRefCountVtbl const *) &kNaClDescSemaphoreVtbl;
55 0 : return 1;
56 0 : }
57 :
58 0 : void NaClDescSemaphoreDtor(struct NaClRefCount *vself) {
59 0 : struct NaClDescSemaphore *self = (struct NaClDescSemaphore *) vself;
60 :
61 0 : NaClLog(4, "NaClDescSemaphoreDtor(0x%08"NACL_PRIxPTR").\n",
62 : (uintptr_t) vself);
63 0 : NaClSemDtor(&self->sem);
64 0 : vself->vtbl = (struct NaClRefCountVtbl const *) &kNaClDescVtbl;
65 0 : (*vself->vtbl->Dtor)(vself);
66 0 : }
67 :
68 0 : int NaClDescSemaphoreFstat(struct NaClDesc *vself,
69 0 : struct nacl_abi_stat *statbuf) {
70 0 : UNREFERENCED_PARAMETER(vself);
71 :
72 0 : memset(statbuf, 0, sizeof *statbuf);
73 0 : statbuf->nacl_abi_st_mode = NACL_ABI_S_IFSEMA;
74 0 : return 0;
75 : }
76 :
77 0 : int NaClDescSemaphorePost(struct NaClDesc *vself) {
78 0 : struct NaClDescSemaphore *self = (struct NaClDescSemaphore *)vself;
79 0 : NaClSyncStatus status = NaClSemPost(&self->sem);
80 :
81 0 : return -NaClXlateNaClSyncStatus(status);
82 : }
83 :
84 0 : int NaClDescSemaphoreSemWait(struct NaClDesc *vself) {
85 0 : struct NaClDescSemaphore *self = (struct NaClDescSemaphore *)vself;
86 0 : NaClSyncStatus status = NaClSemWait(&self->sem);
87 :
88 0 : return -NaClXlateNaClSyncStatus(status);
89 : }
90 :
91 0 : int NaClDescSemaphoreGetValue(struct NaClDesc *vself) {
92 0 : UNREFERENCED_PARAMETER(vself);
93 :
94 0 : NaClLog(LOG_ERROR, "SemGetValue is not implemented yet\n");
95 0 : return -NACL_ABI_EINVAL;
96 : /*
97 : * TODO(gregoryd): sem_getvalue is not implemented on OSX.
98 : * Remove this syscall or implement it using semctl
99 : */
100 : #if 0
101 : struct NaClDescSemaphore *self = (struct NaClDescSemaphore *) vself;
102 : NaClSyncStatus status = NaClSemGetValue(&self->sem);
103 : return NaClXlateNaClSyncStatus(status);
104 : #endif
105 : }
106 :
107 :
108 : static struct NaClDescVtbl const kNaClDescSemaphoreVtbl = {
109 : {
110 : (void (*)(struct NaClRefCount *)) NaClDescSemaphoreDtor,
111 : },
112 : NaClDescMapNotImplemented,
113 : NACL_DESC_UNMAP_NOT_IMPLEMENTED
114 : NaClDescReadNotImplemented,
115 : NaClDescWriteNotImplemented,
116 : NaClDescSeekNotImplemented,
117 : NaClDescPReadNotImplemented,
118 : NaClDescPWriteNotImplemented,
119 : NaClDescSemaphoreFstat,
120 : NaClDescGetdentsNotImplemented,
121 : NaClDescExternalizeSizeNotImplemented,
122 : NaClDescExternalizeNotImplemented,
123 : NaClDescLockNotImplemented,
124 : NaClDescTryLockNotImplemented,
125 : NaClDescUnlockNotImplemented,
126 : NaClDescWaitNotImplemented,
127 : NaClDescTimedWaitAbsNotImplemented,
128 : NaClDescSignalNotImplemented,
129 : NaClDescBroadcastNotImplemented,
130 : NaClDescSendMsgNotImplemented,
131 : NaClDescRecvMsgNotImplemented,
132 : NaClDescLowLevelSendMsgNotImplemented,
133 : NaClDescLowLevelRecvMsgNotImplemented,
134 : NaClDescConnectAddrNotImplemented,
135 : NaClDescAcceptConnNotImplemented,
136 : NaClDescSemaphorePost,
137 : NaClDescSemaphoreSemWait,
138 : NaClDescSemaphoreGetValue,
139 : NaClDescSetMetadata,
140 : NaClDescGetMetadata,
141 : NaClDescSetFlags,
142 : NaClDescGetFlags,
143 : NaClDescIsattyNotImplemented,
144 : NACL_DESC_SEMAPHORE,
145 : };
|