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