Flutter Engine
The Flutter Engine
Classes | Namespaces | Macros | Typedefs | Enumerations | Functions | Variables
service.cc File Reference
#include "vm/service.h"
#include <memory>
#include <utility>
#include "include/dart_api.h"
#include "include/dart_native_api.h"
#include "platform/globals.h"
#include "platform/unicode.h"
#include "platform/utils.h"
#include "vm/base64.h"
#include "vm/canonical_tables.h"
#include "vm/closure_functions_cache.h"
#include "vm/compiler/jit/compiler.h"
#include "vm/cpu.h"
#include "vm/dart_api_impl.h"
#include "vm/dart_api_message.h"
#include "vm/dart_api_state.h"
#include "vm/dart_entry.h"
#include "vm/debugger.h"
#include "vm/heap/safepoint.h"
#include "vm/isolate.h"
#include "vm/kernel_isolate.h"
#include "vm/lockers.h"
#include "vm/message.h"
#include "vm/message_handler.h"
#include "vm/message_snapshot.h"
#include "vm/native_arguments.h"
#include "vm/native_entry.h"
#include "vm/native_symbol.h"
#include "vm/object.h"
#include "vm/object_graph.h"
#include "vm/object_id_ring.h"
#include "vm/object_store.h"
#include "vm/parser.h"
#include "vm/port.h"
#include "vm/profiler.h"
#include "vm/profiler_service.h"
#include "vm/raw_object_fields.h"
#include "vm/resolver.h"
#include "vm/reusable_handles.h"
#include "vm/service_event.h"
#include "vm/service_isolate.h"
#include "vm/source_report.h"
#include "vm/stack_frame.h"
#include "vm/symbols.h"
#include "vm/timeline.h"
#include "vm/version.h"

Go to the source code of this file.

Classes

class  dart::MethodParameter
 
class  dart::NoSuchParameter
 
class  dart::EnumListParameter
 
class  dart::DartStringParameter
 
class  dart::DartListParameter
 
class  dart::BoolParameter
 
class  dart::UIntParameter
 
class  dart::Int64Parameter
 
class  dart::UInt64Parameter
 
class  dart::IdParameter
 
class  dart::StringParameter
 
class  dart::RunnableIsolateParameter
 
class  dart::EnumParameter
 
struct  dart::ServiceMethodDescriptor
 
class  dart::EmbedderServiceHandler
 
class  dart::GetInstancesVisitor
 
class  dart::PersistentHandleVisitor< T >
 
class  dart::ServiceIsolateVisitor
 
class  dart::SystemServiceIsolateVisitor
 
class  dart::UriMappingTraits
 

Namespaces

namespace  dart
 

Macros

#define Z   (T->zone())
 
#define ISOLATE_PARAMETER   new IdParameter("isolateId", true)
 
#define ISOLATE_GROUP_PARAMETER   new IdParameter("isolateGroupId", true)
 
#define NO_ISOLATE_PARAMETER   new NoSuchParameter("isolateId")
 
#define RUNNABLE_ISOLATE_PARAMETER   new RunnableIsolateParameter("isolateId")
 
#define OBJECT_PARAMETER   new IdParameter("objectId", true)
 
#define ADD_METRIC(type, variable, name, unit)    metrics.AddValue(isolate->Get##variable##Metric());
 
#define ADD_METRIC(type, variable, name, unit)    metrics.AddValue(isolate_group->Get##variable##Metric());
 
#define ADD_METRIC(type, variable, name, unit)
 
#define ADD_METRIC(type, variable, name, unit)
 
#define DEFINE_ADD_VALUE_F(id)    internals.AddValueF("classes/%" Pd, static_cast<intptr_t>(id));
 
#define DEFINE_ADD_VALUE_F_CID(clazz)   DEFINE_ADD_VALUE_F(k##clazz##Cid)
 
#define DEFINE_ADD_MAP_KEY(clazz)
 
#define DEFINE_ADD_MAP_KEY(clazz)
 

Typedefs

typedef void(* dart::ServiceMethodEntry) (Thread *thread, JSONStream *js)
 
typedef UnorderedHashMap< UriMappingTraits > dart::UriMapping
 

Enumerations

enum  dart::SentinelType { dart::kCollectedSentinel , dart::kExpiredSentinel , dart::kFreeSentinel }
 
