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