美文网首页
Dart虚拟机之ServiceIsolate工作原理

Dart虚拟机之ServiceIsolate工作原理

作者: 蜗牛是不是牛 | 来源:发表于2022-11-30 18:38 被阅读0次

    一、概述

    Dart虚拟机中有一个比较重要的isolate,创建的isolate名为”vm-service”,运行在独立的线程,也就是ServiceIsolate,这是用于系统调试相关功能的一个isolate,提供虚拟机相关服务, 比如hot reload,timeline等。这里先来看看ServiceIsolate的启动过程以及监听处理流程。

    二、启动ServiceIsolate

    在dart虚拟机启动过程,会执行Dart Init()操作,该过程中初始化timeline以及在线程池中启动ServiceIsolate。

    2.1 Dart::Init

    [-> third_party/dart/runtime/vm/dart.cc]

    char* Dart::Init(Dart_IsolateCreateCallback create,
                     Dart_IsolateShutdownCallback shutdown,
                     Dart_IsolateCleanupCallback cleanup,
                     Dart_ThreadExitCallback thread_exit,
                     ...) {
      ...
    #if defined(SUPPORT_TIMELINE)
      Timeline::Init();
    #endif
    
      Isolate::SetCreateCallback(create);
      Isolate::SetShutdownCallback(shutdown);
      Isolate::SetCleanupCallback(cleanup);
      const bool is_dart2_aot_precompiler = FLAG_precompiled_mode && !kDartPrecompiledRuntime;
      if (!is_dart2_aot_precompiler &&
          (FLAG_support_service || !kDartPrecompiledRuntime)) {
        ServiceIsolate::Run();  //[见小节]
      }
      ...
    }
    
    

    启动ServiceIsolate的条件,需要满足以下两者之一:

    • 当kDartPrecompiledRuntime = true,且FLAG_support_service = true;
    • 当kDartPrecompiledRuntime = false,且FLAG_precompiled_mode = false;

    再来看一看DartVM初始化过程

    DartVM::DartVM(std::shared_ptr<const DartVMData> vm_data,
                   std::shared_ptr<IsolateNameServer> isolate_name_server) {
        ...
        TRACE_EVENT0("flutter", "Dart_Initialize");
        Dart_InitializeParams params = {};
        params.create = reinterpret_cast<decltype(params.create)>(
        DartIsolate::DartIsolateCreateCallback);
        params.shutdown = reinterpret_cast<decltype(params.shutdown)>(
        DartIsolate::DartIsolateShutdownCallback);
        params.cleanup = reinterpret_cast<decltype(params.cleanup)>(
        DartIsolate::DartIsolateCleanupCallback);
        params.thread_exit = ThreadExitCallback;
        ...
    }
    
    

    可见,ServiceIsolate的创建callback方法是指DartIsolate::DartIsolateCreateCallback(),后面会用到这个信息。

    2.2 ServiceIsolate::Run

    [-> third_party/dart/runtime/vm/service_isolate.cc]

    void ServiceIsolate::Run() {
      {
        MonitorLocker ml(monitor_);
        state_ = kStarting;
        ml.NotifyAll();
      }
      //将任务交给线程池中的worker线程来执行任务[见小节]
      bool task_started = Dart::thread_pool()->Run(new RunServiceTask());
    }
    
    

    将RunServiceTask任务交给线程池中的worker线程来执行任务,过程会创建创建名为“vm-service”的isolate。

    2.3 RunServiceTask

    [-> third_party/dart/runtime/vm/service_isolate.cc]

    class RunServiceTask : public ThreadPool::Task {
     public:
      virtual void Run() {
        char* error = NULL;
        Isolate* isolate = NULL;
    
        Dart_IsolateCreateCallback create_callback =
            ServiceIsolate::create_callback();
    
        Dart_IsolateFlags api_flags;
        Isolate::FlagsInitialize(&api_flags);
        //创建ServiceIsolate [见小节2.3]
        isolate = reinterpret_cast<Isolate*>(
            create_callback(ServiceIsolate::kName, ServiceIsolate::kName, NULL,
                            NULL, &api_flags, NULL, &error));
    
        bool got_unwind;
        {
          StartIsolateScope start_scope(isolate);
          //[见小节2.4]
          got_unwind = RunMain(isolate);
        }
        ...
        isolate->message_handler()->Run(Dart::thread_pool(), NULL, ShutdownIsolate,
                                        reinterpret_cast<uword>(isolate));
      }
    
    

    此处的create_callback便是DartIsolate。

    2.3.1 DartIsolateCreateCallback

    [-> flutter/runtime/dart_isolate.cc]

    Dart_Isolate DartIsolate::DartIsolateCreateCallback(
        const char* advisory_script_uri,
        const char* advisory_script_entrypoint,
        const char* package_root,
        const char* package_config,
        Dart_IsolateFlags* flags,
        std::shared_ptr<DartIsolate>* parent_embedder_isolate,
        char** error) {
      if (parent_embedder_isolate == nullptr &&
          strcmp(advisory_script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0) {
        return DartCreateAndStartServiceIsolate(package_root,package_config,  
                                                flags, error
        );
      }
      ...
    }
    
    

    此处DART_VM_SERVICE_ISOLATE_NAME就是”vm-service”。

    Dart_Isolate DartIsolate::DartCreateAndStartServiceIsolate(
        const char* package_root,
        const char* package_config,
        Dart_IsolateFlags* flags,
        char** error) {
      auto vm_data = DartVMRef::GetVMData();
    
      const auto& settings = vm_data->GetSettings();
    
      if (!settings.enable_observatory) {
        return nullptr;
      }
    
      TaskRunners null_task_runners("io.flutter." DART_VM_SERVICE_ISOLATE_NAME,
                                    nullptr, nullptr, nullptr, nullptr);
    
      flags->load_vmservice_library = true;
    
      std::weak_ptr<DartIsolate> weak_service_isolate =
          DartIsolate::CreateRootIsolate(
              vm_data->GetSettings(),         // settings
              vm_data->GetIsolateSnapshot(),  // isolate snapshot
              vm_data->GetSharedSnapshot(),   // shared snapshot
              null_task_runners,              // task runners
              nullptr,                        // window
              {},                             // snapshot delegate
              {},                             // IO Manager
              DART_VM_SERVICE_ISOLATE_NAME,   // script uri
              DART_VM_SERVICE_ISOLATE_NAME,   // script entrypoint
              flags                           // flags
          );
    
      tonic::DartState::Scope scope(service_isolate);
      //[见小节2.3.2]
      if (!DartServiceIsolate::Startup(
              settings.ipv6 ? "::1" : "127.0.0.1",  // server IP address
              settings.observatory_port,            // server observatory port
              tonic::DartState::HandleLibraryTag,   // embedder library tag handler
              false,  //  disable websocket origin check
              settings.disable_service_auth_codes,  // disable VM service auth codes
              error                                 // error (out)
              )) {
        return nullptr;
      }
      ...
      return service_isolate->isolate();
    }
    
    
    • 可通过settings.enable_observatory来决定是否开启observatory的isolate;
    • 启动ip为127.0.0.1的服务;

    2.3.2 DartServiceIsolate::Startup

    [-> flutter/runtime/dart_service_isolate.cc]

    bool DartServiceIsolate::Startup(std::string server_ip,
                                     intptr_t server_port,
                                     Dart_LibraryTagHandler embedder_tag_handler,
                                     bool disable_origin_check,
                                     bool disable_service_auth_codes,
                                     char** error) {
      Dart_Isolate isolate = Dart_CurrentIsolate();
      ...
    
      Dart_Handle uri = Dart_NewStringFromCString("dart:vmservice_io");
      Dart_Handle library = Dart_LookupLibrary(uri);
      Dart_Handle result = Dart_SetRootLibrary(library);
      result = Dart_SetNativeResolver(library, GetNativeFunction, GetSymbol);
    
      Dart_ExitScope();
      Dart_ExitIsolate();
      //该过程会执行Isolate::Run()方法
      Dart_IsolateMakeRunnable(isolate);
    
      Dart_EnterIsolate(isolate);
      Dart_EnterScope();
      library = Dart_RootLibrary();
    
      //设置HTTP server的ip地址,对于ipv4则为127.0.0.1
      Dart_SetField(library, Dart_NewStringFromCString("_ip"),
                             Dart_NewStringFromCString(server_ip.c_str()));
      //当指定端口号,则立即启动服务;如果没有指定,则找到第一个可用的端口号
      bool auto_start = server_port >= 0;
      if (server_port < 0) {
        server_port = 0;
      }
      //设置HTTP server的端口号,
      Dart_SetField(library, Dart_NewStringFromCString("_port"),
                             Dart_NewInteger(server_port));
      Dart_SetField(library, Dart_NewStringFromCString("_autoStart"),
                             Dart_NewBoolean(auto_start));
      Dart_SetField(library, Dart_NewStringFromCString("_originCheckDisabled"),
                        Dart_NewBoolean(disable_origin_check));
      Dart_SetField(library, Dart_NewStringFromCString("_authCodesDisabled"),
                        Dart_NewBoolean(disable_service_auth_codes));
      return true;
    }
    
    

    设置root library为dart:vmservice_io。

    2.4 RunMain

    [-> third_party/dart/runtime/vm/service_isolate.cc]

    bool RunMain(Isolate* I) {
      Thread* T = Thread::Current();
      StackZone zone(T);
      HANDLESCOPE(T);
    
      const Library& root_library = Library::Handle(Z, I->object_store()->root_library());
      const String& entry_name = String::Handle(Z, String::New("main"));
      const Function& entry = Function::Handle(
          Z, root_library.LookupFunctionAllowPrivate(entry_name));
      //找到并执行dart:vmservice_io库的main()方法 [见小节2.5]
      const Object& result = Object::Handle(
          Z, DartEntry::InvokeFunction(entry, Object::empty_array()));
      const ReceivePort& rp = ReceivePort::Cast(result);
      ServiceIsolate::SetLoadPort(rp.Id());
      return false;
    }
    
    

    2.5 vmservice_io.main

    [-> third_party/dart/runtime/bin/vmservice/vmservice_io.dart]

    main() {
      new VMService();
      if (_autoStart) {
        _lazyServerBoot();  //[见小节2.5.1]
        server.startup();   //[见小节2.6]
        Timer.run(() {});   //用于执行所有的microtasks.
      }
      scriptLoadPort.handler = _processLoadRequest;
      _registerSignalHandlerTimer = new Timer(shortDelay, _registerSignalHandler);
      return scriptLoadPort;
    }
    
    

    2.5.1 _lazyServerBoot

    [-> third_party/dart/runtime/bin/vmservice/vmservice_io.dart]

    _lazyServerBoot() {
      if (server != null) {
        return;
      }
       //[见小节2.5.2]
      var service = new VMService();
       //[见小节2.5.4]
      server = new Server(service, _ip, _port, _originCheckDisabled, _authCodesDisabled);
    }
    
    

    该过程创建VMService和Server对象

    2.5.2 VMService初始化

    [-> third_party/dart/sdk/lib/vmservice/vmservice.dart]

    final RawReceivePort isolateControlPort = new RawReceivePort();
    
    class VMService extends MessageRouter {
    
      factory VMService() {
        if (VMService._instance == null) {
          VMService._instance = new VMService._internal(); //如下文
          _onStart(); //通知虚拟机,服务正在运行
        }
        return _instance;
      }
    
      VMService._internal() : eventPort = isolateControlPort {
        eventPort.handler = messageHandler; //设置消息处理handler
      }
    }
    
    

    2.5.3 messageHandler

    [-> third_party/dart/sdk/lib/vmservice/vmservice.dart]

      void messageHandler(message) {
        if (message is List) {
          if (message.length == 2) {
            // 事件处理
            _eventMessageHandler(message[0], new Response.from(message[1]));
            return;
          }
          if (message.length == 1) {
            _exit();  //vm service退出的消息
            return;
          }
          if (message.length == 3) {
            final opcode = message[0];
            if (opcode == Constants.METHOD_CALL_FROM_NATIVE) {
              _handleNativeRpcCall(message[1], message[2]);
              return;
            } else {
              assert((opcode == Constants.WEB_SERVER_CONTROL_MESSAGE_ID) ||
                  (opcode == Constants.SERVER_INFO_MESSAGE_ID));
              _serverMessageHandler(message[0], message[1], message[2]);
              return;
            }
          }
          if (message.length == 4) {
            //关于isolate的创建和销毁的消息
            _controlMessageHandler(message[0], message[1], message[2], message[3]);
            return;
          }
        }
      }
    
    

    根据消息长度调用相应的Handler:

    • 当长度等于1,则调用_exit来退出vm service;
    • 当长度等于2,则调用_eventMessageHandler来处理事件;
    • 当长度等于3,分为两种情况:
      • 当消息opcode等于METHOD_CALL_FROM_NATIVE,则调用_handleNativeRpcCall来处理Native的RPC调用;
      • 否则,则调用_serverMessageHandler来处理消息;
    • 当长度等于4,则调用_controlMessageHandler来通知创建或销毁一个isolate;

    2.5.4 Server初始化

    [-> third_party/dart/runtime/bin/vmservice/server.dart]

    class Server {
      static const WEBSOCKET_PATH = '/ws';
      static const ROOT_REDIRECT_PATH = '/index.html';
    
      final VMService _service;
      final String _ip;
      final int _port;
      final bool _originCheckDisabled;
      final bool _authCodesDisabled;
      HttpServer _server;
    
      Server(this._service, this._ip, this._port, this._originCheckDisabled,
          bool authCodesDisabled)
          : _authCodesDisabled = (authCodesDisabled || Platform.isFuchsia);
    }
    
    

    2.6 server.startup

    [-> third_party/dart/runtime/bin/vmservice/server.dart]

    Future startup() async {
      ...
      Future<bool> poll() async {
        try {
          var address;
          var addresses = await InternetAddress.lookup(_ip);
          for (var i = 0; i < addresses.length; i++) {
            address = addresses[i];
            if (address.type == InternetAddressType.IP_V4) break;
          }
          //监听HTTP请求
          _server = await HttpServer.bind(address, _port);
          return true;
        } catch (e, st) {
          return false;
        }
      }
    
      //轮询尝试,最多10次没有连接成功,则退出
      int attempts = 0;
      final int maxAttempts = 10;
      //尝试跟指定地址和端口建立http请求进行绑定
      while (!await poll()) {
        attempts++;
        if (attempts > maxAttempts) {
          _notifyServerState("");
          onServerAddressChange(null);
          return this;
        }
        await new Future<Null>.delayed(const Duration(seconds: 1));
      }
      //进入监听状态
      _server.listen(_requestHandler, cancelOnError: true);
      //这便是熟悉的那行,标志着服务启动成功
      serverPrint('Observatory listening on $serverAddress');
    
      //将服务地址通知到VmService,写入其成员变量server_uri_
      _notifyServerState(serverAddress.toString());
      //将服务地址通知到ServiceIsolate,写入其成员变量server_address_
      onServerAddressChange('$serverAddress');
      return this;
    }
    
    

    服务进入监听状态,一旦收到请求,则会调用_requestHandler。

    三、处理请求

    Server._requestHandler
      client.onRequest
        vmservice.routeRequest
          vmservice._routeRequestImpl
            message.sendToVM
              message.sendRootServiceMessage  (接下来进入C++)
                Service::HandleRootMessage
                  Service::InvokeMethod
    
    

    3.1 Server._requestHandler

    [-> third_party/dart/runtime/bin/vmservice/server.dart]

    Future _requestHandler(HttpRequest request) async {
      ...
      final String path = _checkAuthTokenAndGetPath(request.uri);
      //创建一个client对象,内有vmservice [见小节3.1.1]
      final client = new HttpRequestClient(request, _service);
      //创建message对象,[见小节3.1.3]
      final message = new Message.fromUri(client, Uri.parse(path));
      // [见小节3.2]
      client.onRequest(message);
    }
    
    

    3.1.1 HttpRequestClient初始化

    [-> third_party/dart/runtime/bin/vmservice/server.dart]

    class HttpRequestClient extends Client {
      final HttpRequest request;
    
      HttpRequestClient(this.request, VMService service)
          : super(service, sendEvents: false); //见下文
    }
    
    

    [-> third_party/dart/sdk/lib/vmservice/client.dart]

    abstract class Client {
      final VMService service;
      final bool sendEvents;
    
      Client(this.service, {bool sendEvents: true}) : this.sendEvents = sendEvents {
        service._addClient(this);  //将当前的client添加到VMService
      }
    }
    
    

    3.1.2 VMService._addClient

    [-> third_party/dart/sdk/lib/vmservice/vmservice.dart]

    class VMService extends MessageRouter {
      static const serviceNamespace = 's';
    
      final NamedLookup<Client> clients =
          new NamedLookup<Client>(prologue: serviceNamespace);
    
      void _addClient(Client client) {
        clients.add(client);
      }
    }
    
    

    3.1.3 Message.fromUri

    [-> third_party/dart/sdk/lib/vmservice/message.dart]

    Message.fromUri(this.client, Uri uri)
        : type = MessageType.Request,
          serial = '',
          method = _methodNameFromUri(uri) { //从uri中获取方法名
      params.addAll(uri.queryParameters);
    }
    
    

    Message对象都有一个成员变量method

    • 方法名method,对于fromUri是从分割后的第一部分
    • 消息类型type有有3大类:Request, Notification, Response

    3.2 client.onRequest

    [-> third_party/dart/sdk/lib/vmservice/client.dart]

    abstract class Client {
      final VMService service;
    
      void onRequest(Message message) {
        // 【见小节3.3/38】
        service.routeRequest(service, message).then(post);
      }
    }
    
    

    这里有两个过程:

    • vmservice.routeRequest
    • post

    3.3 vmservice.routeRequest

    [-> third_party/dart/sdk/lib/vmservice/vmservice.dart]

    Future<Response> routeRequest(VMService _, Message message) async {
      return new Response.from(await _routeRequestImpl(message));
    }
    
    Future _routeRequestImpl(Message message) async {
      try {
        if (message.completed) {
          return await message.response;
        }
        if (message.method == 'streamListen') {
          return await _streamListen(message);
        }
        if (message.method == 'streamCancel') {
          return await _streamCancel(message);
        }
        if (message.method == '_registerService') {
          return await _registerService(message);
        }
        if (message.method == '_spawnUri') {
          return await _spawnUri(message);
        }
        if (devfs.shouldHandleMessage(message)) {
          return await devfs.handleMessage(message);
        }
        if (_hasNamespace(message.method)) {
          return await _handleService(message);
        }
        if (message.params['isolateId'] != null) {
          return await runningIsolates.routeRequest(this, message);
        }
        return await message.sendToVM(); //[见小节3.4]
      } catch (e, st) {
        return message.response;
      }
    }
    
    

    3.4 message.sendToVM

    [-> third_party/dart/sdk/lib/vmservice/message.dart]

    Future<Response> sendToVM() {
      final receivePort = new RawReceivePort();
      receivePort.handler = (value) {
        receivePort.close();
        _setResponseFromPort(value);
      };
      var keys = params.keys.toList(growable: false);
      var values = params.values.toList(growable: false);
      if (!_methodNeedsObjectParameters(method)) {
        keys = _makeAllString(keys);
        values = _makeAllString(values);
      }
    
      final request = new List(6)
        ..[0] = 0
        ..[1] = receivePort.sendPort
        ..[2] = serial
        ..[3] = method
        ..[4] = keys
        ..[5] = values;
    
      if (_methodNeedsObjectParameters(method)) {
        sendObjectRootServiceMessage(request);  //[见小节3.5]
      } else {
        sendRootServiceMessage(request);  //[见小节3.5]
      }
    
      return _completer.future;
    }
    
    

    sendRootServiceMessage,这是一个native方法,调用到vmservice.cc中相应的方法

    3.5 message.sendRootServiceMessage

    [-> third_party/dart/runtime/lib/vmservice.cc]

    DEFINE_NATIVE_ENTRY(VMService_SendRootServiceMessage, 0, 1) {
    #ifndef PRODUCT
      GET_NON_NULL_NATIVE_ARGUMENT(Array, message, arguments->NativeArgAt(0));
      if (FLAG_support_service) {
        return Service::HandleRootMessage(message);  //[见小节3.6]
      }
    #endif
      return Object::null();
    }
    
    
    DEFINE_NATIVE_ENTRY(VMService_SendObjectRootServiceMessage, 0, 1) {
    #ifndef PRODUCT
      GET_NON_NULL_NATIVE_ARGUMENT(Array, message, arguments->NativeArgAt(0));
      if (FLAG_support_service) {
        return Service::HandleObjectRootMessage(message);
      }
    #endif
      return Object::null();
    }
    
    

    3.6 Service::HandleRootMessage

    [-> third_party/dart/runtime/vm/service.cc]

    RawError* Service::HandleRootMessage(const Array& msg_instance) {
      Isolate* isolate = Isolate::Current();
      return InvokeMethod(isolate, msg_instance);  //[见小节3.7]
    }
    
    RawError* Service::HandleObjectRootMessage(const Array& msg_instance) {
      Isolate* isolate = Isolate::Current();
      return InvokeMethod(isolate, msg_instance, true);  //[见小节3.7]
    }
    
    

    3.7 Service::InvokeMethod

    [-> third_party/dart/runtime/vm/service.cc]

    RawError* Service::InvokeMethod(Isolate* I, const Array& msg,
                                    bool parameters_are_dart_objects) {
      Thread* T = Thread::Current();
      {
        StackZone zone(T);
        HANDLESCOPE(T);
        Instance& reply_port = Instance::Handle(Z);
        Instance& seq = String::Handle(Z);
        String& method_name = String::Handle(Z);
        Array& param_keys = Array::Handle(Z);
        Array& param_values = Array::Handle(Z);
        reply_port ^= msg.At(1);
        seq ^= msg.At(2);
        method_name ^= msg.At(3);
        param_keys ^= msg.At(4);
        param_values ^= msg.At(5);
    
        JSONStream js;
        Dart_Port reply_port_id =
            (reply_port.IsNull() ? ILLEGAL_PORT : SendPort::Cast(reply_port).Id());
        js.Setup(zone.GetZone(), reply_port_id, seq, method_name, param_keys,
                 param_values, parameters_are_dart_objects);
        ...
        const char* c_method_name = method_name.ToCString();
        //从service_methods_[]找到目标方法 [3.7.1]
        const ServiceMethodDescriptor* method = FindMethod(c_method_name);
        if (method != NULL) {
          if (method->entry(T, &js)) {  //执行相应方法
            js.PostReply();
          }
          return T->StealStickyError();
        }
        ...
      }
    }
    
    

    3.7.1 FindMethod

    [-> third_party/dart/runtime/vm/service.cc]

    const ServiceMethodDescriptor* FindMethod(const char* method_name) {
      intptr_t num_methods = sizeof(service_methods_) / sizeof(service_methods_[0]);
      for (intptr_t i = 0; i < num_methods; i++) {
        const ServiceMethodDescriptor& method = service_methods_[i];
        if (strcmp(method_name, method.name) == 0) {
          return &method;
        }
      }
      return NULL;
    }
    
    

    在service.cc中有一个成员变量service_methods_[]记录了所有的定义的方法。比如获取timeline的过程,如下所示。

    3.7.2 service_methods_数组

    struct ServiceMethodDescriptor {
      const char* name;
      const ServiceMethodEntry entry;
      const MethodParameter* const* parameters;
    };
    
    static const ServiceMethodDescriptor service_methods_[] = {
      { "_echo", Echo,
        NULL },
      { "_respondWithMalformedJson", RespondWithMalformedJson,
        NULL },
      { "_respondWithMalformedObject", RespondWithMalformedObject,
        NULL },
      { "_triggerEchoEvent", TriggerEchoEvent,
        NULL },
      { "addBreakpoint", AddBreakpoint,
        add_breakpoint_params },
      { "addBreakpointWithScriptUri", AddBreakpointWithScriptUri,
        add_breakpoint_with_script_uri_params },
      { "addBreakpointAtEntry", AddBreakpointAtEntry,
        add_breakpoint_at_entry_params },
      { "_addBreakpointAtActivation", AddBreakpointAtActivation,
        add_breakpoint_at_activation_params },
      { "_buildExpressionEvaluationScope", BuildExpressionEvaluationScope,
        build_expression_evaluation_scope_params },
      { "_clearCpuProfile", ClearCpuProfile,
        clear_cpu_profile_params },
      { "_clearVMTimeline", ClearVMTimeline,
        clear_vm_timeline_params, },
      { "_compileExpression", CompileExpression, compile_expression_params },
      { "_enableProfiler", EnableProfiler,
        enable_profiler_params, },
      { "evaluate", Evaluate,
        evaluate_params },
      { "evaluateInFrame", EvaluateInFrame,
        evaluate_in_frame_params },
      { "_getAllocationProfile", GetAllocationProfile,
        get_allocation_profile_params },
      { "_getAllocationSamples", GetAllocationSamples,
          get_allocation_samples_params },
      { "_getNativeAllocationSamples", GetNativeAllocationSamples,
          get_native_allocation_samples_params },
      { "getClassList", GetClassList,
        get_class_list_params },
      { "_getCpuProfile", GetCpuProfile,
        get_cpu_profile_params },
      { "_getCpuProfileTimeline", GetCpuProfileTimeline,
        get_cpu_profile_timeline_params },
      { "_writeCpuProfileTimeline", WriteCpuProfileTimeline,
        write_cpu_profile_timeline_params },
      { "getFlagList", GetFlagList,
        get_flag_list_params },
      { "_getHeapMap", GetHeapMap,
        get_heap_map_params },
      { "_getInboundReferences", GetInboundReferences,
        get_inbound_references_params },
      { "_getInstances", GetInstances,
        get_instances_params },
      { "getIsolate", GetIsolate,
        get_isolate_params },
      { "getMemoryUsage", GetMemoryUsage,
        get_memory_usage_params },
      { "_getIsolateMetric", GetIsolateMetric,
        get_isolate_metric_params },
      { "_getIsolateMetricList", GetIsolateMetricList,
        get_isolate_metric_list_params },
      { "getObject", GetObject,
        get_object_params },
      { "_getObjectStore", GetObjectStore,
        get_object_store_params },
      { "_getObjectByAddress", GetObjectByAddress,
        get_object_by_address_params },
      { "_getPersistentHandles", GetPersistentHandles,
          get_persistent_handles_params, },
      { "_getPorts", GetPorts,
        get_ports_params },
      { "_getReachableSize", GetReachableSize,
        get_reachable_size_params },
      { "_getRetainedSize", GetRetainedSize,
        get_retained_size_params },
      { "_getRetainingPath", GetRetainingPath,
        get_retaining_path_params },
      { "getScripts", GetScripts,
        get_scripts_params },
      { "getSourceReport", GetSourceReport,
        get_source_report_params },
      { "getStack", GetStack,
        get_stack_params },
      { "_getUnusedChangesInLastReload", GetUnusedChangesInLastReload,
        get_unused_changes_in_last_reload_params },
      { "_getTagProfile", GetTagProfile,
        get_tag_profile_params },
      { "_getTypeArgumentsList", GetTypeArgumentsList,
        get_type_arguments_list_params },
      { "getVersion", GetVersion,
        get_version_params },
      { "getVM", GetVM,
        get_vm_params },
      { "_getVMMetric", GetVMMetric,
        get_vm_metric_params },
      { "_getVMMetricList", GetVMMetricList,
        get_vm_metric_list_params },
      { "_getVMTimeline", GetVMTimeline,
        get_vm_timeline_params },
      { "_getVMTimelineFlags", GetVMTimelineFlags,
        get_vm_timeline_flags_params },
      { "invoke", Invoke, invoke_params },
      { "kill", Kill, kill_params },
      { "pause", Pause,
        pause_params },
      { "removeBreakpoint", RemoveBreakpoint,
        remove_breakpoint_params },
      { "reloadSources", ReloadSources,
        reload_sources_params },
      { "_reloadSources", ReloadSources,
        reload_sources_params },
      { "resume", Resume,
        resume_params },
      { "_requestHeapSnapshot", RequestHeapSnapshot,
        request_heap_snapshot_params },
      { "_evaluateCompiledExpression", EvaluateCompiledExpression,
        evaluate_compiled_expression_params },
      { "setExceptionPauseMode", SetExceptionPauseMode,
        set_exception_pause_mode_params },
      { "setFlag", SetFlag,
        set_flags_params },
      { "setLibraryDebuggable", SetLibraryDebuggable,
        set_library_debuggable_params },
      { "setName", SetName,
        set_name_params },
      { "_setTraceClassAllocation", SetTraceClassAllocation,
        set_trace_class_allocation_params },
      { "setVMName", SetVMName,
        set_vm_name_params },
      { "_setVMTimelineFlags", SetVMTimelineFlags,
        set_vm_timeline_flags_params },
      { "_collectAllGarbage", CollectAllGarbage,
        collect_all_garbage_params },
      { "_getDefaultClassesAliases", GetDefaultClassesAliases,
        get_default_classes_aliases_params },
    };
    
    

    3.8 HttpRequestClient

    class HttpRequestClient extends Client {
      static ContentType jsonContentType =
          new ContentType("application", "json", charset: "utf-8");
      final HttpRequest request;
    
      void post(Response result) {
        HttpResponse response = request.response;
        response.headers.add('Access-Control-Allow-Origin', '*');
        response.headers.contentType = jsonContentType;
        switch (result.kind) {
          case ResponsePayloadKind.String:
            response.write(result.payload);
            break;
          case ResponsePayloadKind.Utf8String:
            response.add(result.payload);
            break;
          case ResponsePayloadKind.Binary:
            throw 'Can not handle binary responses';
        }
        response.close();
        close();
      }
    

    来自:http://gityuan.com/2019/10/12/service-isolate/

    相关文章

      网友评论

          本文标题:Dart虚拟机之ServiceIsolate工作原理

          本文链接:https://www.haomeiwen.com/subject/myndfdtx.html