enum  dart::TimelineOrSamplesResponseFormat : bool { dart::JSON = false , dart::Perfetto = true }
 

Functions

 dart::DECLARE_FLAG (bool, trace_service)
 
 dart::DECLARE_FLAG (bool, trace_service_pause_events)
 
 dart::DECLARE_FLAG (bool, profile_vm)
 
 dart::DEFINE_FLAG (charp, vm_name, "vm", "The default name of this vm as reported by the VM service " "protocol")
 
 dart::DEFINE_FLAG (bool, warn_on_pause_with_no_debugger, false, "Print a message when an isolate is paused but there is no " "debugger attached.")
 
 dart::DEFINE_FLAG (charp, log_service_response_sizes, nullptr, "Log sizes of service responses and events to a file in CSV format.")
 
static void dart::PrintInvalidParamError (JSONStream *js, const char *param)
 
static const char * dart::GetVMName ()
 
const ServiceMethodDescriptor * dart::FindMethod (const char *method_name)
 
static void dart::PrintSuccess (JSONStream *js)
 
static bool dart::CheckDebuggerDisabled (Thread *thread, JSONStream *js)
 
static bool dart::CheckProfilerDisabled (Thread *thread, JSONStream *js)
 
static bool dart::GetIntegerId (const char *s, intptr_t *id, int base=10)
 
static bool dart::GetUnsignedIntegerId (const char *s, uintptr_t *id, int base=10)
 
static bool dart::GetInteger64Id (const char *s, int64_t *id, int base=10)
 
static const char * dart::ScanUntilDash (const char *s)
 
static bool dart::GetCodeId (const char *s, int64_t *timestamp, uword *address)
 
static bool dart::GetPrefixedIntegerId (const char *s, const char *prefix, intptr_t *service_id)
 
static bool dart::IsValidClassId (Isolate *isolate, intptr_t cid)
 
static ClassPtr dart::GetClassForId (Isolate *isolate, intptr_t cid)
 
template<typename T >
T dart::EnumMapper (const char *value, const char *const *enums, T *values)
 
static void dart::PrintMissingParamError (JSONStream *js, const char *param)
 
static void dart::PrintUnrecognizedMethodError (JSONStream *js)
 
static bool dart::ValidateParameters (const MethodParameter *const *parameters, JSONStream *js)
 
static void dart::Finalizer (void *isolate_callback_data, void *buffer)
 
static void dart::ReportPauseOnConsole (ServiceEvent *event)
 
static void dart::GetIsolate (Thread *thread, JSONStream *js)
 
static void dart::PrintSentinel (JSONStream *js, SentinelType sentinel_type)
 
static void dart::SetStreamIncludePrivateMembers (Thread *thread, JSONStream *js)
 
static void dart::ActOnIsolateGroup (JSONStream *js, std::function< void(IsolateGroup *)> visitor)
 
static void dart::GetIsolateGroup (Thread *thread, JSONStream *js)
 
static void dart::GetMemoryUsage (Thread *thread, JSONStream *js)
 
static void dart::GetIsolateGroupMemoryUsage (Thread *thread, JSONStream *js)
 
static void dart::GetIsolatePauseEvent (Thread *thread, JSONStream *js)
 
static void dart::GetScripts (Thread *thread, JSONStream *js)
 
static void dart::GetStack (Thread *thread, JSONStream *js)
 
static void dart::HandleCommonEcho (JSONObject *jsobj, JSONStream *js)
 
static void dart::TriggerEchoEvent (Thread *thread, JSONStream *js)
 
static void dart::Echo (Thread *thread, JSONStream *js)
 
static bool dart::ContainsNonInstance (const Object &obj)
 
static ObjectPtr dart::LookupObjectId (Thread *thread, const char *arg, ObjectIdRing::LookupResult *kind)
 
static ObjectPtr dart::LookupClassMembers (Thread *thread, const Class &klass, char **parts, int num_parts)
 
static ObjectPtr dart::LookupHeapObjectLibraries (IsolateGroup *isolate_group, char **parts, int num_parts)
 
static ObjectPtr dart::LookupHeapObjectClasses (Thread *thread, char **parts, int num_parts)
 
static ObjectPtr dart::LookupHeapObjectTypeArguments (Thread *thread, char **parts, int num_parts)
 
