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 <map> 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/c/trusted/ppb_file_io_trusted.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/completion_callback.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/utility.h" 30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct NaClFileInfo; 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace nacl { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescWrapper; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileIO; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace plugin { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ErrorInfo; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Manifest; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Plugin; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PnaclCoordinator; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SrpcClient; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceRuntime; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Struct of params used by StartSelLdr. Use a struct so that callback 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// creation templates aren't overwhelmed with too many parameters. 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstruct SelLdrStartParams { 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SelLdrStartParams(const nacl::string& url, 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ErrorInfo* error_info, 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool uses_irt, 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool uses_ppapi, 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_dev_interfaces, 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_dyncode_syscalls, 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_exception_handling) 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : url(url), 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_info(error_info), 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uses_irt(uses_irt), 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uses_ppapi(uses_ppapi), 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enable_dev_interfaces(enable_dev_interfaces), 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enable_dyncode_syscalls(enable_dyncode_syscalls), 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enable_exception_handling(enable_exception_handling) { 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch nacl::string url; 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ErrorInfo* error_info; 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool uses_irt; 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool uses_ppapi; 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_dev_interfaces; 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_dyncode_syscalls; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool enable_exception_handling; 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback resources are essentially our continuation state. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct LogToJavaScriptConsoleResource { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit LogToJavaScriptConsoleResource(std::string msg) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : message(msg) {} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string message; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PostMessageResource { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit PostMessageResource(std::string msg) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : message(msg) {} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string message; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct OpenManifestEntryResource { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenManifestEntryResource(const std::string& target_url, 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) struct NaClFileInfo* finfo, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorInfo* infop, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : url(target_url), 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) file_info(finfo), 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_info(infop), 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op_complete_ptr(op_complete) {} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url; 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) struct NaClFileInfo* file_info; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorInfo* error_info; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete_ptr; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CloseManifestEntryResource { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseManifestEntryResource(int32_t desc_to_close, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_result) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : desc(desc_to_close), 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op_complete_ptr(op_complete), 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op_result_ptr(op_result) {} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t desc; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete_ptr; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_result_ptr; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum QuotaDataType { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PepperQuotaType, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TempQuotaType 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct QuotaData { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuotaData(QuotaDataType type_, PP_Resource resource_) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(type_), resource(resource_) {} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuotaData() 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(PepperQuotaType), resource(0) {} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuotaDataType type; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource resource; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct QuotaRequest { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuotaRequest(QuotaData quota_data, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t start_offset, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t quota_bytes_requested, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t* quota_bytes_granted, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : data(quota_data), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset(start_offset), 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_requested(quota_bytes_requested), 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_granted(quota_bytes_granted), 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op_complete_ptr(op_complete) { } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuotaData data; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t offset; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t bytes_requested; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t* bytes_granted; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* op_complete_ptr; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do not invoke from the main thread, since the main methods will 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// invoke CallOnMainThread and then wait on a condvar for the task to 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// complete: if invoked from the main thread, the main method not 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returning (and thus unblocking the main thread) means that the 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// main-thread continuation methods will never get called, and thus 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we'd get a deadlock. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginReverseInterface: public nacl::ReverseInterface { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginReverseInterface(nacl::WeakRefAnchor* anchor, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Plugin* plugin, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Manifest* manifest, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ServiceRuntime* service_runtime, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback init_done_cb, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback crash_cb); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PluginReverseInterface(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShutDown(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Log(nacl::string message); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DoPostMessage(nacl::string message); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StartupInitializationComplete(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool EnumerateManifestKeys(std::set<nacl::string>* out_keys); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool OpenManifestEntry(nacl::string url_key, 18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) struct NaClFileInfo *info); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CloseManifestEntry(int32_t desc); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReportCrash(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReportExitStatus(int exit_status); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int64_t RequestQuotaForWrite(nacl::string file_id, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t offset, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t bytes_to_write); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddQuotaManagedFile(const nacl::string& file_id, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const pp::FileIO& file_io); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddTempQuotaManagedFile(const nacl::string& file_id); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Log_MainThreadContinuation(LogToJavaScriptConsoleResource* p, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t err); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PostMessage_MainThreadContinuation(PostMessageResource* p, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t err); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OpenManifestEntry_MainThreadContinuation( 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenManifestEntryResource* p, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t err); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StreamAsFile_MainThreadContinuation( 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenManifestEntryResource* p, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BitcodeTranslate_MainThreadContinuation( 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenManifestEntryResource* p, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CloseManifestEntry_MainThreadContinuation( 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseManifestEntryResource* cls, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t err); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void QuotaRequest_MainThreadContinuation( 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuotaRequest* request, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t err); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void QuotaRequest_MainThreadResponse( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuotaRequest* request, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t err); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::WeakRefAnchor* anchor_; // holds a ref 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Plugin* plugin_; // value may be copied, but should be used only in 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // main thread in WeakRef-protected callbacks. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Manifest* manifest_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ServiceRuntime* service_runtime_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClMutex mu_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClCondVar cv_; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int64_t, QuotaData> quota_map_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool shutting_down_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::scoped_ptr<PnaclCoordinator> pnacl_coordinator_; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback init_done_cb_; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback crash_cb_; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ServiceRuntime abstracts a NativeClient sel_ldr instance. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceRuntime { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sehr): This class should also implement factory methods, using the 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start method below. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ServiceRuntime(Plugin* plugin, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Manifest* manifest, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_report_uma, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback init_done_cb, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallback crash_cb); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The destructor terminates the sel_ldr process. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ServiceRuntime(); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Spawn the sel_ldr instance. On success, returns true. 2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // On failure, returns false and |error_string| is set to something 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // describing the error. 2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool StartSelLdr(const SelLdrStartParams& params); 2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // If starting sel_ldr from a background thread, wait for sel_ldr to 2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // actually start. 2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void WaitForSelLdrStart(); 2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Signal to waiting threads that StartSelLdr is complete. 2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Done externally, in case external users want to write to shared 2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // memory that is yet to be fenced. 2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SignalStartSelLdrDone(); 2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Establish an SrpcClient to the sel_ldr instance and load the nexe. 2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The nexe to be started is passed through |nacl_file_desc|. 2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // On success, returns true. On failure, returns false and |error_string| 2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // is set to something describing the error. 2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool LoadNexeAndStart(nacl::DescWrapper* nacl_file_desc, 2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ErrorInfo* error_info, 2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const pp::CompletionCallback& crash_cb); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the application channel to the nexe. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrpcClient* SetupAppChannel(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Log(int severity, const nacl::string& msg); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Plugin* plugin() const { return plugin_; } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Shutdown(); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exit_status is -1 when invalid; when we set it, we will ensure 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that it is non-negative (the portion of the exit status from the 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nexe that is transferred is the low 8 bits of the argument to the 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exit syscall). 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exit_status(); // const, but grabs mutex etc. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_exit_status(int exit_status); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::string GetCrashLogOutput(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To establish quota callbacks the pnacl coordinator needs to communicate 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the reverse interface. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginReverseInterface* rev_interface() const { return rev_interface_; } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NACL_DISALLOW_COPY_AND_ASSIGN(ServiceRuntime); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InitCommunication(nacl::DescWrapper* shm, ErrorInfo* error_info); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClSrpcChannel command_channel_; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Plugin* plugin_; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_report_uma_; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::ReverseService* reverse_service_; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::scoped_ptr<nacl::SelLdrLauncherBase> subprocess_; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nacl::WeakRefAnchor* anchor_; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginReverseInterface* rev_interface_; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Mutex to protect exit_status_. 3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Also, in conjunction with cond_ it is used to signal when 3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // StartSelLdr is complete with either success or error. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClMutex mu_; 3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NaClCondVar cond_; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exit_status_; 3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool start_sel_ldr_done_; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace plugin 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_SERVICE_RUNTIME_H_ 331