15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* -*- c++ -*- */
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2012 The Chromium Authors. All rights reserved.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class containing information regarding a socket connection to a
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// service runtime instance.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_SERVICE_RUNTIME_H_
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_SERVICE_RUNTIME_H_
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_macros.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_scoped_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/shared/platform/nacl_sync.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/shared/srpc/nacl_srpc.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/trusted/reverse_service/reverse_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/trusted/weak_ref/weak_ref.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/completion_callback.h"
22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/utility.h"
23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct NaClFileInfo;
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace plugin {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ErrorInfo;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Plugin;
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass SelLdrLauncherChrome;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SrpcClient;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceRuntime;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Struct of params used by StartSelLdr.  Use a struct so that callback
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// creation templates aren't overwhelmed with too many parameters.
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstruct SelLdrStartParams {
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SelLdrStartParams(const std::string& url,
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    const PP_NaClFileInfo& file_info,
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    bool uses_irt,
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    bool uses_ppapi,
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    bool enable_dyncode_syscalls,
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    bool enable_exception_handling,
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    bool enable_crash_throttling)
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : url(url),
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        file_info(file_info),
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        uses_irt(uses_irt),
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        uses_ppapi(uses_ppapi),
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        enable_dyncode_syscalls(enable_dyncode_syscalls),
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        enable_exception_handling(enable_exception_handling),
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        enable_crash_throttling(enable_crash_throttling) {
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string url;
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PP_NaClFileInfo file_info;
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool uses_irt;
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool uses_ppapi;
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool enable_dev_interfaces;
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool enable_dyncode_syscalls;
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool enable_exception_handling;
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool enable_crash_throttling;
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback resources are essentially our continuation state.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct OpenManifestEntryResource {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenManifestEntryResource(const std::string& target_url,
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            struct NaClFileInfo* finfo,
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            bool* op_complete)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : url(target_url),
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        file_info(finfo),
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        op_complete_ptr(op_complete) {}
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ~OpenManifestEntryResource();
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url;
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  struct NaClFileInfo* file_info;
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PP_NaClFileInfo pp_file_info;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool* op_complete_ptr;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do not invoke from the main thread, since the main methods will
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// invoke CallOnMainThread and then wait on a condvar for the task to
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// complete: if invoked from the main thread, the main method not
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returning (and thus unblocking the main thread) means that the
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// main-thread continuation methods will never get called, and thus
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we'd get a deadlock.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginReverseInterface: public nacl::ReverseInterface {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginReverseInterface(nacl::WeakRefAnchor* anchor,
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         PP_Instance pp_instance,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         ServiceRuntime* service_runtime,
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         pp::CompletionCallback init_done_cb);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PluginReverseInterface();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShutDown();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void DoPostMessage(std::string message);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartupInitializationComplete();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool OpenManifestEntry(std::string url_key,
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 struct NaClFileInfo *info);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReportCrash();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReportExitStatus(int exit_status);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(teravest): Remove this method once it's gone from
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // nacl::ReverseInterface.
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual int64_t RequestQuotaForWrite(std::string file_id,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int64_t offset,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int64_t bytes_to_write);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OpenManifestEntry_MainThreadContinuation(
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenManifestEntryResource* p,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32_t err);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StreamAsFile_MainThreadContinuation(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenManifestEntryResource* p,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32_t result);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::WeakRefAnchor* anchor_;  // holds a ref
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Should be used only in main thread in WeakRef-protected callbacks.
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PP_Instance pp_instance_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceRuntime* service_runtime_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClMutex mu_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClCondVar cv_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool shutting_down_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::CompletionCallback init_done_cb_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  ServiceRuntime abstracts a NativeClient sel_ldr instance.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceRuntime {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceRuntime(Plugin* plugin,
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 PP_Instance pp_instance,
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 bool main_service_runtime,
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 bool uses_nonsfi_mode,
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 pp::CompletionCallback init_done_cb);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The destructor terminates the sel_ldr process.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ServiceRuntime();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Spawn the sel_ldr instance.
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void StartSelLdr(const SelLdrStartParams& params,
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   pp::CompletionCallback callback);
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // If starting sel_ldr from a background thread, wait for sel_ldr to
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // actually start. Returns |false| if timed out waiting for the process
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // to start. Otherwise, returns |true| if StartSelLdr is complete
152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // (either successfully or unsuccessfully).
153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool WaitForSelLdrStart();
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Signal to waiting threads that StartSelLdr is complete (either
156a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // successfully or unsuccessfully).
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void SignalStartSelLdrDone();
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If starting the nexe from a background thread, wait for the nexe to
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // actually start. Returns |true| is the nexe started successfully.
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool WaitForNexeStart();
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Signal to waiting threads that LoadNexeAndStart is complete (either
16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // successfully or unsuccessfully).
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SignalNexeStarted(bool ok);
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Establish an SrpcClient to the sel_ldr instance and start the nexe.
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // This function must be called on the main thread.
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // This function must only be called once.
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void StartNexe();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the application channel to the nexe.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrpcClient* SetupAppChannel();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool RemoteLog(int severity, const std::string& msg);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Plugin* plugin() const { return plugin_; }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Shutdown();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool main_service_runtime() const { return main_service_runtime_; }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NACL_DISALLOW_COPY_AND_ASSIGN(ServiceRuntime);
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool StartNexeInternal();
184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool SetupCommandChannel();
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool InitReverseService();
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool StartModule();
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ReapLogs();
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ReportLoadError(const ErrorInfo& error_info);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClSrpcChannel command_channel_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Plugin* plugin_;
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PP_Instance pp_instance_;
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool main_service_runtime_;
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool uses_nonsfi_mode_;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::ReverseService* reverse_service_;
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  nacl::scoped_ptr<SelLdrLauncherChrome> subprocess_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::WeakRefAnchor* anchor_;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginReverseInterface* rev_interface_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Mutex and CondVar to protect start_sel_ldr_done_ and nexe_started_.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClMutex mu_;
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NaClCondVar cond_;
2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool start_sel_ldr_done_;
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool start_nexe_done_;
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool nexe_started_ok_;
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  NaClHandle bootstrap_channel_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace plugin
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_SERVICE_RUNTIME_H_
217