@@ -17,7 +17,7 @@ class ClassEntrySizeCounter : public param_archive_entry {
1717 uint64_t * sizeCounter;
1818 ClassEntrySizeCounter* parent = nullptr ;
1919 std::vector<ClassEntrySizeCounter*> activeSubs;
20- std::string* data;
20+ std::string* data = nullptr ;
2121
2222 ClassEntrySizeCounter (r_string name_, uint64_t * size) : sizeCounter(size) {
2323 *sizeCounter += name_.length ();
@@ -34,6 +34,10 @@ class ClassEntrySizeCounter : public param_archive_entry {
3434 ClassEntrySizeCounter (r_string name_, ClassEntrySizeCounter* parent_) : sizeCounter(parent_->sizeCounter), parent(parent_), data(parent_->data) {
3535 *sizeCounter += name_.length ();
3636 parent->activeSubs .push_back (this );
37+ if (data) {
38+ *data += name_;
39+ data->push_back (' /' );
40+ }
3741 };
3842
3943 // ! virtual destructor
@@ -178,10 +182,9 @@ class ClassEntrySizeCounter : public param_archive_entry {
178182void NetworkProfiler::init () {
179183 auto iface = client::host::request_plugin_interface (" BIDebugEngine_getCallstack" , 1 );
180184 if (!iface) {
181- diag_log (" ASP: Network statistics failed to enable because ArmaDebugEngine is missing" sv);
182- return ;
183- }
184- getCallstackRaw = reinterpret_cast <decltype (getCallstackRaw)>(*iface);
185+ diag_log (" ASP: Network statistics ArmaDebugEngine not present, you won't get callstacks" sv);
186+ } else
187+ getCallstackRaw = reinterpret_cast <decltype (getCallstackRaw)>(*iface);
185188
186189 static auto _pubVar = client::host::register_sqf_command (" publicVariable" , " Profiler redirect" , [](game_state& gs, game_value_parameter arg) -> game_value {
187190 static tracy::SourceLocationData info {
@@ -191,7 +194,8 @@ void NetworkProfiler::init() {
191194 0
192195 };
193196 static int64_t publicVarSize;
194- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
197+ auto_array<std::pair<r_string, uint32_t >> callstack;
198+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
195199
196200 r_string varName = arg;
197201 auto varValue = sqf::get_variable (sqf::current_namespace (), varName);
@@ -200,8 +204,8 @@ void NetworkProfiler::init() {
200204 publicVarSize += getVariableSize (varValue, logPacketContent ? &data : nullptr );
201205 publicVarSize += varName.size ();
202206
203- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
204- AdapterTracy::sendCallstack (callstack);
207+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
208+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
205209 if (logPacketContent)
206210 zone.Text (data.c_str (), data.size ());
207211 else
@@ -222,7 +226,8 @@ void NetworkProfiler::init() {
222226 0
223227 };
224228 static int64_t publicVarSize;
225- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
229+ auto_array<std::pair<r_string, uint32_t >> callstack;
230+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
226231
227232 r_string varName = arg;
228233 auto varValue = sqf::get_variable (sqf::current_namespace (), varName);
@@ -232,8 +237,8 @@ void NetworkProfiler::init() {
232237 publicVarSize += varName.size ();
233238 publicVarSize += 4 ; // clientID
234239
235- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
236- AdapterTracy::sendCallstack (callstack);
240+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
241+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
237242 if (logPacketContent)
238243 zone.Text (data.c_str (), data.size ());
239244 else
@@ -254,7 +259,8 @@ void NetworkProfiler::init() {
254259 0
255260 };
256261 static int64_t publicVarSize;
257- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
262+ auto_array<std::pair<r_string, uint32_t >> callstack;
263+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
258264
259265 r_string varName = arg;
260266 auto varValue = sqf::get_variable (sqf::current_namespace (), varName);
@@ -263,8 +269,8 @@ void NetworkProfiler::init() {
263269 publicVarSize += getVariableSize (varValue, logPacketContent ? &data : nullptr );
264270 publicVarSize += varName.size ();
265271
266- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
267- AdapterTracy::sendCallstack (callstack);
272+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
273+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
268274 if (logPacketContent)
269275 zone.Text (data.c_str (), data.size ());
270276 else
@@ -284,15 +290,16 @@ void NetworkProfiler::init() {
284290 " " ,
285291 0
286292 };
287- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
293+ auto_array<std::pair<r_string, uint32_t >> callstack;
294+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
288295
289296 std::string data;
290297 remoteExecSize += getVariableSize (arg, logPacketContent ? &data : nullptr );
291298
292299 r_string name = arg[0 ];
293300
294- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
295- AdapterTracy::sendCallstack (callstack);
301+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
302+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
296303 if (logPacketContent)
297304 zone.Text (data.c_str (), data.size ());
298305 else
@@ -310,16 +317,17 @@ void NetworkProfiler::init() {
310317 " " ,
311318 0
312319 };
313- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
320+ auto_array<std::pair<r_string, uint32_t >> callstack;
321+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
314322
315323 std::string data;
316324 remoteExecSize += getVariableSize (par, logPacketContent ? &data : nullptr );
317325 remoteExecSize += getVariableSize (arg, logPacketContent ? &data : nullptr );
318326
319327 r_string name = arg[0 ];
320328
321- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
322- AdapterTracy::sendCallstack (callstack);
329+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
330+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
323331 if (logPacketContent)
324332 zone.Text (data.c_str (), data.size ());
325333 else
@@ -336,15 +344,16 @@ void NetworkProfiler::init() {
336344 " " ,
337345 0
338346 };
339- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
347+ auto_array<std::pair<r_string, uint32_t >> callstack;
348+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
340349
341350 std::string data;
342351 remoteExecSize += getVariableSize (arg, logPacketContent ? &data : nullptr );
343352
344353 r_string name = arg[0 ];
345354
346- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
347- AdapterTracy::sendCallstack (callstack);
355+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
356+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
348357 if (logPacketContent)
349358 zone.Text (data.c_str (), data.size ());
350359 else
@@ -363,16 +372,17 @@ void NetworkProfiler::init() {
363372 0
364373 };
365374
366- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
375+ auto_array<std::pair<r_string, uint32_t >> callstack;
376+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
367377
368378 std::string data;
369379 remoteExecSize += getVariableSize (par, logPacketContent ? &data : nullptr );
370380 remoteExecSize += getVariableSize (arg, logPacketContent ? &data : nullptr );
371381
372382 r_string name = arg[0 ];
373383
374- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
375- AdapterTracy::sendCallstack (callstack);
384+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
385+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
376386 if (logPacketContent)
377387 zone.Text (data.c_str (), data.size ());
378388 else
@@ -393,16 +403,17 @@ void NetworkProfiler::init() {
393403 if (arg.size () != 3 || arg[2 ].type_enum () != game_data_type::BOOL || !static_cast <bool >(arg[2 ]))
394404 return host::functions.invoke_raw_binary (__sqf::binary__setvariable__object__array__ret__nothing, par, arg);
395405
396- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
406+ auto_array<std::pair<r_string, uint32_t >> callstack;
407+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
397408
398409 std::string data;
399410 setVariableSize += getVariableSize (par, logPacketContent ? &data : nullptr );
400411 setVariableSize += getVariableSize (arg, logPacketContent ? &data : nullptr );
401412
402413 r_string name = arg[0 ];
403414
404- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
405- AdapterTracy::sendCallstack (callstack);
415+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
416+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
406417 if (logPacketContent)
407418 zone.Text (data.c_str (), data.size ());
408419 else
@@ -423,16 +434,17 @@ void NetworkProfiler::init() {
423434 if (arg.size () != 3 || arg[2 ].type_enum () != game_data_type::BOOL || !static_cast <bool >(arg[2 ]))
424435 return host::functions.invoke_raw_binary (__sqf::binary__setvariable__namespace__array__ret__nothing, par, arg);
425436
426- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
437+ auto_array<std::pair<r_string, uint32_t >> callstack;
438+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
427439
428440 std::string data;
429441 setVariableSize += getVariableSize (par, logPacketContent ? &data : nullptr );
430442 setVariableSize += getVariableSize (arg, logPacketContent ? &data : nullptr );
431443
432444 r_string name = arg[0 ];
433445
434- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
435- AdapterTracy::sendCallstack (callstack);
446+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
447+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
436448 if (logPacketContent)
437449 zone.Text (data.c_str (), data.size ());
438450 else
@@ -453,16 +465,17 @@ void NetworkProfiler::init() {
453465 if (arg.size () != 3 || arg[2 ].type_enum () != game_data_type::BOOL || !static_cast <bool >(arg[2 ]))
454466 return host::functions.invoke_raw_binary (__sqf::binary__setvariable__location__array__ret__nothing, par, arg);
455467
456- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
468+ auto_array<std::pair<r_string, uint32_t >> callstack;
469+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
457470
458471 std::string data;
459472 setVariableSize += getVariableSize (par, logPacketContent ? &data : nullptr );
460473 setVariableSize += getVariableSize (arg, logPacketContent ? &data : nullptr );
461474
462475 r_string name = arg[0 ];
463476
464- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
465- AdapterTracy::sendCallstack (callstack);
477+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
478+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
466479 if (logPacketContent)
467480 zone.Text (data.c_str (), data.size ());
468481 else
@@ -483,16 +496,17 @@ void NetworkProfiler::init() {
483496 if (arg.size () != 3 || arg[2 ].type_enum () != game_data_type::BOOL || !static_cast <bool >(arg[2 ]))
484497 return host::functions.invoke_raw_binary (__sqf::binary__setvariable__group__array__ret__nothing, par, arg);
485498
486- auto callstack = NetworkProfiler::getCallstackRaw (&gs);
499+ auto_array<std::pair<r_string, uint32_t >> callstack;
500+ if (getCallstackRaw) callstack = getCallstackRaw (&gs);
487501
488502 std::string data;
489503 setVariableSize += getVariableSize (par, logPacketContent ? &data : nullptr );
490504 setVariableSize += getVariableSize (arg, logPacketContent ? &data : nullptr );
491505
492506 r_string name = arg[0 ];
493507
494- tracy::ScopedZone zone (&info, tracy::t_withCallstack{});
495- AdapterTracy::sendCallstack (callstack);
508+ tracy::ScopedZone zone (&info, tracy::t_withCallstack{ getCallstackRaw != nullptr });
509+ if (getCallstackRaw) AdapterTracy::sendCallstack (callstack);
496510 if (logPacketContent)
497511 zone.Text (data.c_str (), data.size ());
498512 else
@@ -506,15 +520,10 @@ void NetworkProfiler::init() {
506520uint32_t NetworkProfiler::getVariableSize (const game_value& var, std::string* data) {
507521 auto ncnst = const_cast <game_value&>(var);
508522 uint64_t size = 0 ;
509- if (data) {
510- param_archive ar (rv_allocator<ClassEntrySizeCounter>::create_single (" " sv, &size, data));
511523
512- (&ncnst)->serialize (ar);
513- } else {
514- param_archive ar (rv_allocator<ClassEntrySizeCounter>::create_single (" " sv, &size));
524+ param_archive ar (rv_allocator<ClassEntrySizeCounter>::create_single (" " sv, &size, data));
515525
516- (&ncnst)->serialize (ar);
517- }
526+ (&ncnst)->serialize (ar);
518527
519528 return size;
520529}
0 commit comments