< prev index next >
src/share/vm/logging/logTagSet.cpp
Print this page
rev 11119 : [mq]: 8146948
@@ -25,11 +25,13 @@
#include "logging/logDecorations.hpp"
#include "logging/logLevel.hpp"
#include "logging/logOutput.hpp"
#include "logging/logTag.hpp"
#include "logging/logTagSet.hpp"
+#include "logging/logTagSetDescriptions.inline.hpp"
#include "memory/allocation.inline.hpp"
+#include "utilities/ostream.hpp"
LogTagSet* LogTagSet::_list = NULL;
size_t LogTagSet::_ntagsets = 0;
// This constructor is called only during static initialization.
@@ -117,5 +119,46 @@
} else {
log(level, buf);
}
va_end(saved_args);
}
+
+static const size_t TagSetBufferSize = 128;
+
+void LogTagSet::describe_tagsets(outputStream* out) {
+ out->print_cr("Described tag combinations:");
+ for (const LogTagSetDescription* d = tagset_descriptions; d->tagset != NULL; d++) {
+ char buf[TagSetBufferSize];
+ d->tagset->label(buf, sizeof(buf), "+");
+ out->print_cr(" %s: %s", buf, d->descr);
+ }
+}
+
+static int qsort_strcmp(const void* a, const void* b) {
+ return strcmp((*(const char**)a), (*(const char**)b));
+}
+
+void LogTagSet::list_all_tagsets(outputStream* out) {
+ char** tagset_labels = NEW_C_HEAP_ARRAY(char*, _ntagsets, mtLogging);
+
+ // Generate the list of tagset labels
+ size_t idx = 0;
+ for (LogTagSet* ts = first(); ts != NULL; ts = ts->next()) {
+ char buf[TagSetBufferSize];
+ ts->label(buf, sizeof(buf), "+");
+ tagset_labels[idx++] = os::strdup_check_oom(buf, mtLogging);
+ }
+ assert(idx == _ntagsets, "_ntagsets and list of tagsets not in sync");
+
+ // Sort them lexicographically
+ qsort(tagset_labels, _ntagsets, sizeof(*tagset_labels), qsort_strcmp);
+
+ // Print and then free the labels
+ out->print("All available tag sets: ");
+ for (idx = 0; idx < _ntagsets; idx++) {
+ out->print("%s%s", (idx == 0 ? "" : ", "), tagset_labels[idx]);
+ os::free(tagset_labels[idx]);
+ }
+ out->cr();
+ FREE_C_HEAP_ARRAY(char*, tagset_labels);
+}
+
< prev index next >