extern struct list trace_sources;
extern THREAD_LOCAL struct buffer trace_buf;
+void __trace(uint64_t mask, struct trace_source *src, const struct ist msg);
+
/* return a single char to describe a trace state */
static inline char trace_state_char(enum trace_state st)
{
LIST_ADDQ(&trace_sources, &source->source_link);
}
+/* sends a trace for the given source */
+static inline void trace(uint64_t mask, struct trace_source *src, const struct ist msg)
+{
+ if (unlikely(src->state != TRACE_STATE_STOPPED))
+ __trace(mask, src, msg);
+}
+
#endif /* _PROTO_TRACE_H */
/*
REGISTER_PER_THREAD_ALLOC(alloc_trace_buffers_per_thread);
REGISTER_PER_THREAD_FREE(free_trace_buffers_per_thread);
+/* write a message for the given trace source */
+void __trace(uint64_t mask, struct trace_source *src, const struct ist msg)
+{
+ if (likely(src->state == TRACE_STATE_STOPPED))
+ return;
+
+ /* check that at least one action is interested by this event */
+ if (((src->report_events | src->start_events | src->pause_events | src->stop_events) & mask) == 0)
+ return;
+
+ /* TODO: add handling of filters here, return if no match (not even update states) */
+
+ /* check if we need to start the trace now */
+ if (src->state == TRACE_STATE_WAITING) {
+ if ((src->start_events & mask) == 0)
+ return;
+
+ /* TODO: add update of lockon+lockon_ptr here */
+ HA_ATOMIC_STORE(&src->state, TRACE_STATE_RUNNING);
+ }
+
+ /* TODO: add check of lockon+lockon_ptr here, return if no match */
+ /* here the trace is running and is tracking a desired item */
+
+ if ((src->report_events & mask) == 0)
+ goto end;
+
+ if (src->sink)
+ sink_write(src->sink, &msg, 1);
+
+ end:
+ /* check if we need to stop the trace now */
+ if ((src->stop_events & mask) != 0) {
+ HA_ATOMIC_STORE(&src->state, TRACE_STATE_STOPPED);
+ }
+ else if ((src->pause_events & mask) != 0) {
+ HA_ATOMIC_STORE(&src->state, TRACE_STATE_WAITING);
+ }
+}
+
struct trace_source *trace_find_source(const char *name)
{
struct trace_source *src;