44
55#pragma once
66
7- #include < fstream>
8- #include < iostream>
97#include < memory>
10- #include < mutex>
11- #include < ostream>
8+ #include < string>
129#include < string_view>
1310
1411#include < echion/config.h>
@@ -63,219 +60,34 @@ class RendererInterface
6360 virtual ~RendererInterface () = default ;
6461};
6562
66- class MojoRenderer : public RendererInterface
63+ class NullRenderer : public RendererInterface
6764{
68- std::ofstream output;
69- std::mutex lock;
70- uint64_t metric = 0 ;
71-
72- void inline event (MojoEvent event)
73- {
74- output.put (static_cast <char >(event));
75- }
76- void inline string (const std::string& string)
77- {
78- output << string << ' \0 ' ;
79- }
80- void inline string (const char * string)
81- {
82- output << string << ' \0 ' ;
83- }
84- void inline ref (mojo_ref_t value)
85- {
86- integer (value);
87- }
88- void inline integer (mojo_int_t n)
89- {
90- mojo_uint_t integer = n < 0 ? -n : n;
91- bool sign = n < 0 ;
92-
93- unsigned char byte = integer & 0x3f ;
94- if (sign)
95- byte |= 0x40 ;
96-
97- integer >>= 6 ;
98- if (integer)
99- byte |= 0x80 ;
100-
101- output.put (byte);
102-
103- while (integer)
104- {
105- byte = integer & 0x7f ;
106- integer >>= 7 ;
107- if (integer)
108- byte |= 0x80 ;
109- output.put (byte);
110- }
111- }
112-
11365public:
114- MojoRenderer () = default ;
115-
116- [[nodiscard]] Result<void > open () override
117- {
118- output.open (std::getenv (" ECHION_OUTPUT" ));
119- if (!output.is_open ())
120- {
121- std::cerr << " Failed to open output file " << std::getenv (" ECHION_OUTPUT" ) << std::endl;
122- return ErrorKind::RendererError;
123- }
124-
125- return Result<void >::ok ();
126- }
127-
128- // ------------------------------------------------------------------------
129- void close () override
130- {
131- std::lock_guard<std::mutex> guard (lock);
132-
133- output.flush ();
134- output.close ();
135- }
136-
137- // ------------------------------------------------------------------------
138- void inline header () override
139- {
140- std::lock_guard<std::mutex> guard (lock);
141-
142- output << " MOJ" ;
143- integer (MOJO_VERSION);
144- }
145-
146- // ------------------------------------------------------------------------
147- void inline metadata (const std::string& label, const std::string& value) override
148- {
149- std::lock_guard<std::mutex> guard (lock);
150-
151- event (MOJO_METADATA);
152- string (label);
153- string (value);
154- }
155-
156- // ------------------------------------------------------------------------
157- void inline stack (mojo_int_t pid, mojo_int_t iid, const std::string& thread_name)
158- {
159- std::lock_guard<std::mutex> guard (lock);
160-
161- event (MOJO_STACK);
162- integer (pid);
163- integer (iid);
164- string (thread_name);
165- }
166-
167- // ------------------------------------------------------------------------
168- void inline frame (mojo_ref_t key, mojo_ref_t filename, mojo_ref_t name, mojo_int_t line,
169- mojo_int_t line_end, mojo_int_t column, mojo_int_t column_end) override
170- {
171- std::lock_guard<std::mutex> guard (lock);
172-
173- event (MOJO_FRAME);
174- ref (key);
175- ref (filename);
176- ref (name);
177- integer (line);
178- integer (line_end);
179- integer (column);
180- integer (column_end);
181- }
182-
183- // ------------------------------------------------------------------------
184- void inline frame_ref (mojo_ref_t key) override
185- {
186- std::lock_guard<std::mutex> guard (lock);
187-
188- if (key == 0 )
189- {
190- event (MOJO_FRAME_INVALID);
191- }
192- else
193- {
194- event (MOJO_FRAME_REF);
195- ref (key);
196- }
197- }
198-
199- // ------------------------------------------------------------------------
200- void inline frame_kernel (const std::string& scope) override
201- {
202- std::lock_guard<std::mutex> guard (lock);
203-
204- event (MOJO_FRAME_KERNEL);
205- string (scope);
206- }
207-
208- // ------------------------------------------------------------------------
209- void inline metric_time (mojo_int_t value)
210- {
211- std::lock_guard<std::mutex> guard (lock);
212-
213- event (MOJO_METRIC_TIME);
214- integer (value);
215- }
216-
217- // ------------------------------------------------------------------------
218- void inline metric_memory (mojo_int_t value)
219- {
220- std::lock_guard<std::mutex> guard (lock);
221-
222- event (MOJO_METRIC_MEMORY);
223- integer (value);
224- }
225-
226- // ------------------------------------------------------------------------
227- void inline string (mojo_ref_t key, const std::string& value) override
228- {
229- std::lock_guard<std::mutex> guard (lock);
230-
231- event (MOJO_STRING);
232- ref (key);
233- string (value);
234- }
235-
236- // ------------------------------------------------------------------------
237- void inline string_ref (mojo_ref_t key) override
238- {
239- std::lock_guard<std::mutex> guard (lock);
240-
241- event (MOJO_STRING_REF);
242- ref (key);
243- }
244-
245- void render_message (std::string_view) override {};
246- void render_thread_begin (PyThreadState*, std::string_view, microsecond_t , uintptr_t ,
247- unsigned long ) override {};
248- void render_task_begin (std::string, bool ) override {};
249- void render_stack_begin (long long pid, long long iid, const std::string& name) override
250- {
251- stack (pid, iid, name);
252- };
253- void render_frame (Frame& frame) override ;
254- void render_cpu_time (uint64_t cpu_time) override
255- {
256- metric = cpu_time;
257- };
258- void render_stack_end (MetricType metric_type, uint64_t delta) override
259- {
260- if (metric_type == MetricType::Time)
261- {
262- metric_time (cpu ? metric : delta);
263- }
264- else if (metric_type == MetricType::Memory)
265- {
266- metric_memory (delta);
267- }
268- };
269- bool is_valid () override
270- {
271- return true ;
272- }
66+ bool is_valid () override { return true ; }
67+ void header () override {}
68+ void metadata (const std::string&, const std::string&) override {}
69+ void frame (mojo_ref_t , mojo_ref_t , mojo_ref_t , mojo_int_t , mojo_int_t , mojo_int_t , mojo_int_t ) override {}
70+ void frame_ref (mojo_ref_t ) override {}
71+ void frame_kernel (const std::string&) override {}
72+
73+ void string (mojo_ref_t , const std::string&) override {}
74+ void string_ref (mojo_ref_t ) override {}
75+ void render_message (std::string_view) override {}
76+ void render_thread_begin (PyThreadState*, std::string_view, microsecond_t , uintptr_t , unsigned long ) override {}
77+ void render_task_begin (std::string, bool ) override {}
78+ void render_stack_begin (long long , long long , const std::string&) override {}
79+ void render_frame (Frame&) override {}
80+ void render_cpu_time (uint64_t ) override {}
81+ void render_stack_end (MetricType, uint64_t ) override {}
82+
83+ Result<void > open () override { return Result<void >::ok (); }
84+ void close () override {}
27385};
27486
27587class Renderer
27688{
27789private:
278- std::shared_ptr<RendererInterface> default_renderer = std::make_shared<MojoRenderer >();
90+ std::shared_ptr<RendererInterface> defaultRenderer = std::make_shared<NullRenderer >();
27991 std::weak_ptr<RendererInterface> currentRenderer;
28092
28193 std::shared_ptr<RendererInterface> getActiveRenderer ()
@@ -287,7 +99,8 @@ class Renderer
28799 return renderer;
288100 }
289101 }
290- return default_renderer;
102+
103+ return defaultRenderer;
291104 }
292105
293106 Renderer () = default ;
0 commit comments