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