Source code for screpl.bridge_server.blocks.profile
"""Defines ProfileBlock"""
from eudplib import *
from screpl.bridge_server import block
from screpl.monitor import profile_table
_buf = None
[docs]def get_block():
global _buf
if _buf is None:
count = len(profile_table.table)
base = 4 + 16 * count
str_offsets = []
str_table = bytes()
# evaluate offsets for profile names
for i in range(count):
name = profile_table.table[i][0]
str_offsets.append(base + len(str_table))
str_table += name.encode('utf-8') + b'\x00'
# construct buffer
_buf = i2b4(count)
for i in range(count):
_buf += i2b4(str_offsets[i])
_buf += bytes(12)
_buf += str_table
# padding for 4 byte aligning
if len(_buf) % 4:
_buf += bytes(4 - (len(_buf) % 4))
assert len(_buf) % 4 == 0
return _buf
[docs]class ProfileBlock(block.BridgeBlock):
"""Provides profiled results
.. code-block:: C
struct VariableEntry {
int name_offset; // relative offset to ProfileBlock address
int counter;
int total_ms;
int total_ticks;
};
struct ProfileBlock {
int var_count;
VariableEntry var_entries[var_count];
char var_names[var_count]; // null-ended strings
};
"""
signature = b'PROF'
[docs] def get_buffer_size(self):
return len(get_block())
[docs] def write_payload(self, emitbuffer):
buf_size = self.get_buffer_size()
emitbuffer.WriteDword(b2i4(type(self).signature))
emitbuffer.WriteDword(buf_size)
emitbuffer.WriteBytes(get_block())
[docs] def update_content(self):
computes = []
for i, (name, counter, total_ms, total_ems) in \
enumerate(profile_table.table):
computes.append((EPD(self + i * 16 + 8), SetTo, counter))
computes.append((EPD(self + i * 16 + 12), SetTo, total_ms))
computes.append((EPD(self + i * 16 + 16), SetTo, total_ems))
SeqCompute(computes)