/**
* @file
- * Circular joournal diagnostic mechanism.
+ * Circular journal diagnostic mechanism.
*
* The @c cj thread-safe circular log buffer scheme is occasionally useful
* when chasing bugs. Calls to it should not be checked in.
if (cjm->enable == 0)
return;
- new_tail = __sync_add_and_fetch (&cjm->tail, 1);
+ new_tail = clib_atomic_add_fetch (&cjm->tail, 1);
r = (cj_record_t *) & (cjm->records[new_tail & (cjm->num_records - 1)]);
r->time = vlib_time_now (cjm->vlib_main);
- r->cpu = os_get_cpu_number ();
+ r->thread_index = vlib_get_thread_index ();
r->type = type;
r->data[0] = pointer_to_uword (data0);
r->data[1] = pointer_to_uword (data1);
cjm->num_records = max_pow2 (cjm->num_records);
vec_validate (cjm->records, cjm->num_records - 1);
- memset (cjm->records, 0xff, cjm->num_records * sizeof (cj_record_t));
+ clib_memset (cjm->records, 0xff, cjm->num_records * sizeof (cj_record_t));
cjm->tail = ~0;
cjm->enable = enable;
/*?
* Configure the circular journal diagnostic mechanism. This is only useful
- * if you, the deveoper, have written code to make use of the circular
+ * if you, the developer, have written code to make use of the circular
* journal.
*
* @cfgcmd{records, <number>}
cj_dump_one_record (cj_record_t * r)
{
fprintf (stderr, "[%d]: %10.6f T%02d %llx %llx\n",
- r->cpu, r->time, r->type, (long long unsigned int) r->data[0],
+ r->thread_index, r->time, r->type,
+ (long long unsigned int) r->data[0],
(long long unsigned int) r->data[1]);
}
index = (cjm->tail + 1) & (cjm->num_records - 1);
r = &(cjm->records[index]);
- if (r->cpu != (u32) ~ 0)
+ if (r->thread_index != (u32) ~ 0)
{
/* Yes, dump from tail + 1 to the end */
for (i = index; i < cjm->num_records; i++)
}
/* dump from the beginning through the final tail */
r = cjm->records;
- for (i = 0; i <= cjm->tail; i++)
+ for (i = 0; i < index; i++)
{
if (filter0_enable && (r->data[0] != filter0))
goto skip2;
{
int is_enable = -1;
int is_dump = -1;
+ unformat_input_t _line_input, *line_input = &_line_input;
+ clib_error_t *error = NULL;
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ /* Get a line of input. */
+ if (!unformat_user (input, unformat_line_input, line_input))
+ return clib_error_return (0, "expected enable | disable | dump");
+
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (input, "enable") || unformat (input, "on"))
+ if (unformat (line_input, "enable") || unformat (line_input, "on"))
is_enable = 1;
- else if (unformat (input, "disable") || unformat (input, "off"))
+ else if (unformat (line_input, "disable")
+ || unformat (line_input, "off"))
is_enable = 0;
- else if (unformat (input, "dump"))
+ else if (unformat (line_input, "dump"))
is_dump = 1;
else
- return clib_error_return (0, "unknown input `%U'",
- format_unformat_error, input);
+ {
+ error = clib_error_return (0, "unknown input `%U'",
+ format_unformat_error, line_input);
+ goto done;
+ }
}
if (is_enable >= 0)
if (is_dump > 0)
cj_dump ();
- return 0;
+done:
+ unformat_free (line_input);
+ return error;
}
/*?
* Enable, disable the collection of diagnostic data into a
* circular journal or dump the circular journal diagnostic data.
- * This is only useful if you, the deveoper, have written code to make
+ * This is only useful if you, the developer, have written code to make
* use of the circular journal.
*
* When dumping the data it is formatted and sent to @c stderr of the