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