static ObjectPtr dart::LookupHeapObjectCode (char **parts, int num_parts)
 
static ObjectPtr dart::LookupHeapObjectMessage (Thread *thread, char **parts, int num_parts)
 
static ObjectPtr dart::LookupHeapObject (Thread *thread, const char *id_original, ObjectIdRing::LookupResult *result)
 
static Breakpoint * dart::LookupBreakpoint (Isolate *isolate, const char *id, ObjectIdRing::LookupResult *result)
 
static void dart::AddParentFieldToResponseBasedOnRecord (Thread *thread, Array *field_names_handle, String *name_handle, const JSONObject &jsresponse, const Record &record, const intptr_t field_slot_offset)
 
static void dart::PrintInboundReferences (Thread *thread, Object *target, intptr_t limit, JSONStream *js)
 
static void dart::GetInboundReferences (Thread *thread, JSONStream *js)
 
static void dart::PrintRetainingPath (Thread *thread, Object *obj, intptr_t limit, JSONStream *js)
 
static void dart::GetRetainingPath (Thread *thread, JSONStream *js)
 
static void dart::GetRetainedSize (Thread *thread, JSONStream *js)
 
static void dart::GetReachableSize (Thread *thread, JSONStream *js)
 
static void dart::Invoke (Thread *thread, JSONStream *js)
 
static bool dart::IsAlpha (char c)
 
static bool dart::IsAlphaOrDollar (char c)
 
static bool dart::IsAlphaNum (char c)
 
static bool dart::IsAlphaNumOrDollar (char c)
 
static bool dart::IsWhitespace (char c)
 
static bool dart::IsObjectIdChar (char c)
 
static bool dart::ParseScope (const char *scope, GrowableArray< const char * > *names, GrowableArray< const char * > *ids)
 
static bool dart::BuildScope (Thread *thread, JSONStream *js, const GrowableObjectArray &names, const GrowableObjectArray &values)
 
static void dart::Evaluate (Thread *thread, JSONStream *js)
 
static void dart::CollectStringifiedType (Thread *thread, Zone *zone, const AbstractType &type, const GrowableObjectArray &output)
 
static void dart::BuildExpressionEvaluationScope (Thread *thread, JSONStream *js)
 
static bool dart::ParseCSVList (const char *csv_list, const GrowableObjectArray &values)
 
static void dart::CompileExpression (Thread *thread, JSONStream *js)
 
ExternalTypedDataPtr dart::DecodeKernelBuffer (const char *kernel_buffer_base64)
 
static void dart::EvaluateCompiledExpression (Thread *thread, JSONStream *js)
 
static void dart::EvaluateInFrame (Thread *thread, JSONStream *js)
 
static void dart::MarkClasses (const Class &root, bool include_subclasses, bool include_implementors)
 
static void dart::UnmarkClasses ()
 
static void dart::GetInstances (Thread *thread, JSONStream *js)
 
static void dart::GetInstancesAsList (Thread *thread, JSONStream *js)
 
template<typename Adder >
static intptr_t dart::ParseJSONCollection (Thread *thread, const char *str, const Adder &add)
 
intptr_t dart::ParseJSONArray (Thread *thread, const char *str, const GrowableObjectArray &elements)
 
static intptr_t dart::ParseJSONSet (Thread *thread, const char *str, ZoneCStringSet *elements)
 
static void dart::GetPorts (Thread *thread, JSONStream *js)
 
static void dart::GetSourceReport (Thread *thread, JSONStream *js)
 
static void dart::ReloadSources (Thread *thread, JSONStream *js)
 
static void dart::AddBreakpointCommon (Thread *thread, JSONStream *js, const String &script_uri)
 
static void dart::AddBreakpoint (Thread *thread, JSONStream *js)
 
static void dart::AddBreakpointWithScriptUri (Thread *thread, JSONStream *js)
 
static void dart::AddBreakpointAtEntry (Thread *thread, JSONStream *js)
 
static void dart::AddBreakpointAtActivation (Thread *thread, JSONStream *js)
 
static void dart::RemoveBreakpoint (Thread *thread, JSONStream *js)
 
static void dart::HandleNativeMetricsList (Thread *thread, JSONStream *js)
 
static void dart::HandleNativeMetric (Thread *thread, JSONStream *js, const char *id)
 
