api: API trace improvements
[vpp.git] / src / vppinfra / elog.c
index 62bd979..8ae752e 100644 (file)
@@ -61,7 +61,7 @@ elog_unlock (elog_main_t * em)
 }
 
 /* Non-inline version. */
-void *
+__clib_export void *
 elog_event_data (elog_main_t * em,
                 elog_event_type_t * type, elog_track_t * track, u64 cpu_time)
 {
@@ -194,7 +194,7 @@ elog_event_type_register (elog_main_t * em, elog_event_type_t * t)
   return l;
 }
 
-word
+__clib_export word
 elog_track_register (elog_main_t * em, elog_track_t * t)
 {
   word l;
@@ -292,7 +292,7 @@ done:
   return s;
 }
 
-u8 *
+__clib_export u8 *
 format_elog_event (u8 * s, va_list * va)
 {
   elog_main_t *em = va_arg (*va, elog_main_t *);
@@ -395,8 +395,8 @@ format_elog_event (u8 * s, va_list * va)
   return s;
 }
 
-u8 *
-format_elog_track_name (u8 * s, va_list * va)
+__clib_export u8 *
+format_elog_track_name (u8 *s, va_list *va)
 {
   elog_main_t *em = va_arg (*va, elog_main_t *);
   elog_event_t *e = va_arg (*va, elog_event_t *);
@@ -404,7 +404,7 @@ format_elog_track_name (u8 * s, va_list * va)
   return format (s, "%s", t->name);
 }
 
-u8 *
+__clib_export u8 *
 format_elog_track (u8 * s, va_list * args)
 {
   elog_main_t *em = va_arg (*args, elog_main_t *);
@@ -427,6 +427,15 @@ format_elog_track (u8 * s, va_list * args)
   return s;
 }
 
+__clib_export char *
+format_one_elog_event (void *em_arg, void *ep_arg)
+{
+  elog_main_t *em = (elog_main_t *) em_arg;
+  elog_event_t *ep = (elog_event_t *) ep_arg;
+
+  return (char *) format (0, "%U", format_elog_event, em, ep);
+}
+
 void
 elog_time_now (elog_time_stamp_t * et)
 {
@@ -475,21 +484,32 @@ elog_nsec_per_clock (elog_main_t * em)
                                            &em->init_time));
 }
 
-void
-elog_alloc (elog_main_t * em, u32 n_events)
+static void
+elog_alloc_internal (elog_main_t * em, u32 n_events, int free_ring)
 {
-  if (em->event_ring)
+  if (free_ring && em->event_ring)
     vec_free (em->event_ring);
 
   /* Ring size must be a power of 2. */
   em->event_ring_size = n_events = max_pow2 (n_events);
 
-  /* Leave an empty ievent at end so we can always speculatively write
-     and event there (possibly a long form event). */
-  vec_resize_aligned (em->event_ring, n_events, CLIB_CACHE_LINE_BYTES);
+  vec_validate_aligned (em->event_ring, n_events, CLIB_CACHE_LINE_BYTES);
+  _vec_len (em->event_ring) = n_events;
 }
 
-void
+__clib_export void
+elog_alloc (elog_main_t * em, u32 n_events)
+{
+  elog_alloc_internal (em, n_events, 1 /* free ring */ );
+}
+
+__clib_export void
+elog_resize (elog_main_t * em, u32 n_events)
+{
+  elog_alloc_internal (em, n_events, 0 /* do not free ring */ );
+}
+
+__clib_export void
 elog_init (elog_main_t * em, u32 n_events)
 {
   clib_memset (em, 0, sizeof (em[0]));
@@ -533,7 +553,7 @@ elog_event_range (elog_main_t * em, uword * lo)
     }
 }
 
-elog_event_t *
+__clib_export elog_event_t *
 elog_peek_events (elog_main_t * em)
 {
   elog_event_t *e, *f, *es = 0;
@@ -558,7 +578,7 @@ elog_peek_events (elog_main_t * em)
 }
 
 /* Add a formatted string to the string table. */
-u32
+__clib_export u32
 elog_string (elog_main_t * em, char *fmt, ...)
 {
   u32 offset;
@@ -602,11 +622,11 @@ elog_string (elog_main_t * em, char *fmt, ...)
   return offset;
 }
 
-elog_event_t *
+__clib_export elog_event_t *
 elog_get_events (elog_main_t * em)
 {
-  if (!em->events)
-    em->events = elog_peek_events (em);
+  vec_free (em->events);
+  em->events = elog_peek_events (em);
   return em->events;
 }
 
@@ -675,8 +695,8 @@ elog_cmp (void *a1, void *a2)
 /*
  * merge two event logs. Complicated and cranky.
  */
-void
-elog_merge (elog_main_t * dst, u8 * dst_tag, elog_main_t * src, u8 * src_tag,
+__clib_export void
+elog_merge (elog_main_t *dst, u8 *dst_tag, elog_main_t *src, u8 *src_tag,
            f64 align_tweak)
 {
   elog_event_t *e;
@@ -1089,7 +1109,7 @@ unserialize_elog_time_stamp (serialize_main_t * m, va_list * va)
 
 static char *elog_serialize_magic = "elog v0";
 
-void
+__clib_export void
 serialize_elog_main (serialize_main_t * m, va_list * va)
 {
   elog_main_t *em = va_arg (*va, elog_main_t *);
@@ -1123,8 +1143,8 @@ serialize_elog_main (serialize_main_t * m, va_list * va)
   vec_foreach (e, em->events) serialize (m, serialize_elog_event, em, e);
 }
 
-void
-unserialize_elog_main (serialize_main_t * m, va_list * va)
+__clib_export void
+unserialize_elog_main (serialize_main_t *m, va_list *va)
 {
   elog_main_t *em = va_arg (*va, elog_main_t *);
   uword i;
@@ -1175,7 +1195,7 @@ elog_write_file_not_inline (elog_main_t * em, char *clib_file, int flush_ring)
   return error;
 }
 
-clib_error_t *
+__clib_export clib_error_t *
 elog_read_file_not_inline (elog_main_t * em, char *clib_file)
 {
   serialize_main_t m;