service_runtime.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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" 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/utility/completion_callback_factory.h" 29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct NaClFileInfo; 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace nacl { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescWrapper; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileIO; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace plugin { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ErrorInfo; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Manifest; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Plugin; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SrpcClient; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceRuntime; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Struct of params used by StartSelLdr. Use a struct so that callback 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// creation templates aren't overwhelmed with too many parameters. 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstruct SelLdrStartParams { 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SelLdrStartParams(const nacl::string& url, 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool uses_irt, 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool uses_ppapi, 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool uses_nonsfi_mode, 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_dev_interfaces, 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_dyncode_syscalls, 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool enable_exception_handling, 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool enable_crash_throttling) 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : url(url), 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uses_irt(uses_irt), 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uses_ppapi(uses_ppapi), 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uses_nonsfi_mode(uses_nonsfi_mode), 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enable_dev_interfaces(enable_dev_interfaces), 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enable_dyncode_syscalls(enable_dyncode_syscalls), 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) enable_exception_handling(enable_exception_handling), 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) enable_crash_throttling(enable_crash_throttling) { 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch nacl::string url; 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool uses_irt; 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool uses_ppapi; 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool uses_nonsfi_mode; 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_dev_interfaces; 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_dyncode_syscalls; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_exception_handling; 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool enable_crash_throttling; 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback resources are essentially our continuation state. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PostMessageResource { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit PostMessageResource(std::string msg) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : message(msg) {} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string message; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct OpenManifestEntryResource { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenManifestEntryResource(const std::string& target_url, 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) struct NaClFileInfo* finfo, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorInfo* infop, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : url(target_url), 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) file_info(finfo), 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_info(infop), 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op_complete_ptr(op_complete) {} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url; 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) struct NaClFileInfo* file_info; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorInfo* error_info; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete_ptr; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CloseManifestEntryResource { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseManifestEntryResource(int32_t desc_to_close, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_result) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : desc(desc_to_close), 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op_complete_ptr(op_complete), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op_result_ptr(op_result) {} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t desc; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete_ptr; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_result_ptr; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct QuotaRequest { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) QuotaRequest(PP_Resource pp_resource, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t start_offset, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t quota_bytes_requested, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t* quota_bytes_granted, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete) 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : resource(pp_resource), 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset(start_offset), 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_requested(quota_bytes_requested), 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_granted(quota_bytes_granted), 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op_complete_ptr(op_complete) { } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PP_Resource resource; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t offset; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t bytes_requested; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t* bytes_granted; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete_ptr; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do not invoke from the main thread, since the main methods will 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// invoke CallOnMainThread and then wait on a condvar for the task to 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// complete: if invoked from the main thread, the main method not 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returning (and thus unblocking the main thread) means that the 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// main-thread continuation methods will never get called, and thus 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we'd get a deadlock. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginReverseInterface: public nacl::ReverseInterface { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginReverseInterface(nacl::WeakRefAnchor* anchor, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Plugin* plugin, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Manifest* manifest, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ServiceRuntime* service_runtime, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback init_done_cb, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback crash_cb); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PluginReverseInterface(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShutDown(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DoPostMessage(nacl::string message); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StartupInitializationComplete(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool EnumerateManifestKeys(std::set<nacl::string>* out_keys); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool OpenManifestEntry(nacl::string url_key, 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) struct NaClFileInfo *info); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CloseManifestEntry(int32_t desc); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReportCrash(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReportExitStatus(int exit_status); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int64_t RequestQuotaForWrite(nacl::string file_id, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t offset, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t bytes_to_write); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddQuotaManagedFile(const nacl::string& file_id, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const pp::FileIO& file_io); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddTempQuotaManagedFile(const nacl::string& file_id); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PostMessage_MainThreadContinuation(PostMessageResource* p, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t err); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OpenManifestEntry_MainThreadContinuation( 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenManifestEntryResource* p, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t err); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StreamAsFile_MainThreadContinuation( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenManifestEntryResource* p, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CloseManifestEntry_MainThreadContinuation( 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseManifestEntryResource* cls, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t err); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::WeakRefAnchor* anchor_; // holds a ref 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Plugin* plugin_; // value may be copied, but should be used only in 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // main thread in WeakRef-protected callbacks. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Manifest* manifest_; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ServiceRuntime* service_runtime_; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClMutex mu_; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClCondVar cv_; 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::set<int64_t> quota_files_; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool shutting_down_; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback init_done_cb_; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback crash_cb_; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ServiceRuntime abstracts a NativeClient sel_ldr instance. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceRuntime { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sehr): This class should also implement factory methods, using the 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start method below. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ServiceRuntime(Plugin* plugin, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Manifest* manifest, 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool main_service_runtime, 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool uses_nonsfi_mode, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback init_done_cb, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback crash_cb); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The destructor terminates the sel_ldr process. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ServiceRuntime(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Spawn the sel_ldr instance. 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void StartSelLdr(const SelLdrStartParams& params, 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::CompletionCallback callback); 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // If starting sel_ldr from a background thread, wait for sel_ldr to 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // actually start. 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void WaitForSelLdrStart(); 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Signal to waiting threads that StartSelLdr is complete. 2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Done externally, in case external users want to write to shared 2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // memory that is yet to be fenced. 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SignalStartSelLdrDone(); 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Establish an SrpcClient to the sel_ldr instance and load the nexe. 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The nexe to be started is passed through |nacl_file_desc|. 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // On success, returns true. On failure, returns false. 2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool LoadNexeAndStart(nacl::DescWrapper* nacl_file_desc, 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const pp::CompletionCallback& crash_cb); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the application channel to the nexe. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrpcClient* SetupAppChannel(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Log(int severity, const nacl::string& msg); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Plugin* plugin() const { return plugin_; } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Shutdown(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exit_status is -1 when invalid; when we set it, we will ensure 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that it is non-negative (the portion of the exit status from the 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nexe that is transferred is the low 8 bits of the argument to the 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exit syscall). 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exit_status(); // const, but grabs mutex etc. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_exit_status(int exit_status); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::string GetCrashLogOutput(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To establish quota callbacks the pnacl coordinator needs to communicate 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the reverse interface. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginReverseInterface* rev_interface() const { return rev_interface_; } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NACL_DISALLOW_COPY_AND_ASSIGN(ServiceRuntime); 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool SetupCommandChannel(ErrorInfo* error_info); 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool LoadModule(nacl::DescWrapper* shm, ErrorInfo* error_info); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool InitReverseService(ErrorInfo* error_info); 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool StartModule(ErrorInfo* error_info); 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void StartSelLdrContinuation(int32_t pp_error, 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::CompletionCallback callback); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClSrpcChannel command_channel_; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Plugin* plugin_; 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool main_service_runtime_; 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool uses_nonsfi_mode_; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::ReverseService* reverse_service_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::scoped_ptr<nacl::SelLdrLauncherBase> subprocess_; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::WeakRefAnchor* anchor_; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginReverseInterface* rev_interface_; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Mutex to protect exit_status_. 2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Also, in conjunction with cond_ it is used to signal when 2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // StartSelLdr is complete with either success or error. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClMutex mu_; 2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NaClCondVar cond_; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exit_status_; 2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool start_sel_ldr_done_; 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Var start_sel_ldr_error_message_; 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::CompletionCallbackFactory<ServiceRuntime> callback_factory_; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace plugin 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_SERVICE_RUNTIME_H_ 297