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/reverse_service/reverse_socket.h" | 7 #include "native_client/src/trusted/reverse_service/reverse_socket.h" |
8 | 8 |
9 #include "native_client/src/include/nacl_scoped_ptr.h" | 9 #include "native_client/src/include/nacl_scoped_ptr.h" |
10 #include "native_client/src/shared/platform/nacl_log.h" | 10 #include "native_client/src/shared/platform/nacl_log.h" |
11 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" | 11 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" |
12 #include "native_client/src/trusted/nacl_base/nacl_refcount.h" | 12 #include "native_client/src/trusted/nacl_base/nacl_refcount.h" |
13 #include "native_client/src/trusted/desc/nacl_desc_base.h" | 13 #include "native_client/src/trusted/desc/nacl_desc_base.h" |
14 #include "native_client/src/trusted/simple_service/nacl_simple_rservice.h" | 14 #include "native_client/src/trusted/simple_service/nacl_simple_rservice.h" |
15 | 15 |
16 namespace nacl { | 16 namespace nacl { |
17 | 17 |
18 ReverseSocket::~ReverseSocket() { | 18 ReverseSocket::~ReverseSocket() { |
19 NaClLog(4, "~ReverseSocket, about to delete conn_cap_ 0x%"NACL_PRIxPTR"\n", | 19 NaClLog(4, "~ReverseSocket, about to delete conn_cap_ 0x%"NACL_PRIxPTR"\n", |
20 (uintptr_t) conn_cap_); | 20 (uintptr_t) conn_cap_); |
21 delete conn_cap_; | 21 delete conn_cap_; |
22 NaClRefCountUnref(reinterpret_cast<NaClRefCount*>(rev_service_)); | 22 NaClRefCountUnref(reinterpret_cast<NaClRefCount*>(rev_service_)); |
23 rev_service_ = NULL; | 23 rev_service_ = NULL; |
24 } | 24 } |
25 | 25 |
26 bool ReverseSocket::StartService(void* server_instance_data) { | 26 bool ReverseSocket::StartServiceCb(void (*exit_cb)(void *server_instance_data, |
| 27 int server_loop_ret), |
| 28 void* server_instance_data) { |
27 NaClLog(4, "Entered ReverseSocket::StartService\n"); | 29 NaClLog(4, "Entered ReverseSocket::StartService\n"); |
28 nacl::scoped_ptr_malloc<NaClSimpleRevService> rev_service_tmp( | 30 nacl::scoped_ptr_malloc<NaClSimpleRevService> rev_service_tmp( |
29 reinterpret_cast<NaClSimpleRevService*>( | 31 reinterpret_cast<NaClSimpleRevService*>( |
30 malloc(sizeof(NaClSimpleRevService)))); | 32 malloc(sizeof(NaClSimpleRevService)))); |
31 if (NULL == rev_service_tmp.get()) { | 33 if (NULL == rev_service_tmp.get()) { |
32 NaClLog(4, "FAILURE: Leaving ReverseSocket::StartService\n"); | 34 NaClLog(4, "FAILURE: Leaving ReverseSocket::StartService\n"); |
33 return false; | 35 return false; |
34 } | 36 } |
35 nacl::scoped_ptr_nacl_refcount<NaClSimpleRevService> ref( | 37 nacl::scoped_ptr_nacl_refcount<NaClSimpleRevService> ref( |
36 &rev_service_tmp, | 38 &rev_service_tmp, |
37 NaClSimpleRevServiceCtor(rev_service_tmp.get(), | 39 NaClSimpleRevServiceCtor(rev_service_tmp.get(), |
38 NaClDescRef(conn_cap_->desc()), | 40 NaClDescRef(conn_cap_->desc()), |
39 handlers_, | 41 handlers_, |
40 thread_factory_fn_, | 42 thread_factory_fn_, |
41 thread_factory_data_)); | 43 thread_factory_data_)); |
42 if (!ref.constructed()) { | 44 if (!ref.constructed()) { |
43 NaClLog(4, "FAILURE: Leaving ReverseSocket::StartService\n"); | 45 NaClLog(4, "FAILURE: Leaving ReverseSocket::StartService\n"); |
44 NaClDescUnref(conn_cap_->desc()); | 46 NaClDescUnref(conn_cap_->desc()); |
45 return false; | 47 return false; |
46 } | 48 } |
47 | 49 |
48 rev_service_ = ref.release(); | 50 rev_service_ = ref.release(); |
49 | 51 |
50 NaClLog(4, "ReverseSocket::StartService: invoking ConnectAndSpawnHandler\n"); | 52 NaClLog(4, "ReverseSocket::StartService: invoking ConnectAndSpawnHandler\n"); |
51 if (0 != (*NACL_VTBL(NaClSimpleRevService, rev_service_)-> | 53 if (0 != (*NACL_VTBL(NaClSimpleRevService, rev_service_)-> |
52 ConnectAndSpawnHandler)(rev_service_, | 54 ConnectAndSpawnHandlerCb)(rev_service_, |
53 server_instance_data)) { | 55 exit_cb, |
| 56 server_instance_data)) { |
54 NaClLog(4, "FAILURE: Leaving ReverseSocket::StartService\n"); | 57 NaClLog(4, "FAILURE: Leaving ReverseSocket::StartService\n"); |
55 return false; | 58 return false; |
56 } | 59 } |
57 // Handler thread has its own reference to rev_service_.get(), so | 60 // Handler thread has its own reference to rev_service_.get(), so |
58 // our Dtor unreferencing it doesn't matter. | 61 // our Dtor unreferencing it doesn't matter. |
59 NaClLog(4, "Leaving ReverseSocket::StartService\n"); | 62 NaClLog(4, "Leaving ReverseSocket::StartService\n"); |
60 return true; | 63 return true; |
61 } | 64 } |
62 | 65 |
| 66 bool ReverseSocket::StartService(void* server_instance_data) { |
| 67 return StartServiceCb(NULL, server_instance_data); |
| 68 } |
| 69 |
63 } // namespace nacl | 70 } // namespace nacl |
OLD | NEW |