1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // TODO(PT-63): This file contains wrappers that use fdio to connect to
6 // trace manager. An open question is whether to keep them.
7 
8 #include <stdio.h>
9 
10 #include <lib/zx/process.h>
11 #include <trace-provider/fdio_connect.h>
12 #include <trace-provider/provider.h>
13 
14 #include <zircon/assert.h>
15 #include <zircon/status.h>
16 
trace_provider_create_with_name_fdio(async_dispatcher_t * dispatcher,const char * name)17 trace_provider_t* trace_provider_create_with_name_fdio(
18         async_dispatcher_t* dispatcher, const char* name) {
19     ZX_DEBUG_ASSERT(dispatcher);
20 
21     zx_handle_t to_service;
22     auto status = trace_provider_connect_with_fdio(&to_service);
23     if (status != ZX_OK) {
24         fprintf(stderr, "TraceProvider: connection failed: status=%d(%s)\n",
25                 status, zx_status_get_string(status));
26         return nullptr;
27     }
28 
29     return trace_provider_create_with_name_etc(to_service, dispatcher, name);
30 }
31 
trace_provider_create_with_fdio(async_dispatcher_t * dispatcher)32 trace_provider_t* trace_provider_create_with_fdio(
33         async_dispatcher_t* dispatcher) {
34     auto self = zx::process::self();
35     char name[ZX_MAX_NAME_LEN];
36     auto status = self->get_property(ZX_PROP_NAME, name, sizeof(name));
37     if (status != ZX_OK) {
38         fprintf(stderr, "TraceProvider: error getting process name: status=%d(%s)\n",
39                 status, zx_status_get_string(status));
40         name[0] = '\0';
41     }
42     return trace_provider_create_with_name(dispatcher, name);
43 }
44 
trace_provider_create_synchronously_with_fdio(async_dispatcher_t * dispatcher,const char * name,bool * out_manager_is_tracing_already)45 trace_provider_t* trace_provider_create_synchronously_with_fdio(
46         async_dispatcher_t* dispatcher, const char* name,
47         bool* out_manager_is_tracing_already) {
48     ZX_DEBUG_ASSERT(dispatcher);
49 
50     zx_handle_t to_service;
51     auto status = trace_provider_connect_with_fdio(&to_service);
52     if (status != ZX_OK) {
53         fprintf(stderr, "TraceProvider: connection failed: status=%d(%s)\n",
54                 status, zx_status_get_string(status));
55         return nullptr;
56     }
57 
58     return trace_provider_create_synchronously_etc(
59         to_service, dispatcher, name, out_manager_is_tracing_already);
60 }
61 
trace_provider_create_with_name(async_dispatcher_t * dispatcher,const char * name)62 trace_provider_t* trace_provider_create_with_name(
63         async_dispatcher_t* dispatcher, const char* name) {
64     return trace_provider_create_with_name_fdio(dispatcher, name);
65 }
66 
trace_provider_create(async_dispatcher_t * dispatcher)67 trace_provider_t* trace_provider_create(async_dispatcher_t* dispatcher) {
68     return trace_provider_create_with_fdio(dispatcher);
69 }
70 
trace_provider_create_synchronously(async_dispatcher_t * dispatcher,const char * name,bool * out_manager_is_tracing_already)71 trace_provider_t* trace_provider_create_synchronously(
72         async_dispatcher_t* dispatcher, const char* name,
73         bool* out_manager_is_tracing_already) {
74     return trace_provider_create_synchronously_with_fdio(
75         dispatcher, name, out_manager_is_tracing_already);
76 }
77