static void dart::GetIsolateMetricList (Thread *thread, JSONStream *js)
 
static void dart::GetIsolateMetric (Thread *thread, JSONStream *js)
 
static void dart::GetCpuSamplesCommon (TimelineOrSamplesResponseFormat format, Thread *thread, JSONStream *js)
 
void dart::GetVMTimelineCommon (TimelineOrSamplesResponseFormat format, Thread *thread, JSONStream *js)
 
static void dart::SetVMTimelineFlags (Thread *thread, JSONStream *js)
 
static void dart::GetVMTimelineFlags (Thread *thread, JSONStream *js)
 
static void dart::GetVMTimelineMicros (Thread *thread, JSONStream *js)
 
static void dart::ClearVMTimeline (Thread *thread, JSONStream *js)
 
static void dart::GetVMTimeline (Thread *thread, JSONStream *js)
 
static void dart::Resume (Thread *thread, JSONStream *js)
 
static void dart::Kill (Thread *thread, JSONStream *js)
 
static void dart::Pause (Thread *thread, JSONStream *js)
 
static void dart::EnableProfiler (Thread *thread, JSONStream *js)
 
static void dart::GetTagProfile (Thread *thread, JSONStream *js)
 
static void dart::GetCpuSamples (Thread *thread, JSONStream *js)
 
static void dart::GetAllocationTraces (Thread *thread, JSONStream *js)
 
static void dart::ClearCpuSamples (Thread *thread, JSONStream *js)
 
static void dart::GetAllocationProfileImpl (Thread *thread, JSONStream *js, bool internal)
 
static void dart::GetAllocationProfilePublic (Thread *thread, JSONStream *js)
 
static void dart::GetAllocationProfile (Thread *thread, JSONStream *js)
 
static void dart::CollectAllGarbage (Thread *thread, JSONStream *js)
 
static void dart::GetHeapMap (Thread *thread, JSONStream *js)
 
static void dart::RequestHeapSnapshot (Thread *thread, JSONStream *js)
 
static intptr_t dart::GetProcessMemoryUsageHelper (JSONStream *js)
 
static void dart::GetProcessMemoryUsage (Thread *thread, JSONStream *js)
 
static void dart::GetPersistentHandles (Thread *thread, JSONStream *js)
 
static void dart::GetPortsPrivate (Thread *thread, JSONStream *js)
 
static void dart::RespondWithMalformedJson (Thread *thread, JSONStream *js)
 
static void dart::RespondWithMalformedObject (Thread *thread, JSONStream *js)
 
static bool dart::GetHeapObjectCommon (Thread *thread, JSONStream *js, const char *id, Object *obj, ObjectIdRing::LookupResult *lookup_result)
 
static void dart::GetObject (Thread *thread, JSONStream *js)
 
static void dart::GetImplementationFields (Thread *thread, JSONStream *js)
 
static void dart::GetObjectStore (Thread *thread, JSONStream *js)
 
static void dart::GetIsolateObjectStore (Thread *thread, JSONStream *js)
 
static void dart::GetClassList (Thread *thread, JSONStream *js)
 
static void dart::GetTypeArgumentsList (Thread *thread, JSONStream *js)
 
static void dart::GetVersion (Thread *thread, JSONStream *js)
 
static void dart::GetVM (Thread *thread, JSONStream *js)
 
static void dart::PopulateUriMappings (Thread *thread)
 
static void dart::LookupScriptUrisImpl (Thread *thread, JSONStream *js, bool lookup_resolved)
 
static void dart::LookupResolvedPackageUris (Thread *thread, JSONStream *js)
 
static void dart::LookupPackageUris (Thread *thread, JSONStream *js)
 
static void dart::SetExceptionPauseMode (Thread *thread, JSONStream *js)
 
static void dart::SetIsolatePauseMode (Thread *thread, JSONStream *js)
 
static void dart::SetBreakpointState (Thread *thread, JSONStream *js)
 
static void dart::GetFlagList (Thread *thread, JSONStream *js)
 
static void dart::SetFlag (Thread *thread, JSONStream *js)
 
static void dart::SetLibraryDebuggable (Thread *thread, JSONStream *js)
 
static void dart::SetName (Thread *thread, JSONStream *js)
 
static void dart::SetVMName (Thread *thread, JSONStream *js)
 
