service_runtime.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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)
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <set>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_macros.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_scoped_ptr.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/nacl_string.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/shared/platform/nacl_sync.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/shared/srpc/nacl_srpc.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/trusted/nonnacl_util/sel_ldr_launcher.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/trusted/reverse_service/reverse_service.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/trusted/weak_ref/weak_ref.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/completion_callback.h"
27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/utility.h"
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct NaClFileInfo;
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace nacl {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescWrapper;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace plugin {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class OpenManifestEntryAsyncCallback;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Plugin;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SrpcClient;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceRuntime;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Struct of params used by StartSelLdr.  Use a struct so that callback
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// creation templates aren't overwhelmed with too many parameters.
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstruct SelLdrStartParams {
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SelLdrStartParams(const nacl::string& url,
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    bool uses_irt,
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    bool uses_ppapi,
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    bool uses_nonsfi_mode,
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    bool enable_dyncode_syscalls,
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    bool enable_exception_handling,
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    bool enable_crash_throttling)
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : url(url),
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        uses_irt(uses_irt),
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        uses_ppapi(uses_ppapi),
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        uses_nonsfi_mode(uses_nonsfi_mode),
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        enable_dyncode_syscalls(enable_dyncode_syscalls),
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        enable_exception_handling(enable_exception_handling),
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        enable_crash_throttling(enable_crash_throttling) {
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  nacl::string url;
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool uses_irt;
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool uses_ppapi;
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool uses_nonsfi_mode;
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool enable_dev_interfaces;
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool enable_dyncode_syscalls;
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool enable_exception_handling;
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool enable_crash_throttling;
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback resources are essentially our continuation state.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct OpenManifestEntryResource {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenManifestEntryResource(const std::string& target_url,
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            struct NaClFileInfo* finfo,
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            bool* op_complete,
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            OpenManifestEntryAsyncCallback* callback)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : url(target_url),
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        file_info(finfo),
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        op_complete_ptr(op_complete),
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        callback(callback) {}
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ~OpenManifestEntryResource();
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void MaybeRunCallback(int32_t pp_error);
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url;
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  struct NaClFileInfo* file_info;
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PP_NaClFileInfo pp_file_info;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool* op_complete_ptr;
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  OpenManifestEntryAsyncCallback* callback;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do not invoke from the main thread, since the main methods will
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// invoke CallOnMainThread and then wait on a condvar for the task to
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// complete: if invoked from the main thread, the main method not
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returning (and thus unblocking the main thread) means that the
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// main-thread continuation methods will never get called, and thus
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we'd get a deadlock.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginReverseInterface: public nacl::ReverseInterface {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginReverseInterface(nacl::WeakRefAnchor* anchor,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         Plugin* plugin,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         ServiceRuntime* service_runtime,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         pp::CompletionCallback init_done_cb,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         pp::CompletionCallback crash_cb);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PluginReverseInterface();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShutDown();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DoPostMessage(nacl::string message);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartupInitializationComplete();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool OpenManifestEntry(nacl::string url_key,
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 struct NaClFileInfo *info);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CloseManifestEntry(int32_t desc);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReportCrash();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReportExitStatus(int exit_status);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(teravest): Remove this method once it's gone from
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // nacl::ReverseInterface.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int64_t RequestQuotaForWrite(nacl::string file_id,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int64_t offset,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int64_t bytes_to_write);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // This is a sibling of OpenManifestEntry. While OpenManifestEntry is
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // a sync function and must be called on a non-main thread,
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // OpenManifestEntryAsync must be called on the main thread. Upon completion
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // (even on error), callback will be invoked. The caller has responsibility
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // to keep the memory passed to info until callback is invoked.
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OpenManifestEntryAsync(const nacl::string& key,
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              struct NaClFileInfo* info,
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              OpenManifestEntryAsyncCallback* callback);
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OpenManifestEntry_MainThreadContinuation(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenManifestEntryResource* p,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32_t err);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StreamAsFile_MainThreadContinuation(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenManifestEntryResource* p,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32_t result);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::WeakRefAnchor* anchor_;  // holds a ref
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Plugin* plugin_;  // value may be copied, but should be used only in
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    // main thread in WeakRef-protected callbacks.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceRuntime* service_runtime_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClMutex mu_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClCondVar cv_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool shutting_down_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::CompletionCallback init_done_cb_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::CompletionCallback crash_cb_;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  ServiceRuntime abstracts a NativeClient sel_ldr instance.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceRuntime {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sehr): This class should also implement factory methods, using the
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start method below.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceRuntime(Plugin* plugin,
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 bool main_service_runtime,
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 bool uses_nonsfi_mode,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 pp::CompletionCallback init_done_cb,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 pp::CompletionCallback crash_cb);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The destructor terminates the sel_ldr process.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ServiceRuntime();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Spawn the sel_ldr instance.
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void StartSelLdr(const SelLdrStartParams& params,
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   pp::CompletionCallback callback);
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // If starting sel_ldr from a background thread, wait for sel_ldr to
177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // actually start. Returns |false| if timed out waiting for the process
178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // to start. Otherwise, returns |true| if StartSelLdr is complete
179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // (either successfully or unsuccessfully).
180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool WaitForSelLdrStart();
1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Signal to waiting threads that StartSelLdr is complete (either
183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // successfully or unsuccessfully).
1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void SignalStartSelLdrDone();
1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If starting the nexe from a background thread, wait for the nexe to
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // actually start.
18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void WaitForNexeStart();
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Signal to waiting threads that LoadNexeAndStart is complete (either
19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // successfully or unsuccessfully).
19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SignalNexeStarted();
19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Establish an SrpcClient to the sel_ldr instance and load the nexe.
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The nexe to be started is passed through |file_info|.
19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void LoadNexeAndStart(PP_NaClFileInfo file_info,
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        const pp::CompletionCallback& started_cb,
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        const pp::CompletionCallback& crash_cb);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the application channel to the nexe.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrpcClient* SetupAppChannel();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Log(int severity, const nacl::string& msg);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Plugin* plugin() const { return plugin_; }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Shutdown();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exit_status is -1 when invalid; when we set it, we will ensure
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that it is non-negative (the portion of the exit status from the
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // nexe that is transferred is the low 8 bits of the argument to the
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exit syscall).
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int exit_status();  // const, but grabs mutex etc.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_exit_status(int exit_status);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::string GetCrashLogOutput();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool main_service_runtime() const { return main_service_runtime_; }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NACL_DISALLOW_COPY_AND_ASSIGN(ServiceRuntime);
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool SetupCommandChannel();
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool LoadModule(PP_NaClFileInfo file_info);
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool InitReverseService();
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool StartModule();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClSrpcChannel command_channel_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Plugin* plugin_;
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool main_service_runtime_;
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool uses_nonsfi_mode_;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::ReverseService* reverse_service_;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::scoped_ptr<nacl::SelLdrLauncherBase> subprocess_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nacl::WeakRefAnchor* anchor_;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginReverseInterface* rev_interface_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Mutex and CondVar to protect start_sel_ldr_done_ and nexe_started_.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClMutex mu_;
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NaClCondVar cond_;
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool start_sel_ldr_done_;
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool nexe_started_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace plugin
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_SERVICE_RUNTIME_H_
246