src/hotspot/share/logging/logSelection.cpp
author mlarsson
Mon, 26 Feb 2018 09:34:20 +0100
changeset 49163 580bb0b85f63
parent 49016 ea85eed8b012
child 49180 9637557def32
permissions -rw-r--r--
8198554: Add fuzzy matching for log levels and tags when parsing -Xlog Reviewed-by: hseigel, coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49016
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
     1
/*
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
     4
 *
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
     7
 * published by the Free Software Foundation.
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
     8
 *
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    13
 * accompanied this code).
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    14
 *
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    18
 *
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    21
 * questions.
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    22
 *
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    23
 */
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    24
#include "precompiled.hpp"
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    25
#include "utilities/ostream.hpp"
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    26
#include "logging/logSelection.hpp"
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    27
#include "logging/logTagSet.hpp"
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    28
#include "runtime/os.inline.hpp"
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    29
#include "utilities/globalDefinitions.hpp"
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    30
#include "utilities/ostream.hpp"
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    31
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    32
const LogSelection LogSelection::Invalid;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    33
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    34
LogSelection::LogSelection() : _ntags(0), _wildcard(false), _level(LogLevel::Invalid), _tag_sets_selected(0) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    35
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    36
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    37
LogSelection::LogSelection(const LogTagType tags[LogTag::MaxTags], bool wildcard, LogLevelType level)
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    38
    : _ntags(0), _wildcard(wildcard), _level(level), _tag_sets_selected(0) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    39
  while (_ntags < LogTag::MaxTags && tags[_ntags] != LogTag::__NO_TAG) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    40
    _tags[_ntags] = tags[_ntags];
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    41
    _ntags++;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    42
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    43
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    44
  for (LogTagSet* ts = LogTagSet::first(); ts != NULL; ts = ts->next()) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    45
    if (selects(*ts)) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    46
      _tag_sets_selected++;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    47
    }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    48
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    49
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    50
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    51
bool LogSelection::operator==(const LogSelection& ref) const {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    52
  if (_ntags != ref._ntags ||
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    53
      _wildcard != ref._wildcard ||
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    54
      _level != ref._level ||
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    55
      _tag_sets_selected != ref._tag_sets_selected) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    56
    return false;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    57
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    58
  for (size_t i = 0; i < _ntags; i++) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    59
    if (_tags[i] != ref._tags[i]) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    60
      return false;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    61
    }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    62
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    63
  return true;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    64
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    65
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    66
bool LogSelection::operator!=(const LogSelection& ref) const {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    67
  return !operator==(ref);
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    68
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    69
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    70
static LogSelection parse_internal(char *str, outputStream* errstream) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    71
  // Parse the level, if specified
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    72
  LogLevelType level = LogLevel::Unspecified;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    73
  char* equals = strchr(str, '=');
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    74
  if (equals != NULL) {
49163
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
    75
    const char* levelstr = equals + 1;
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
    76
    level = LogLevel::from_string(levelstr);
49016
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    77
    if (level == LogLevel::Invalid) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    78
      if (errstream != NULL) {
49163
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
    79
        errstream->print("Invalid level '%s' in log selection.", levelstr);
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
    80
        LogLevelType match = LogLevel::fuzzy_match(levelstr);
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
    81
        if (match != LogLevel::Invalid) {
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
    82
          errstream->print(" Did you mean '%s'?", LogLevel::name(match));
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
    83
        }
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
    84
        errstream->cr();
49016
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    85
      }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    86
      return LogSelection::Invalid;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    87
    }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    88
    *equals = '\0';
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    89
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    90
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    91
  size_t ntags = 0;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    92
  LogTagType tags[LogTag::MaxTags] = { LogTag::__NO_TAG };
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    93
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    94
  // Parse special tags such as 'all'
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    95
  if (strcmp(str, "all") == 0) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    96
    return LogSelection(tags, true, level);
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    97
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    98
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
    99
  // Check for '*' suffix
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   100
  bool wildcard = false;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   101
  char* asterisk_pos = strchr(str, '*');
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   102
  if (asterisk_pos != NULL && asterisk_pos[1] == '\0') {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   103
    wildcard = true;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   104
    *asterisk_pos = '\0';
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   105
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   106
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   107
  // Parse the tag expression (t1+t2+...+tn)
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   108
  char* plus_pos;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   109
  char* cur_tag = str;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   110
  do {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   111
    plus_pos = strchr(cur_tag, '+');
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   112
    if (plus_pos != NULL) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   113
      *plus_pos = '\0';
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   114
    }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   115
    LogTagType tag = LogTag::from_string(cur_tag);
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   116
    if (tag == LogTag::__NO_TAG) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   117
      if (errstream != NULL) {
49163
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
   118
        errstream->print("Invalid tag '%s' in log selection.", cur_tag);
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
   119
        LogTagType match =  LogTag::fuzzy_match(cur_tag);
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
   120
        if (match != LogTag::__NO_TAG) {
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
   121
          errstream->print(" Did you mean '%s'?", LogTag::name(match));
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
   122
        }
580bb0b85f63 8198554: Add fuzzy matching for log levels and tags when parsing -Xlog
mlarsson
parents: 49016
diff changeset
   123
        errstream->cr();
49016
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   124
      }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   125
      return LogSelection::Invalid;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   126
    }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   127
    if (ntags == LogTag::MaxTags) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   128
      if (errstream != NULL) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   129
        errstream->print_cr("Too many tags in log selection '%s' (can only have up to " SIZE_FORMAT " tags).",
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   130
                               str, LogTag::MaxTags);
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   131
      }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   132
      return LogSelection::Invalid;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   133
    }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   134
    tags[ntags++] = tag;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   135
    cur_tag = plus_pos + 1;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   136
  } while (plus_pos != NULL);
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   137
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   138
  for (size_t i = 0; i < ntags; i++) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   139
    for (size_t j = 0; j < ntags; j++) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   140
      if (i != j && tags[i] == tags[j]) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   141
        if (errstream != NULL) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   142
          errstream->print_cr("Log selection contains duplicates of tag %s.", LogTag::name(tags[i]));
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   143
        }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   144
        return LogSelection::Invalid;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   145
      }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   146
    }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   147
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   148
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   149
  return LogSelection(tags, wildcard, level);
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   150
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   151
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   152
LogSelection LogSelection::parse(const char* str, outputStream* error_stream) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   153
  char* copy = os::strdup_check_oom(str, mtLogging);
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   154
  LogSelection s = parse_internal(copy, error_stream);
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   155
  os::free(copy);
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   156
  return s;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   157
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   158
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   159
bool LogSelection::selects(const LogTagSet& ts) const {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   160
  if (!_wildcard && _ntags != ts.ntags()) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   161
    return false;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   162
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   163
  for (size_t i = 0; i < _ntags; i++) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   164
    if (!ts.contains(_tags[i])) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   165
      return false;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   166
    }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   167
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   168
  return true;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   169
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   170
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   171
size_t LogSelection::ntags() const {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   172
  return _ntags;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   173
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   174
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   175
LogLevelType LogSelection::level() const {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   176
  return _level;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   177
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   178
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   179
size_t LogSelection::tag_sets_selected() const {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   180
  return _tag_sets_selected;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   181
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   182
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   183
int LogSelection::describe_tags(char* buf, size_t bufsize) const {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   184
  int tot_written = 0;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   185
  for (size_t i = 0; i < _ntags; i++) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   186
    int written = jio_snprintf(buf + tot_written, bufsize - tot_written,
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   187
                               "%s%s", (i == 0 ? "" : "+"), LogTag::name(_tags[i]));
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   188
    if (written == -1) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   189
      return written;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   190
    }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   191
    tot_written += written;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   192
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   193
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   194
  if (_wildcard) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   195
    int written = jio_snprintf(buf + tot_written, bufsize - tot_written, "*");
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   196
    if (written == -1) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   197
      return written;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   198
    }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   199
    tot_written += written;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   200
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   201
  return tot_written;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   202
}
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   203
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   204
int LogSelection::describe(char* buf, size_t bufsize) const {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   205
  int tot_written = describe_tags(buf, bufsize);
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   206
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   207
  int written = jio_snprintf(buf + tot_written, bufsize - tot_written, "=%s", LogLevel::name(_level));
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   208
  if (written == -1) {
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   209
    return -1;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   210
  }
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   211
  tot_written += written;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   212
  return tot_written;
ea85eed8b012 8196783: Refactor LogTagLevelExpression into separate classes
mlarsson
parents:
diff changeset
   213
}