49 while (__sync_lock_test_and_set (em->
lock, 1))
124 for (i = 0; i < l; i++)
130 if (t->
format[i + 1] ==
'%')
219 digits[0] = digits[1] = 0;
220 while (p[i] >=
'0' && p[i] <=
'9')
224 digits[
i] = p[
i] -
'0';
228 if (i >= 1 && i <= 2)
233 *number = 10 * digits[0] + digits[1];
251 if (f[0] ==
'%' && f[1] !=
'%')
265 f += f[0] ==
'+' || f[0] ==
'-' || f[0] ==
'=';
268 while ((f[0] >=
'0' && f[0] <=
'9') || f[0] ==
'.')
272 f += f[0] ==
'w' || f[0] ==
'l' || f[0] ==
'L';
277 ASSERT (*result_len > f - percent);
278 l =
clib_min (f - percent, *result_len - 1);
283 *result_len = f - fmt;
303 uword n_bytes = 0, n_digits, f_bytes = 0;
305 f_bytes =
sizeof (arg_format);
309 if (a == 0 || a[0] == 0)
331 else if (n_bytes == 2)
333 else if (n_bytes == 4)
335 else if (n_bytes == 8)
343 s =
format (s, arg_format, e);
345 else if (a[0] ==
'T')
349 s =
format (s, arg_format, e);
351 else if (n_bytes == 8)
352 s =
format (s, arg_format, l);
354 s =
format (s, arg_format, i);
363 else if (n_bytes == 8)
367 s =
format (s, arg_format, x);
372 s =
format (s, arg_format, d);
374 n_bytes = strlen (d) + 1;
382 ASSERT (n_digits > 0 && n_digits <= 2);
402 u64 cpu_time_now, os_time_now_nsec;
406 #include <sys/syscall.h> 408 syscall (SYS_clock_gettime, CLOCK_REALTIME, &ts);
410 os_time_now_nsec = 1e9 * ts.tv_sec + ts.tv_nsec;
414 os_time_now_nsec = 0;
417 et->
cpu = cpu_time_now;
418 et->
os_nsec = os_time_now_nsec;
459 memset (em, 0,
sizeof (em[0]));
506 for (i = 0; i < n; i++)
564 uword n_bytes = 0, n_digits;
591 ASSERT (n_digits > 0 && n_digits <= 2);
611 u32 string_table_offset_for_src_events;
612 u32 track_offset_for_src_tracks;
616 memset (&newt, 0,
sizeof (newt));
635 new_name = (
char *)
format (0,
"%s:%s%c", dst_tag, t->
name, 0);
665 string_table_offset_for_src_events);
668 e->
track += track_offset_for_src_tracks;
673 f64 dt_event, dt_os_nsec, dt_clock_nsec;
686 dt_event = dt_os_nsec;
696 &&
fabs (dt_os_nsec - dt_clock_nsec) < 100)
697 dt_event = dt_clock_nsec;
711 for (e = dst->
events + 0; e < dst->events + l; e++)
758 uword n_digits, n_bytes = 0;
769 else if (n_bytes == 2)
771 else if (n_bytes == 4)
773 else if (n_bytes == 8)
782 n_bytes = strlen ((
char *) d) + 1;
788 else if (n_bytes == 8)
835 uword n_digits, n_bytes = 0;
850 else if (n_bytes == 2)
855 else if (n_bytes == 4)
860 else if (n_bytes == 8)
875 n_bytes = strlen (t) + 1;
888 else if (n_bytes == 8)
912 int n = va_arg (*va,
int);
914 for (i = 0; i < n; i++)
921 sizeof (t[i].n_enum_strings));
931 int n = va_arg (*va,
int);
933 for (i = 0; i < n; i++)
940 sizeof (t[i].n_enum_strings));
941 vec_resize (t[i].enum_strings_vector, t[i].n_enum_strings);
951 int n = va_arg (*va,
int);
953 for (i = 0; i < n; i++)
963 int n = va_arg (*va,
int);
965 for (i = 0; i < n; i++)
char ** enum_strings_vector
elog_time_stamp_t serialize_time
sll srl srl sll sra u16x4 i
void unserialize_check_magic(serialize_main_t *m, void *magic, u32 magic_bytes)
elog_event_t * elog_get_events(elog_main_t *em)
static void maybe_fix_string_table_offset(elog_event_t *e, elog_event_type_t *t, u32 offset)
static i64 elog_time_stamp_diff_os_nsec(elog_time_stamp_t *t1, elog_time_stamp_t *t2)
void elog_time_now(elog_time_stamp_t *et)
#define vec_serialize(m, v, f)
bad routing header type(not 4)") sr_error (NO_MORE_SEGMENTS
word elog_track_register(elog_main_t *em, elog_track_t *t)
elog_time_stamp_t init_time
#define vec_unserialize(m, v, f)
serialize_function_t unserialize_64
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static u64 clib_cpu_time_now(void)
u8 * format_elog_track(u8 *s, va_list *va)
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
#define hash_set_mem(h, key, value)
static void elog_lock(elog_main_t *em)
void serialize_elog_main(serialize_main_t *m, va_list *va)
u8 * format_elog_event(u8 *s, va_list *va)
static uword find_or_create_type(elog_main_t *em, elog_event_type_t *t)
serialize_function_t serialize_64
static void serialize_elog_time_stamp(serialize_main_t *m, va_list *va)
static void unserialize_elog_event_type(serialize_main_t *m, va_list *va)
static void new_event_type(elog_main_t *em, uword i)
#define vec_add(V, E, N)
Add N elements to end of vector V (no header, unspecified alignment)
void unserialize_elog_main(serialize_main_t *m, va_list *va)
serialize_function_t unserialize_f32
static void unserialize_elog_event(serialize_main_t *m, va_list *va)
void elog_init(elog_main_t *em, u32 n_events)
word elog_event_type_register(elog_main_t *em, elog_event_type_t *t)
static i64 elog_time_stamp_diff_cpu(elog_time_stamp_t *t1, elog_time_stamp_t *t2)
static void unserialize_elog_time_stamp(serialize_main_t *m, va_list *va)
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
static uword elog_event_range(elog_main_t *em, uword *lo)
#define vec_resize(V, N)
Resize a vector (no header, unspecified alignment) Add N elements to end of given vector V...
#define vec_end(v)
End (last data address) of vector.
uword * event_type_by_format
static int elog_cmp(void *a1, void *a2)
elog_event_type_t * event_types
static uword parse_2digit_decimal(char *p, uword *number)
static char * elog_serialize_magic
elog_event_t * event_ring
static void serialize_elog_event_type(serialize_main_t *m, va_list *va)
static void unserialize_elog_track(serialize_main_t *m, va_list *va)
void clib_time_init(clib_time_t *c)
void elog_alloc(elog_main_t *em, u32 n_events)
serialize_function_t unserialize_f64
void unserialize_cstring(serialize_main_t *m, char **s)
static void elog_unlock(elog_main_t *em)
clib_error_t * serialize(serialize_main_t *m,...)
#define vec_free(V)
Free vector's memory (no header).
static f64 elog_nsec_per_clock(elog_main_t *em)
#define clib_memcpy(a, b, c)
static void serialize_elog_event(serialize_main_t *m, va_list *va)
static uword max_pow2(uword x)
static void unserialize_integer(serialize_main_t *m, void *x, u32 n_bytes)
static void serialize_integer(serialize_main_t *m, u64 x, u32 n_bytes)
u32 n_total_events_disable_limit
static void serialize_elog_track(serialize_main_t *m, va_list *va)
serialize_function_t unserialize_vec_8
void serialize_magic(serialize_main_t *m, void *magic, u32 magic_bytes)
clib_error_t * unserialize(serialize_main_t *m,...)
#define vec_append(v1, v2)
Append v2 after v1.
void elog_merge(elog_main_t *dst, u8 *dst_tag, elog_main_t *src, u8 *src_tag)
serialize_function_t serialize_f32
void serialize_cstring(serialize_main_t *m, char *s)
#define vec_elt(v, i)
Get vector value at index i.
template key/value backing page structure
#define hash_create_vec(elts, key_bytes, value_bytes)
serialize_function_t serialize_vec_8
u32 elog_string(elog_main_t *em, char *fmt,...)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
void * elog_event_data(elog_main_t *em, elog_event_type_t *type, elog_track_t *track, u64 cpu_time)
#define clib_mem_unaligned(pointer, type)
#define hash_get_mem(h, key)
struct clib_bihash_value offset
template key/value backing page structure
static u8 * fixed_format(u8 *s, char *fmt, char *result, uword *result_len)
#define vec_foreach(var, vec)
Vector iterator.
elog_track_t default_track
#define CLIB_MEMORY_BARRIER()
#define CLIB_CACHE_LINE_BYTES
static void * elog_event_data_inline(elog_main_t *em, elog_event_type_t *type, elog_track_t *track, u64 cpu_time)
elog_event_t * elog_peek_events(elog_main_t *em)
serialize_function_t serialize_f64
#define vec_resize_aligned(V, N, A)
Resize a vector (no header, alignment specified).