X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fcoverage.c;h=5c99c18ade24b4f77630bb60618abf6ad4ad0d6f;hb=a0bc29a541fc7dc6e20137d5558e2094d614e6ab;hp=15a66c2fb1a2774e9688ca9de1424a065f3fa2ee;hpb=064af42167bf4fc9aaea2702d80ce08074b889c0;p=openvswitch diff --git a/lib/coverage.c b/lib/coverage.c index 15a66c2f..5c99c18a 100644 --- a/lib/coverage.c +++ b/lib/coverage.c @@ -1,17 +1,17 @@ /* - * Copyright (c) 2009 Nicira Networks. + * Copyright (c) 2009, 2010 Nicira Networks. * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ #include @@ -21,6 +21,7 @@ #include "coverage-counters.h" #include "dynamic-string.h" #include "hash.h" +#include "unixctl.h" #include "util.h" #define THIS_MODULE VLM_coverage @@ -28,6 +29,20 @@ static unsigned int epoch; +static void +coverage_unixctl_log(struct unixctl_conn *conn, const char *args OVS_UNUSED, + void *aux OVS_UNUSED) +{ + coverage_log(VLL_WARN, false); + unixctl_command_reply(conn, 200, NULL); +} + +void +coverage_init(void) +{ + unixctl_command_register("coverage/log", coverage_unixctl_log, NULL); +} + /* Sorts coverage counters in descending order by count, within equal counts * alphabetically by name. */ static int @@ -94,7 +109,7 @@ coverage_hit(uint32_t hash) unsigned int word_mask = 1u << (bit_index % BITS_PER_WORD); if (hit[word_index] & word_mask) { - return true; + return true; } else { hit[word_index] |= word_mask; return false; @@ -107,9 +122,13 @@ coverage_log_counter(enum vlog_level level, const struct coverage_counter *c) VLOG(level, "%-24s %5u / %9llu", c->name, c->count, c->count + c->total); } -/* Logs the coverage counters at the given vlog 'level'. */ +/* Logs the coverage counters at the given vlog 'level'. If + * 'suppress_dups' is true, then duplicate events are not displayed. + * Care should be taken in the value used for 'level'. Depending on the + * configuration, syslog can write changes synchronously, which can + * cause the coverage messages to take several seconds to write. */ void -coverage_log(enum vlog_level level) +coverage_log(enum vlog_level level, bool suppress_dups) { size_t n_never_hit; uint32_t hash; @@ -120,10 +139,12 @@ coverage_log(enum vlog_level level) } hash = coverage_hash(); - if (coverage_hit(hash)) { - VLOG(level, "Skipping details of duplicate event coverage for " - "hash=%08"PRIx32" in epoch %u", hash, epoch); - return; + if (suppress_dups) { + if (coverage_hit(hash)) { + VLOG(level, "Skipping details of duplicate event coverage for " + "hash=%08"PRIx32" in epoch %u", hash, epoch); + return; + } } n_never_hit = 0;