1caf339d004fad667748b68912c254df4e75cdc5aYao Chen/* 2caf339d004fad667748b68912c254df4e75cdc5aYao Chen * Copyright (C) 2017 The Android Open Source Project 3caf339d004fad667748b68912c254df4e75cdc5aYao Chen * 4caf339d004fad667748b68912c254df4e75cdc5aYao Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5caf339d004fad667748b68912c254df4e75cdc5aYao Chen * you may not use this file except in compliance with the License. 6caf339d004fad667748b68912c254df4e75cdc5aYao Chen * You may obtain a copy of the License at 7caf339d004fad667748b68912c254df4e75cdc5aYao Chen * 8caf339d004fad667748b68912c254df4e75cdc5aYao Chen * http://www.apache.org/licenses/LICENSE-2.0 9caf339d004fad667748b68912c254df4e75cdc5aYao Chen * 10caf339d004fad667748b68912c254df4e75cdc5aYao Chen * Unless required by applicable law or agreed to in writing, software 11caf339d004fad667748b68912c254df4e75cdc5aYao Chen * distributed under the License is distributed on an "AS IS" BASIS, 12caf339d004fad667748b68912c254df4e75cdc5aYao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13caf339d004fad667748b68912c254df4e75cdc5aYao Chen * See the License for the specific language governing permissions and 14caf339d004fad667748b68912c254df4e75cdc5aYao Chen * limitations under the License. 15caf339d004fad667748b68912c254df4e75cdc5aYao Chen */ 16caf339d004fad667748b68912c254df4e75cdc5aYao Chen 179fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include "Log.h" 189fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 19caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "condition_util.h" 20caf339d004fad667748b68912c254df4e75cdc5aYao Chen 21caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include <log/event_tag_map.h> 22caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include <log/log_event_list.h> 23caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include <log/logprint.h> 24caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include <utils/Errors.h> 25caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include <unordered_map> 26729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen#include "../matchers/matcher_util.h" 27caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "ConditionTracker.h" 28caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h" 29caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "stats_util.h" 30caf339d004fad667748b68912c254df4e75cdc5aYao Chen 319fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace android { 329fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace os { 339fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace statsd { 349fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 35caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::set; 36caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::string; 37caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::unordered_map; 38caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::vector; 39caf339d004fad667748b68912c254df4e75cdc5aYao Chen 40caf339d004fad667748b68912c254df4e75cdc5aYao Chen 41caf339d004fad667748b68912c254df4e75cdc5aYao ChenConditionState evaluateCombinationCondition(const std::vector<int>& children, 42caf339d004fad667748b68912c254df4e75cdc5aYao Chen const LogicalOperation& operation, 43caf339d004fad667748b68912c254df4e75cdc5aYao Chen const std::vector<ConditionState>& conditionCache) { 44caf339d004fad667748b68912c254df4e75cdc5aYao Chen ConditionState newCondition; 45caf339d004fad667748b68912c254df4e75cdc5aYao Chen 46caf339d004fad667748b68912c254df4e75cdc5aYao Chen bool hasUnknown = false; 47caf339d004fad667748b68912c254df4e75cdc5aYao Chen bool hasFalse = false; 48caf339d004fad667748b68912c254df4e75cdc5aYao Chen bool hasTrue = false; 49caf339d004fad667748b68912c254df4e75cdc5aYao Chen 50caf339d004fad667748b68912c254df4e75cdc5aYao Chen for (auto childIndex : children) { 51caf339d004fad667748b68912c254df4e75cdc5aYao Chen ConditionState childState = conditionCache[childIndex]; 52caf339d004fad667748b68912c254df4e75cdc5aYao Chen if (childState == ConditionState::kUnknown) { 53caf339d004fad667748b68912c254df4e75cdc5aYao Chen hasUnknown = true; 54caf339d004fad667748b68912c254df4e75cdc5aYao Chen break; 55caf339d004fad667748b68912c254df4e75cdc5aYao Chen } 56caf339d004fad667748b68912c254df4e75cdc5aYao Chen if (childState == ConditionState::kFalse) { 57caf339d004fad667748b68912c254df4e75cdc5aYao Chen hasFalse = true; 58caf339d004fad667748b68912c254df4e75cdc5aYao Chen } 59caf339d004fad667748b68912c254df4e75cdc5aYao Chen if (childState == ConditionState::kTrue) { 60caf339d004fad667748b68912c254df4e75cdc5aYao Chen hasTrue = true; 61caf339d004fad667748b68912c254df4e75cdc5aYao Chen } 62caf339d004fad667748b68912c254df4e75cdc5aYao Chen } 63caf339d004fad667748b68912c254df4e75cdc5aYao Chen 64caf339d004fad667748b68912c254df4e75cdc5aYao Chen // If any child condition is in unknown state, the condition is unknown too. 65caf339d004fad667748b68912c254df4e75cdc5aYao Chen if (hasUnknown) { 66caf339d004fad667748b68912c254df4e75cdc5aYao Chen return ConditionState::kUnknown; 67caf339d004fad667748b68912c254df4e75cdc5aYao Chen } 68caf339d004fad667748b68912c254df4e75cdc5aYao Chen 69caf339d004fad667748b68912c254df4e75cdc5aYao Chen switch (operation) { 70caf339d004fad667748b68912c254df4e75cdc5aYao Chen case LogicalOperation::AND: { 71caf339d004fad667748b68912c254df4e75cdc5aYao Chen newCondition = hasFalse ? ConditionState::kFalse : ConditionState::kTrue; 72caf339d004fad667748b68912c254df4e75cdc5aYao Chen break; 73caf339d004fad667748b68912c254df4e75cdc5aYao Chen } 74caf339d004fad667748b68912c254df4e75cdc5aYao Chen case LogicalOperation::OR: { 75caf339d004fad667748b68912c254df4e75cdc5aYao Chen newCondition = hasTrue ? ConditionState::kTrue : ConditionState::kFalse; 76caf339d004fad667748b68912c254df4e75cdc5aYao Chen break; 77caf339d004fad667748b68912c254df4e75cdc5aYao Chen } 78caf339d004fad667748b68912c254df4e75cdc5aYao Chen case LogicalOperation::NOT: 79caf339d004fad667748b68912c254df4e75cdc5aYao Chen newCondition = (conditionCache[children[0]] == ConditionState::kFalse) 80caf339d004fad667748b68912c254df4e75cdc5aYao Chen ? ConditionState::kTrue 81caf339d004fad667748b68912c254df4e75cdc5aYao Chen : ConditionState::kFalse; 82caf339d004fad667748b68912c254df4e75cdc5aYao Chen break; 83caf339d004fad667748b68912c254df4e75cdc5aYao Chen case LogicalOperation::NAND: 84caf339d004fad667748b68912c254df4e75cdc5aYao Chen newCondition = hasFalse ? ConditionState::kTrue : ConditionState::kFalse; 85caf339d004fad667748b68912c254df4e75cdc5aYao Chen break; 86caf339d004fad667748b68912c254df4e75cdc5aYao Chen case LogicalOperation::NOR: 87caf339d004fad667748b68912c254df4e75cdc5aYao Chen newCondition = hasTrue ? ConditionState::kFalse : ConditionState::kTrue; 88caf339d004fad667748b68912c254df4e75cdc5aYao Chen break; 89cfed20bce8a66bde6ad0d74a44fc0a2764b2886dStefan Lafon case LogicalOperation::LOGICAL_OPERATION_UNSPECIFIED: 90cfed20bce8a66bde6ad0d74a44fc0a2764b2886dStefan Lafon newCondition = ConditionState::kFalse; 91cfed20bce8a66bde6ad0d74a44fc0a2764b2886dStefan Lafon break; 92caf339d004fad667748b68912c254df4e75cdc5aYao Chen } 93caf339d004fad667748b68912c254df4e75cdc5aYao Chen return newCondition; 94caf339d004fad667748b68912c254df4e75cdc5aYao Chen} 95caf339d004fad667748b68912c254df4e75cdc5aYao Chen 962087716f2bdca90c7c3034d556ac12911bd8018eYangster-macConditionState operator|(ConditionState l, ConditionState r) { 972087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac return l >= r ? l : r; 982087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac} 99caf339d004fad667748b68912c254df4e75cdc5aYao Chen} // namespace statsd 100caf339d004fad667748b68912c254df4e75cdc5aYao Chen} // namespace os 101caf339d004fad667748b68912c254df4e75cdc5aYao Chen} // namespace android 102