vlib: add elog events for vlib log entries
[vpp.git] / src / vppinfra / elog.h
index 05085b2..d0825bd 100644 (file)
@@ -53,6 +53,7 @@
 #include <vppinfra/error.h>    /* for ASSERT */
 #include <vppinfra/serialize.h>
 #include <vppinfra/time.h>     /* for clib_cpu_time_now */
+#include <vppinfra/hash.h>
 #include <vppinfra/mhash.h>
 
 typedef struct
@@ -67,7 +68,7 @@ typedef struct
   };
 
   /** Event type index. */
-  u16 type;
+  u16 event_type;
 
   /** Track for this event.  Tracks allow events to be sorted and
      displayed by track.  Think of 2 dimensional display with time and
@@ -138,7 +139,7 @@ typedef struct
   u32 n_total_events_disable_limit;
 
   /** Dummy event to use when logger is disabled. */
-  elog_event_t dummy_event;
+  elog_event_t placeholder_event;
 
   /** Power of 2 number of elements in ring. */
   uword event_ring_size;
@@ -155,6 +156,8 @@ typedef struct
 
   /** Events may refer to strings in string table. */
   char *string_table;
+  uword *string_table_hash;
+  u8 *string_table_tmp;
 
   /** Vector of tracks. */
   elog_track_t *tracks;
@@ -295,9 +298,9 @@ elog_event_data_inline (elog_main_t * em,
   uword ei;
   word type_index, track_index;
 
-  /* Return the user dummy memory to scribble data into. */
+  /* Return the user placeholder memory to scribble data into. */
   if (PREDICT_FALSE (!elog_is_enabled (em)))
-    return em->dummy_event.data;
+    return em->placeholder_event.data;
 
   type_index = (word) type->type_index_plus_one - 1;
   track_index = (word) track->track_index_plus_one - 1;
@@ -313,7 +316,7 @@ elog_event_data_inline (elog_main_t * em,
   ASSERT (is_pow2 (vec_len (em->event_ring)));
 
   if (em->lock)
-    ei = clib_smp_atomic_add (&em->n_total_events, 1);
+    ei = clib_atomic_fetch_add (&em->n_total_events, 1);
   else
     ei = em->n_total_events++;
 
@@ -321,7 +324,7 @@ elog_event_data_inline (elog_main_t * em,
   e = vec_elt_at_index (em->event_ring, ei);
 
   e->time_cycles = cpu_time;
-  e->type = type_index;
+  e->event_type = type_index;
   e->track = track_index;
 
   /* Return user data for caller to fill in. */
@@ -349,9 +352,9 @@ elog_event_data_not_inline (elog_main_t * em,
                            elog_event_type_t * type,
                            elog_track_t * track, u64 cpu_time)
 {
-  /* Return the user dummy memory to scribble data into. */
+  /* Return the user placeholder memory to scribble data into. */
   if (PREDICT_FALSE (!elog_is_enabled (em)))
-    return em->dummy_event.data;
+    return em->placeholder_event.data;
   return elog_event_data (em, type, track, cpu_time);
 }
 
@@ -515,22 +518,24 @@ void elog_merge (elog_main_t * dst, u8 * dst_tag,
 
 /* 2 arguments elog_main_t and elog_event_t to format event or track name. */
 u8 *format_elog_event (u8 * s, va_list * va);
-u8 *format_elog_track (u8 * s, va_list * va);
+u8 *format_elog_track_name (u8 * s, va_list * va);
+u8 *format_elog_track (u8 * s, va_list * args);
 
 void serialize_elog_main (serialize_main_t * m, va_list * va);
 void unserialize_elog_main (serialize_main_t * m, va_list * va);
 
 void elog_init (elog_main_t * em, u32 n_events);
 void elog_alloc (elog_main_t * em, u32 n_events);
+void elog_resize (elog_main_t * em, u32 n_events);
 
 #ifdef CLIB_UNIX
 always_inline clib_error_t *
-elog_write_file (elog_main_t * em, char *unix_file, int flush_ring)
+elog_write_file (elog_main_t * em, char *clib_file, int flush_ring)
 {
   serialize_main_t m;
   clib_error_t *error;
 
-  error = serialize_open_unix_file (&m, unix_file);
+  error = serialize_open_clib_file (&m, clib_file);
   if (error)
     return error;
   error = serialize (&m, serialize_elog_main, em, flush_ring);
@@ -539,13 +544,16 @@ elog_write_file (elog_main_t * em, char *unix_file, int flush_ring)
   return error;
 }
 
+clib_error_t *elog_write_file_not_inline (elog_main_t * em, char *clib_file,
+                                         int flush_ring);
+
 always_inline clib_error_t *
-elog_read_file (elog_main_t * em, char *unix_file)
+elog_read_file (elog_main_t * em, char *clib_file)
 {
   serialize_main_t m;
   clib_error_t *error;
 
-  error = unserialize_open_unix_file (&m, unix_file);
+  error = unserialize_open_clib_file (&m, clib_file);
   if (error)
     return error;
   error = unserialize (&m, unserialize_elog_main, em);
@@ -554,6 +562,9 @@ elog_read_file (elog_main_t * em, char *unix_file)
   return error;
 }
 
+clib_error_t *elog_read_file_not_inline (elog_main_t * em, char *clib_file);
+char *format_one_elog_event (void *em_arg, void *ep_arg);
+
 #endif /* CLIB_UNIX */
 
 #endif /* included_clib_elog_h */