static void dart::SetTraceClassAllocation (Thread *thread, JSONStream *js)
 
static void dart::GetDefaultClassesAliases (Thread *thread, JSONStream *js)
 

Variables

static char * dart::vm_name = nullptr
 
static StreamInfo *const dart::streams_ []
 
static const MethodParameter *const dart::get_isolate_params []
 
static const MethodParameter *const dart::get_isolate_group_params []
 
static const MethodParameter *const dart::set_stream_include_private_members_params []
 
static const MethodParameter *const dart::get_memory_usage_params []
 
static const MethodParameter *const dart::get_isolate_group_memory_usage_params []
 
static const MethodParameter *const dart::get_isolate_pause_event_params []
 
static const MethodParameter *const dart::get_scripts_params []
 
static const MethodParameter *const dart::get_stack_params []
 
static const MethodParameter *const dart::get_inbound_references_params []
 
static const MethodParameter *const dart::get_retaining_path_params []
 
static const MethodParameter *const dart::get_retained_size_params []
 
static const MethodParameter *const dart::get_reachable_size_params []
 
static const MethodParameter *const dart::invoke_params []
 
static const MethodParameter *const dart::evaluate_params []
 
static const MethodParameter *const dart::build_expression_evaluation_scope_params []
 
static const MethodParameter *const dart::compile_expression_params []
 
static const MethodParameter *const dart::evaluate_compiled_expression_params []
 
static const MethodParameter *const dart::evaluate_in_frame_params []
 
static const MethodParameter *const dart::get_instances_params []
 
static const MethodParameter *const dart::get_instances_as_list_params []
 
static const MethodParameter *const dart::get_ports_params []
 
static const char *const dart::report_enum_names []
 
static const MethodParameter *const dart::get_source_report_params []
 
static const MethodParameter *const dart::reload_sources_params []
 
static const MethodParameter *const dart::add_breakpoint_params []
 
static const MethodParameter *const dart::add_breakpoint_with_script_uri_params []
 
static const MethodParameter *const dart::add_breakpoint_at_entry_params []
 
static const MethodParameter *const dart::add_breakpoint_at_activation_params []
 
static const MethodParameter *const dart::remove_breakpoint_params []
 
static const MethodParameter *const dart::get_isolate_metric_list_params []
 
static const MethodParameter *const dart::get_isolate_metric_params []
 
static const MethodParameter *const dart::get_vm_timeline_flags_params []
 
static const MethodParameter *const dart::get_vm_timeline_micros_params []
 
static const MethodParameter *const dart::clear_vm_timeline_params []
 
static const MethodParameter *const dart::get_vm_timeline_params []
 
static const char *const dart::step_enum_names []
 
static const Debugger::ResumeAction dart::step_enum_values []
 
static const MethodParameter *const dart::resume_params []
 
static const MethodParameter *const dart::kill_params []
 
static const MethodParameter *const dart::pause_params []
 
static const MethodParameter *const dart::enable_profiler_params []
 
static const MethodParameter *const dart::get_tag_profile_params []
 
static const MethodParameter *const dart::get_cpu_samples_params []
 
static const MethodParameter *const dart::get_allocation_traces_params []
 
static const MethodParameter *const dart::clear_cpu_samples_params []
 
static const MethodParameter *const dart::get_allocation_profile_params []
 
static const MethodParameter *const dart::collect_all_garbage_params []
 
static const MethodParameter *const dart::get_heap_map_params []
 
static const MethodParameter *const dart::request_heap_snapshot_params []
 
static const MethodParameter *const dart::get_process_memory_usage_params []
 
static const MethodParameter *const dart::get_persistent_handles_params []
 
static const MethodParameter *const dart::get_ports_private_params []
 
static const MethodParameter *const dart::get_object_params []
 
static const MethodParameter *const dart::get_implementation_fields_params []
 
static const MethodParameter *const dart::get_object_store_params []
 
static const MethodParameter *const dart::get_isolate_object_store_params []
 
static const MethodParameter *const dart::get_class_list_params []
 
static const MethodParameter *const dart::get_type_arguments_list_params []
 
static const MethodParameter *const dart::get_version_params []
 
static const MethodParameter *const dart::get_vm_params []
 
static const MethodParameter *const dart::lookup_resolved_package_uris_params []
 
