static uword startup_config_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) { unix_main_t *um = &unix_main; u8 *buf = 0; uword l, n = 1; vlib_process_suspend (vm, 2.0); while (um->unix_config_complete == 0) vlib_process_suspend (vm, 0.1); if (um->startup_config_filename) { unformat_input_t sub_input; int fd; struct stat s; char *fn = (char *) um->startup_config_filename; fd = open (fn, O_RDONLY); if (fd < 0) { clib_warning ("failed to open `%s'", fn); return 0; } if (fstat (fd, &s) < 0) { clib_warning ("failed to stat `%s'", fn); bail: close (fd); return 0; } if (!(S_ISREG (s.st_mode) || S_ISLNK (s.st_mode))) { clib_warning ("not a regular file: `%s'", fn); goto bail; } while (n > 0) { l = vec_len (buf); vec_resize (buf, 4096); n = read (fd, buf + l, 4096); if (n > 0) { _vec_len (buf) = l + n; if (n < 4096) break; } else break; } if (um->log_fd && vec_len (buf)) { u8 *lv = 0; lv = format (lv, "%U: ***** Startup Config *****\n%v", format_timeval, 0 /* current bat-time */ , 0 /* current bat-format */ , buf); { int rv __attribute__ ((unused)) = write (um->log_fd, lv, vec_len (lv)); } vec_reset_length (lv); lv = format (lv, "%U: ***** End Startup Config *****\n", format_timeval, 0 /* current bat-time */ , 0 /* current bat-format */ ); { int rv __attribute__ ((unused)) = write (um->log_fd, lv, vec_len (lv)); } vec_free (lv); } if (vec_len (buf)) { unformat_init_vector (&sub_input, buf); vlib_cli_input (vm, &sub_input, 0, 0); /* frees buf for us */ unformat_free (&sub_input); } close (fd); } return 0; }
static void handle_timeout (vlib_main_t * vm, perfmon_main_t * pm, f64 now) { int i; int last_set, all; last_set = clib_bitmap_last_set (pm->thread_bitmap); all = (last_set == ~0); if (all || clib_bitmap_get (pm->thread_bitmap, 0)) disable_events (pm); /* And also on worker threads */ for (i = 1; i < vec_len (vlib_mains); i++) { if (vlib_mains[i] == 0) continue; if (all || clib_bitmap_get (pm->thread_bitmap, i)) vlib_mains[i]->worker_thread_main_loop_callback = (void *) worker_thread_stop_event; } /* Make sure workers have stopped collection */ if (i > 1) { f64 deadman = vlib_time_now (vm) + 1.0; for (i = 1; i < vec_len (vlib_mains); i++) { /* Has the worker actually stopped collecting data? */ while (vlib_mains[i]->worker_thread_main_loop_callback) { if (vlib_time_now (vm) > deadman) { clib_warning ("Thread %d deadman timeout!", i); break; } vlib_process_suspend (pm->vlib_main, 1e-3); } } } scrape_and_clear_counters (pm); pm->current_event += pm->n_active; if (pm->current_event >= vec_len (pm->single_events_to_collect)) { pm->current_event = 0; pm->state = PERFMON_STATE_OFF; return; } if (all || clib_bitmap_get (pm->thread_bitmap, 0)) enable_current_events (pm); /* And also on worker threads */ for (i = 1; i < vec_len (vlib_mains); i++) { if (vlib_mains[i] == 0) continue; if (all || clib_bitmap_get (pm->thread_bitmap, i)) vlib_mains[i]->worker_thread_main_loop_callback = (void *) worker_thread_start_event; } }