1 : /*
2 : * Copyright 2008 The Native Client Authors. All rights reserved.
3 : * Use of this source code is governed by a BSD-style license that can
4 : * be 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/sys/errno.h"
28 : #include "native_client/src/trusted/service_runtime/include/sys/fcntl.h"
29 : #include "native_client/src/trusted/service_runtime/include/sys/mman.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 : }
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 : int NaClDescSemaphoreFstat(struct NaClDesc *vself,
69 0 : struct nacl_abi_stat *statbuf) {
70 : 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 : 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 : NaClDescUnmapUnsafeNotImplemented,
114 : NaClDescUnmapNotImplemented,
115 : NaClDescReadNotImplemented,
116 : NaClDescWriteNotImplemented,
117 : NaClDescSeekNotImplemented,
118 : NaClDescIoctlNotImplemented,
119 : NaClDescSemaphoreFstat,
120 : NaClDescGetdentsNotImplemented,
121 : NACL_DESC_SEMAPHORE,
122 : NaClDescExternalizeSizeNotImplemented,
123 : NaClDescExternalizeNotImplemented,
124 : NaClDescLockNotImplemented,
125 : NaClDescTryLockNotImplemented,
126 : NaClDescUnlockNotImplemented,
127 : NaClDescWaitNotImplemented,
128 : NaClDescTimedWaitAbsNotImplemented,
129 : NaClDescSignalNotImplemented,
130 : NaClDescBroadcastNotImplemented,
131 : NaClDescSendMsgNotImplemented,
132 : NaClDescRecvMsgNotImplemented,
133 : NaClDescConnectAddrNotImplemented,
134 : NaClDescAcceptConnNotImplemented,
135 : NaClDescSemaphorePost,
136 : NaClDescSemaphoreSemWait,
137 : NaClDescSemaphoreGetValue,
138 : };
|