static const MethodParameter *const dart::lookup_package_uris_params []
 
static const char *const dart::exception_pause_mode_names []
 
static Dart_ExceptionPauseInfo dart::exception_pause_mode_values []
 
static const MethodParameter *const dart::set_exception_pause_mode_params []
 
static const MethodParameter *const dart::set_isolate_pause_mode_params []
 
static const MethodParameter *const dart::set_breakpoint_state_params []
 
static const MethodParameter *const dart::get_flag_list_params []
 
static const MethodParameter *const dart::set_flags_params []
 
static const MethodParameter *const dart::set_library_debuggable_params []
 
static const MethodParameter *const dart::set_name_params []
 
static const MethodParameter *const dart::set_vm_name_params []
 
static const MethodParameter *const dart::set_trace_class_allocation_params []
 
static const MethodParameter *const dart::get_default_classes_aliases_params []
 
static const ServiceMethodDescriptor dart::service_methods_ []
 

Macro Definition Documentation

◆ ADD_METRIC [1/4]

#define ADD_METRIC (   type,
  variable,
  name,
  unit 
)     metrics.AddValue(isolate->Get##variable##Metric());

◆ ADD_METRIC [2/4]

#define ADD_METRIC (   type,
  variable,
  name,
  unit 
)     metrics.AddValue(isolate_group->Get##variable##Metric());

◆ ADD_METRIC [3/4]

#define ADD_METRIC (   type,
  variable,
  name,
  unit 
)
Value:
if (strcmp(id, name) == 0) { \
isolate->Get##variable##Metric()->PrintJSON(js); \
return; \
}
DEF_SWITCHES_START aot vmservice shared library name
Definition: switches.h:32

◆ ADD_METRIC [4/4]

#define ADD_METRIC (   type,
  variable,
  name,
  unit 
)
Value:
if (strcmp(id, name) == 0) { \
isolate_group->Get##variable##Metric()->PrintJSON(js); \
return; \
}

◆ DEFINE_ADD_MAP_KEY [1/2]

#define DEFINE_ADD_MAP_KEY (   clazz)
Value:
{JSONArray internals(&map, #clazz); \
DEFINE_ADD_VALUE_F_CID(TypedData##clazz) \
DEFINE_ADD_VALUE_F_CID(TypedData##clazz##View) \
DEFINE_ADD_VALUE_F_CID(ExternalTypedData##clazz) \
DEFINE_ADD_VALUE_F_CID(UnmodifiableTypedData##clazz##View) \
}
SI auto map(std::index_sequence< I... >, Fn &&fn, const Args &... args) -> skvx::Vec< sizeof...(I), decltype(fn(args[0]...))>
Definition: SkVx.h:680

◆ DEFINE_ADD_MAP_KEY [2/2]

#define DEFINE_ADD_MAP_KEY (   clazz)
Value:
{JSONArray internals(&map, #clazz); \
DEFINE_ADD_VALUE_F_CID(Ffi##clazz) \
}

◆ DEFINE_ADD_VALUE_F

#define DEFINE_ADD_VALUE_F (   id)     internals.AddValueF("classes/%" Pd, static_cast<intptr_t>(id));

◆ DEFINE_ADD_VALUE_F_CID

#define DEFINE_ADD_VALUE_F_CID (   clazz)    DEFINE_ADD_VALUE_F(k##clazz##Cid)

◆ ISOLATE_GROUP_PARAMETER

#define ISOLATE_GROUP_PARAMETER   new IdParameter("isolateGroupId", true)

Definition at line 180 of file service.cc.

◆ ISOLATE_PARAMETER

#define ISOLATE_PARAMETER   new IdParameter("isolateId", true)

Definition at line 179 of file service.cc.

◆ NO_ISOLATE_PARAMETER

#define NO_ISOLATE_PARAMETER   new NoSuchParameter("isolateId")

Definition at line 181 of file service.cc.

◆ OBJECT_PARAMETER

#define OBJECT_PARAMETER   new IdParameter("objectId", true)

Definition at line 183 of file service.cc.

◆ RUNNABLE_ISOLATE_PARAMETER

#define RUNNABLE_ISOLATE_PARAMETER   new RunnableIsolateParameter("isolateId")

Definition at line 182 of file service.cc.

◆ Z

#define Z   (T->zone())

Definition at line 61 of file service.cc.