Child processes send trace information back to the parent. Also fixed weird double-activation of children.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3729 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
60
src/trace.c
60
src/trace.c
@ -12,7 +12,8 @@
|
||||
#define _countof(a) ((int)(sizeof((a)) / sizeof(*(a))))
|
||||
#endif
|
||||
|
||||
enum {
|
||||
enum
|
||||
{
|
||||
k_buffer_size = 4 * 1024 * 1024,
|
||||
};
|
||||
|
||||
@ -30,13 +31,33 @@ typedef struct _tf_trace_t
|
||||
char buffer[k_buffer_size];
|
||||
int write_offset;
|
||||
|
||||
tf_trace_write_callback_t* callback;
|
||||
void* user_data;
|
||||
|
||||
tf_trace_stack_t* stack;
|
||||
} tf_trace_t;
|
||||
|
||||
static void _trace_append(tf_trace_t* trace, const char* buffer, size_t size, void* user_data)
|
||||
{
|
||||
if (trace->write_offset + size + 2 >= k_buffer_size)
|
||||
{
|
||||
trace->buffer[trace->write_offset] = '\0';
|
||||
trace->write_offset = 0;
|
||||
}
|
||||
|
||||
if (trace->write_offset + size + 2 < k_buffer_size)
|
||||
{
|
||||
memcpy(trace->buffer + trace->write_offset, buffer, size);
|
||||
trace->write_offset += size;
|
||||
trace->buffer[trace->write_offset++] = '\n';
|
||||
}
|
||||
}
|
||||
|
||||
tf_trace_t* tf_trace_create()
|
||||
{
|
||||
tf_trace_t* trace = malloc(sizeof(tf_trace_t));
|
||||
memset(trace, 0, sizeof(*trace));
|
||||
trace->callback = _trace_append;
|
||||
return trace;
|
||||
}
|
||||
|
||||
@ -51,6 +72,11 @@ void tf_trace_destroy(tf_trace_t* trace)
|
||||
free(trace);
|
||||
}
|
||||
|
||||
void tf_trace_raw(tf_trace_t* trace, const char* buffer, size_t size)
|
||||
{
|
||||
trace->callback(trace, buffer, size, trace->user_data);
|
||||
}
|
||||
|
||||
static int64_t _trace_ts()
|
||||
{
|
||||
int64_t result = 0;
|
||||
@ -62,22 +88,6 @@ static int64_t _trace_ts()
|
||||
return result;
|
||||
}
|
||||
|
||||
static void _trace_append(tf_trace_t* trace, const char* buffer, size_t size)
|
||||
{
|
||||
if (trace->write_offset + size + 2 >= k_buffer_size)
|
||||
{
|
||||
trace->buffer[trace->write_offset] = '\0';
|
||||
trace->write_offset = 0;
|
||||
}
|
||||
|
||||
if (trace->write_offset + size + 2 < k_buffer_size)
|
||||
{
|
||||
memcpy(trace->buffer + trace->write_offset, buffer, size);
|
||||
trace->write_offset += size;
|
||||
trace->buffer[trace->write_offset++] = '\n';
|
||||
}
|
||||
}
|
||||
|
||||
void tf_trace_counter(tf_trace_t* trace, const char* name, int argc, const char** arg_names, const int64_t* arg_values)
|
||||
{
|
||||
if (!trace)
|
||||
@ -93,7 +103,7 @@ void tf_trace_counter(tf_trace_t* trace, const char* name, int argc, const char*
|
||||
p += snprintf(line + p, sizeof(line) - p, "\"%s\": %" PRId64 "%s", arg_names[i], arg_values[i], i == argc - 1 ? "}}," : ", ");
|
||||
}
|
||||
|
||||
_trace_append(trace, line, p);
|
||||
trace->callback(trace, line, p, trace->user_data);
|
||||
}
|
||||
|
||||
void tf_trace_begin(tf_trace_t* trace, const char* name)
|
||||
@ -137,7 +147,7 @@ void tf_trace_begin(tf_trace_t* trace, const char* name)
|
||||
}
|
||||
}
|
||||
p += snprintf(line + p, sizeof(line) - p, "\"},");
|
||||
_trace_append(trace, line, p);
|
||||
trace->callback(trace, line, p, trace->user_data);
|
||||
}
|
||||
|
||||
void tf_trace_end(tf_trace_t* trace)
|
||||
@ -158,6 +168,10 @@ void tf_trace_end(tf_trace_t* trace)
|
||||
name = stack->names[stack->count - 1];
|
||||
stack->count--;
|
||||
}
|
||||
if (!name)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
char line[1024];
|
||||
int p = snprintf(line, sizeof(line), "{\"ph\": \"E\", \"pid\": %d, \"tid\": 0, \"ts\": %" PRId64 ", \"name\": \"", getpid(), _trace_ts());
|
||||
@ -179,7 +193,7 @@ void tf_trace_end(tf_trace_t* trace)
|
||||
}
|
||||
}
|
||||
p += snprintf(line + p, sizeof(line) - p, "\"},");
|
||||
_trace_append(trace, line, p);
|
||||
trace->callback(trace, line, p, trace->user_data);
|
||||
}
|
||||
|
||||
char* tf_trace_export(tf_trace_t* trace)
|
||||
@ -235,6 +249,12 @@ static int _tf_trace_sqlite_callback(unsigned int t, void* c, void* p, void* x)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void tf_trace_set_write_callback(tf_trace_t* trace, tf_trace_write_callback_t* callback, void* user_data)
|
||||
{
|
||||
trace->callback = callback;
|
||||
trace->user_data = user_data;
|
||||
}
|
||||
|
||||
void tf_trace_sqlite(tf_trace_t* trace, sqlite3* sqlite)
|
||||
{
|
||||
if (sqlite)
|
||||
|
Reference in New Issue
Block a user