OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 #include "native_client/src/trusted/simple_service/nacl_simple_service.h" | 7 #include "native_client/src/trusted/simple_service/nacl_simple_service.h" |
8 | 8 |
9 #include "native_client/src/include/nacl_compiler_annotations.h" | 9 #include "native_client/src/include/nacl_compiler_annotations.h" |
10 | 10 |
(...skipping 13 matching lines...) Expand all Loading... |
24 #include "native_client/src/trusted/service_runtime/include/sys/errno.h" | 24 #include "native_client/src/trusted/service_runtime/include/sys/errno.h" |
25 | 25 |
26 #include "native_client/src/trusted/threading/nacl_thread_interface.h" | 26 #include "native_client/src/trusted/threading/nacl_thread_interface.h" |
27 | 27 |
28 int NaClSimpleServiceConnectionCtor( | 28 int NaClSimpleServiceConnectionCtor( |
29 struct NaClSimpleServiceConnection *self, | 29 struct NaClSimpleServiceConnection *self, |
30 struct NaClSimpleService *server, | 30 struct NaClSimpleService *server, |
31 struct NaClDesc *conn, | 31 struct NaClDesc *conn, |
32 void *instance_data) { | 32 void *instance_data) { |
33 NaClLog(4, | 33 NaClLog(4, |
34 "NaClSimpleServiceConnectionCtor: this 0x%"NACL_PRIxPTR"\n", | 34 "NaClSimpleServiceConnectionCtor: self 0x%"NACL_PRIxPTR"\n", |
35 (uintptr_t) self); | 35 (uintptr_t) self); |
36 if (!NaClRefCountCtor((struct NaClRefCount *) self)) { | 36 if (!NaClRefCountCtor((struct NaClRefCount *) self)) { |
37 return 0; | 37 return 0; |
38 } | 38 } |
39 self->server = (struct NaClSimpleService *) NaClRefCountRef( | 39 self->server = (struct NaClSimpleService *) NaClRefCountRef( |
40 (struct NaClRefCount *) server); | 40 (struct NaClRefCount *) server); |
41 self->connected_socket = (struct NaClDesc *) NaClRefCountRef( | 41 self->connected_socket = (struct NaClDesc *) NaClRefCountRef( |
42 (struct NaClRefCount *) conn); | 42 (struct NaClRefCount *) conn); |
43 self->instance_data = instance_data; | 43 self->instance_data = instance_data; |
44 | 44 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 NaClRefCountUnref((struct NaClRefCount *) conn); | 114 NaClRefCountUnref((struct NaClRefCount *) conn); |
115 return (void *) NULL; | 115 return (void *) NULL; |
116 } | 116 } |
117 | 117 |
118 static int NaClSimpleServiceCtorIntern( | 118 static int NaClSimpleServiceCtorIntern( |
119 struct NaClSimpleService *self, | 119 struct NaClSimpleService *self, |
120 struct NaClSrpcHandlerDesc const *srpc_handlers, | 120 struct NaClSrpcHandlerDesc const *srpc_handlers, |
121 NaClThreadIfFactoryFunction thread_factory_fn, | 121 NaClThreadIfFactoryFunction thread_factory_fn, |
122 void *thread_factory_data) { | 122 void *thread_factory_data) { |
123 NaClLog(4, | 123 NaClLog(4, |
124 "NaClSimpleServiceCtorIntern, this 0x%"NACL_PRIxPTR"\n", | 124 "NaClSimpleServiceCtorIntern, self 0x%"NACL_PRIxPTR"\n", |
125 (uintptr_t) self); | 125 (uintptr_t) self); |
126 if (!NaClRefCountCtor((struct NaClRefCount *) self)) { | 126 if (!NaClRefCountCtor((struct NaClRefCount *) self)) { |
127 NaClLog(4, "NaClSimpleServiceCtorIntern: NaClRefCountCtor failed\n"); | 127 NaClLog(4, "NaClSimpleServiceCtorIntern: NaClRefCountCtor failed\n"); |
128 return 0; | 128 return 0; |
129 } | 129 } |
130 self->handlers = srpc_handlers; | 130 self->handlers = srpc_handlers; |
131 self->thread_factory_fn = thread_factory_fn; | 131 self->thread_factory_fn = thread_factory_fn; |
132 self->thread_factory_data = thread_factory_data; | 132 self->thread_factory_data = thread_factory_data; |
133 self->acceptor = (struct NaClThreadInterface *) NULL; | 133 self->acceptor = (struct NaClThreadInterface *) NULL; |
134 | 134 |
135 self->base.vtbl = (struct NaClRefCountVtbl const *) &kNaClSimpleServiceVtbl; | 135 self->base.vtbl = (struct NaClRefCountVtbl const *) &kNaClSimpleServiceVtbl; |
136 NaClLog(4, "Leaving NaClSimpleServiceCtorIntern\n"); | 136 NaClLog(4, "Leaving NaClSimpleServiceCtorIntern\n"); |
137 return 1; | 137 return 1; |
138 } | 138 } |
139 | 139 |
140 int NaClSimpleServiceCtor( | 140 int NaClSimpleServiceCtor( |
141 struct NaClSimpleService *self, | 141 struct NaClSimpleService *self, |
142 struct NaClSrpcHandlerDesc const *srpc_handlers, | 142 struct NaClSrpcHandlerDesc const *srpc_handlers, |
143 NaClThreadIfFactoryFunction thread_factory_fn, | 143 NaClThreadIfFactoryFunction thread_factory_fn, |
144 void *thread_factory_data) { | 144 void *thread_factory_data) { |
145 NaClLog(4, | 145 NaClLog(4, |
146 "NaClSimpleServiceCtor: this 0x%"NACL_PRIxPTR"\n", | 146 "Entered NaClSimpleServiceCtor: self 0x%"NACL_PRIxPTR"\n", |
147 (uintptr_t) self); | 147 (uintptr_t) self); |
148 | 148 |
149 if (0 != NaClCommonDescMakeBoundSock(self->bound_and_cap)) { | 149 if (0 != NaClCommonDescMakeBoundSock(self->bound_and_cap)) { |
150 return 0; | 150 return 0; |
151 } | 151 } |
152 if (!NaClSimpleServiceCtorIntern(self, srpc_handlers, | 152 if (!NaClSimpleServiceCtorIntern(self, srpc_handlers, |
153 thread_factory_fn, thread_factory_data)) { | 153 thread_factory_fn, thread_factory_data)) { |
154 NaClDescUnref(self->bound_and_cap[0]); | 154 NaClDescUnref(self->bound_and_cap[0]); |
155 NaClDescUnref(self->bound_and_cap[1]); | 155 NaClDescUnref(self->bound_and_cap[1]); |
156 return 0; | 156 return 0; |
157 } | 157 } |
158 return 1; | 158 return 1; |
159 } | 159 } |
160 | 160 |
161 int NaClSimpleServiceWithSocketCtor( | 161 int NaClSimpleServiceWithSocketCtor( |
162 struct NaClSimpleService *self, | 162 struct NaClSimpleService *self, |
163 struct NaClSrpcHandlerDesc const *srpc_handlers, | 163 struct NaClSrpcHandlerDesc const *srpc_handlers, |
164 NaClThreadIfFactoryFunction thread_factory_fn, | 164 NaClThreadIfFactoryFunction thread_factory_fn, |
165 void *thread_factory_data, | 165 void *thread_factory_data, |
166 struct NaClDesc *service_port, | 166 struct NaClDesc *service_port, |
167 struct NaClDesc *sock_addr) { | 167 struct NaClDesc *sock_addr) { |
168 NaClLog(4, | 168 NaClLog(4, |
169 "NaClSimpleServiceWithSocketCtor: this 0x%"NACL_PRIxPTR"\n", | 169 "NaClSimpleServiceWithSocketCtor: self 0x%"NACL_PRIxPTR"\n", |
170 (uintptr_t) self); | 170 (uintptr_t) self); |
171 if (!NaClSimpleServiceCtorIntern(self, srpc_handlers, | 171 if (!NaClSimpleServiceCtorIntern(self, srpc_handlers, |
172 thread_factory_fn, thread_factory_data)) { | 172 thread_factory_fn, thread_factory_data)) { |
173 return 0; | 173 return 0; |
174 } | 174 } |
175 self->bound_and_cap[0] = NaClDescRef(service_port); | 175 self->bound_and_cap[0] = NaClDescRef(service_port); |
176 self->bound_and_cap[1] = NaClDescRef(sock_addr); | 176 self->bound_and_cap[1] = NaClDescRef(sock_addr); |
177 | 177 |
178 return 1; | 178 return 1; |
179 } | 179 } |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 | 269 |
270 status = (*NACL_VTBL(NaClSimpleService, self)->ConnectionFactory)( | 270 status = (*NACL_VTBL(NaClSimpleService, self)->ConnectionFactory)( |
271 self, | 271 self, |
272 connected_desc, | 272 connected_desc, |
273 &conn); | 273 &conn); |
274 if (0 != status) { | 274 if (0 != status) { |
275 NaClLog(4, "ConnectionFactory failed\n"); | 275 NaClLog(4, "ConnectionFactory failed\n"); |
276 goto cleanup; | 276 goto cleanup; |
277 } | 277 } |
278 /* all okay! */ | 278 /* all okay! */ |
279 NaClLog(4, "conn is 0x%"NACL_PRIxPTR"\n", (uintptr_t) conn); | 279 |
280 NaClLog(4, "out is 0x%"NACL_PRIxPTR"\n", (uintptr_t) out); | 280 NaClLog(4, |
| 281 "NaClSimpleServiceAcceptConnection: conn is 0x%"NACL_PRIxPTR"\n", |
| 282 (uintptr_t) conn); |
| 283 NaClLog(4, |
| 284 "NaClSimpleServiceAcceptConnection: out is 0x%"NACL_PRIxPTR"\n", |
| 285 (uintptr_t) out); |
281 *out = conn; | 286 *out = conn; |
282 status = 0; | 287 status = 0; |
283 cleanup: | 288 cleanup: |
284 NaClRefCountSafeUnref((struct NaClRefCount *) connected_desc); | 289 NaClRefCountSafeUnref((struct NaClRefCount *) connected_desc); |
285 NaClLog(4, "Leaving NaClSimpleServiceAcceptConnection, status %d\n", status); | 290 NaClLog(4, "Leaving NaClSimpleServiceAcceptConnection, status %d\n", status); |
286 return status; | 291 return status; |
287 } | 292 } |
288 | 293 |
289 int NaClSimpleServiceAcceptAndSpawnHandler( | 294 int NaClSimpleServiceAcceptAndSpawnHandler( |
290 struct NaClSimpleService *self) { | 295 struct NaClSimpleService *self) { |
291 struct NaClSimpleServiceConnection *conn = NULL; | 296 struct NaClSimpleServiceConnection *conn = NULL; |
292 int status; | 297 int status; |
293 | 298 |
294 NaClLog(4, "Entered NaClSimpleServiceAcceptAndSpawnHandler\n"); | 299 NaClLog(4, "Entered NaClSimpleServiceAcceptAndSpawnHandler\n"); |
295 NaClLog(4, | 300 NaClLog(4, |
296 ("NaClSimpleServiceAcceptAndSpawnHandler:" | 301 ("NaClSimpleServiceAcceptAndSpawnHandler:" |
297 " &conn is 0x%"NACL_PRIxPTR"\n"), | 302 " &conn is 0x%"NACL_PRIxPTR"\n"), |
298 (uintptr_t) &conn); | 303 (uintptr_t) &conn); |
299 status = (*NACL_VTBL(NaClSimpleService, self)->AcceptConnection)( | 304 status = (*NACL_VTBL(NaClSimpleService, self)->AcceptConnection)( |
300 self, | 305 self, |
301 &conn); | 306 &conn); |
302 NaClLog(4, "AcceptConnection vfn returned %d\n", status); | 307 NaClLog(4, "AcceptConnection vfn returned %d\n", status); |
303 if (0 != status) { | 308 if (0 != status) { |
304 goto abort; | 309 goto abort; |
305 } | 310 } |
306 NaClLog(4, "conn is 0x%"NACL_PRIxPTR"\n", (uintptr_t) conn); | 311 NaClLog(4, |
| 312 "NaClSimpleServiceAcceptAndSpawnHandler: conn is 0x%"NACL_PRIxPTR"\n", |
| 313 (uintptr_t) conn); |
307 NaClLog(4, "NaClSimpleServiceAcceptAndSpawnHandler: spawning thread\n"); | 314 NaClLog(4, "NaClSimpleServiceAcceptAndSpawnHandler: spawning thread\n"); |
308 | 315 |
309 CHECK(NULL == conn->thread); | 316 CHECK(NULL == conn->thread); |
310 | 317 |
311 /* ownership of |conn| reference is passed to the thread */ | 318 /* ownership of |conn| reference is passed to the thread */ |
312 if (!NaClThreadInterfaceConstructAndStartThread( | 319 if (!NaClThreadInterfaceConstructAndStartThread( |
313 self->thread_factory_fn, | 320 self->thread_factory_fn, |
314 self->thread_factory_data, | 321 self->thread_factory_data, |
315 RpcHandlerBase, | 322 RpcHandlerBase, |
316 conn, | 323 conn, |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 NACL_KERN_STACK_SIZE, | 375 NACL_KERN_STACK_SIZE, |
369 &server->acceptor)) { | 376 &server->acceptor)) { |
370 NaClLog(4, "NaClSimpleServiceStartServiceThread: no thread\n"); | 377 NaClLog(4, "NaClSimpleServiceStartServiceThread: no thread\n"); |
371 NaClRefCountUnref(&server->base); /* undo ref in Ctor call arglist */ | 378 NaClRefCountUnref(&server->base); /* undo ref in Ctor call arglist */ |
372 server->acceptor = NULL; | 379 server->acceptor = NULL; |
373 return 0; | 380 return 0; |
374 } | 381 } |
375 NaClLog(4, "NaClSimpleServiceStartServiceThread: success\n"); | 382 NaClLog(4, "NaClSimpleServiceStartServiceThread: success\n"); |
376 return 1; | 383 return 1; |
377 } | 384 } |
OLD | NEW |