X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Felog.c;h=6fa44cb82f9a6f8283095bfc60008e8dd105345c;hb=302b25a00ed913767798d58148ef4d36092ee490;hp=19d86bb70c018a29611817d3eb9bbe001fe81818;hpb=9c8ca8dd3197e40dfcb8bcecd95c10eeb56239ed;p=vpp.git diff --git a/src/vppinfra/elog.c b/src/vppinfra/elog.c index 19d86bb70c0..6fa44cb82f9 100644 --- a/src/vppinfra/elog.c +++ b/src/vppinfra/elog.c @@ -41,13 +41,14 @@ #include #include #include +#include static inline void elog_lock (elog_main_t * em) { if (PREDICT_FALSE (em->lock != 0)) while (clib_atomic_test_and_set (em->lock)) - ; + CLIB_PAUSE (); } static inline void @@ -55,13 +56,12 @@ elog_unlock (elog_main_t * em) { if (PREDICT_FALSE (em->lock != 0)) { - CLIB_MEMORY_BARRIER (); - *em->lock = 0; + clib_atomic_release (em->lock); } } /* 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 *); @@ -302,7 +302,7 @@ format_elog_event (u8 * s, va_list * va) void *d = (u8 *) e->data; char arg_format[64]; - t = vec_elt_at_index (em->event_types, e->type); + t = vec_elt_at_index (em->event_types, e->event_type); f = t->format; a = t->format_args; @@ -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 *); @@ -420,13 +420,22 @@ format_elog_track (u8 * s, va_list * args) { if (e->track != track_index) continue; - s = format (s, "%U%18.9f: %U\n", format_white_space, indent, e->time + dt, - format_elog_event, em, e); + s = format (s, "%U%18.9f: %U\n", format_white_space, indent, + e->time + dt, format_elog_event, em, e); } vec_free (es); 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,7 +484,7 @@ elog_nsec_per_clock (elog_main_t * em) &em->init_time)); } -void +__clib_export void elog_alloc (elog_main_t * em, u32 n_events) { if (em->event_ring) @@ -489,7 +498,7 @@ elog_alloc (elog_main_t * em, u32 n_events) vec_resize_aligned (em->event_ring, n_events, CLIB_CACHE_LINE_BYTES); } -void +__clib_export void elog_init (elog_main_t * em, u32 n_events) { clib_memset (em, 0, sizeof (em[0])); @@ -533,7 +542,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 +567,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; @@ -572,6 +581,12 @@ elog_string (elog_main_t * em, char *fmt, ...) em->string_table_tmp = va_format (em->string_table_tmp, fmt, &va); va_end (va); + /* String table entries MUST be NULL terminated */ + len = vec_len (em->string_table_tmp); + ASSERT (len > 0); + if (em->string_table_tmp[len - 1] != 0) + vec_add1 (em->string_table_tmp, 0); + /* See if we already have this string in the string table */ p = hash_get_mem (em->string_table_hash, em->string_table_tmp); @@ -582,11 +597,7 @@ elog_string (elog_main_t * em, char *fmt, ...) return (p[0]); } - /* We don't, so add it. String table entries MUST be NULL terminated */ - len = vec_len (em->string_table_tmp); - ASSERT (len > 0); - if (em->string_table_tmp[len - 1] != 0) - vec_add1 (em->string_table_tmp, 0); + /* We don't, so add it. */ offset = vec_len (em->string_table); vec_append (em->string_table, em->string_table_tmp); @@ -600,11 +611,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; } @@ -730,10 +741,11 @@ elog_merge (elog_main_t * dst, u8 * dst_tag, elog_main_t * src, u8 * src_tag, /* Across all (copied) src events... */ for (e = dst->events + l; e < vec_end (dst->events); e++) { - elog_event_type_t *t = vec_elt_at_index (src->event_types, e->type); + elog_event_type_t *t = + vec_elt_at_index (src->event_types, e->event_type); /* Remap type from src -> dst. */ - e->type = find_or_create_type (dst, t); + e->event_type = find_or_create_type (dst, t); /* Remap string table offsets for 'T' format args */ maybe_fix_string_table_offset (e, t, @@ -845,11 +857,11 @@ serialize_elog_event (serialize_main_t * m, va_list * va) { elog_main_t *em = va_arg (*va, elog_main_t *); elog_event_t *e = va_arg (*va, elog_event_t *); - elog_event_type_t *t = vec_elt_at_index (em->event_types, e->type); + elog_event_type_t *t = vec_elt_at_index (em->event_types, e->event_type); u8 *d = e->data; u8 *p = (u8 *) t->format_args; - serialize_integer (m, e->type, sizeof (e->type)); + serialize_integer (m, e->event_type, sizeof (e->event_type)); serialize_integer (m, e->track, sizeof (e->track)); serialize (m, serialize_f64, e->time); @@ -912,18 +924,18 @@ unserialize_elog_event (serialize_main_t * m, va_list * va) { u16 tmp[2]; - unserialize_integer (m, &tmp[0], sizeof (e->type)); + unserialize_integer (m, &tmp[0], sizeof (e->event_type)); unserialize_integer (m, &tmp[1], sizeof (e->track)); - e->type = tmp[0]; + e->event_type = tmp[0]; e->track = tmp[1]; /* Make sure it fits. */ - ASSERT (e->type == tmp[0]); + ASSERT (e->event_type == tmp[0]); ASSERT (e->track == tmp[1]); } - t = vec_elt_at_index (em->event_types, e->type); + t = vec_elt_at_index (em->event_types, e->event_type); unserialize (m, unserialize_f64, &e->time); @@ -1086,7 +1098,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 *); @@ -1156,6 +1168,39 @@ unserialize_elog_main (serialize_main_t * m, va_list * va) } } +#ifdef CLIB_UNIX +clib_error_t * +elog_write_file_not_inline (elog_main_t * em, char *clib_file, int flush_ring) +{ + serialize_main_t m; + clib_error_t *error; + + error = serialize_open_clib_file (&m, clib_file); + if (error) + return error; + error = serialize (&m, serialize_elog_main, em, flush_ring); + if (!error) + serialize_close (&m); + return error; +} + +__clib_export clib_error_t * +elog_read_file_not_inline (elog_main_t * em, char *clib_file) +{ + serialize_main_t m; + clib_error_t *error; + + error = unserialize_open_clib_file (&m, clib_file); + if (error) + return error; + error = unserialize (&m, unserialize_elog_main, em); + if (!error) + unserialize_close (&m); + return error; +} +#endif /* CLIB_UNIX */ + + /* * fd.io coding-style-patch-verification: ON *