Patchwork [19/22] instrument: Add client-side API to control event instrumentation

login
register
mail settings
Submitter Lluís Vilanova
Date March 26, 2013, 2:02 p.m.
Message ID <20130326140207.4471.77083.stgit@fimbulvetr.bsc.es>
Download mbox | patch
Permalink /patch/231234/
State New
Headers show

Comments

Lluís Vilanova - March 26, 2013, 2:02 p.m.
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
 instrument/qemu-instr/control-internal.h |   16 ++++++++
 instrument/qemu-instr/control.h          |   61 ++++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+)

Patch

diff --git a/instrument/qemu-instr/control-internal.h b/instrument/qemu-instr/control-internal.h
index 5898466..1b4cef9 100644
--- a/instrument/qemu-instr/control-internal.h
+++ b/instrument/qemu-instr/control-internal.h
@@ -8,6 +8,7 @@ 
  */
 
 #include "trace/control.h"
+#include "instrument/control.h"
 
 
 QI_IDEF QIEvent* qi_ctrl_event_id(QIEventID id)
@@ -35,6 +36,16 @@  QI_IDEF QIEventID qi_ctrl_event_count(void)
     return (QIEventID)trace_event_count();
 }
 
+QI_IDEF bool qi_ctrl_dynamic(void)
+{
+    return instr_dynamic();
+}
+
+QI_IDEF bool qi_ctrl_event_is_available(QIEvent *ev)
+{
+    return instr_event_available((TraceEvent*)ev);
+}
+
 
 
 QI_IDEF QIEventID qi_ctrl_event_get_id(QIEvent *ev)
@@ -46,3 +57,8 @@  QI_IDEF const char * qi_ctrl_event_get_name(QIEvent *ev)
 {
     return trace_event_get_name((TraceEvent*)ev);
 }
+
+QI_IDEF bool qi_ctrl_event_set(QIEvent *ev, void *cb)
+{
+    return instr_event_set((TraceEvent*)ev, cb);
+}
diff --git a/instrument/qemu-instr/control.h b/instrument/qemu-instr/control.h
index f19b4d7..eb81716 100644
--- a/instrument/qemu-instr/control.h
+++ b/instrument/qemu-instr/control.h
@@ -96,6 +96,13 @@  QI_IDECL bool qi_ctrl_event_is_pattern(const char *str);
  */
 QI_IDECL QIEventID qi_ctrl_event_count(void);
 
+/**
+ * qi_ctrl_dynamic:
+ *
+ * Returns: Whether dynamic trace instrumentation is available.
+ */
+QI_IDECL bool qi_ctrl_dynamic(void);
+
 
 
 /**
@@ -112,6 +119,60 @@  QI_IDECL QIEventID qi_ctrl_event_get_id(QIEvent *ev);
  */
 QI_IDECL const char * qi_ctrl_event_get_name(QIEvent *ev);
 
+/**
+ * qi_ctrl_event_is_available:
+ *
+ * Returns: Whether the given event has the 'instrument' property.
+ */
+QI_IDECL bool qi_ctrl_event_is_available(QIEvent *ev);
+
+
+/**
+ * QI_CTRL_INSTR_NOP:
+ *
+ * Set instrumentation callback to no-operation.
+ * (qi_event_${name}_nop).
+ */
+#define QI_CTRL_INSTR_NOP ((void*)NULL)
+
+/**
+ * QI_CTRL_INSTR_NEXT:
+ *
+ * Set instrumentation callback to the "next logical step"
+ * (qi_event_${name}_trace).
+ */
+#define QI_CTRL_INSTR_NEXT ((void*)1)
+
+/**
+ * QI_CTRL_INSTR_AUTO:
+ *
+ * Automatically set callback to proper routine.
+ *
+ * Looks for a symbol name in the instrumentation library matching the event
+ * name (qi_event_${name}).
+ */
+#define QI_CTRL_INSTR_AUTO    ((void*)2)
+
+/**
+ * qi_ctrl_event_set:
+ * @ev: Event descriptor.
+ * @cb: Pointer to instrumentation callback.
+ *
+ * Set the instrumentation callback for the given event.
+ *
+ * @cb can also be set to any of the QI_CTRL_INSTR_* special values.
+ *
+ * #false indicates that the instrumentation library does not export the
+ * appropriate symbol for the instrumentation routine.
+ *
+ * Pre-condition: qi_ctrl_dynamic() == true
+ * Pre-condition: qi_ctrl_event_is_available(ev) == true
+ *
+ * Returns: Whether the callback could be set (if @cb was QI_CTRL_INSTR_AUTO,
+ *          otherwise always #true).
+ */
+QI_IDECL bool qi_ctrl_event_set(QIEvent *ev, void *cb);
+
 
 #if !defined(QI_TYPE_DYNAMIC)
 #include "instrument/qemu-instr/control-internal.h"