1 #include <assert.h> 2 3 #include <hei_main.hpp> 4 5 #include <algorithm> 6 #include <limits> 7 #include <string> 8 9 namespace analyzer 10 { 11 12 //------------------------------------------------------------------------------ 13 14 bool filterRootCause(const libhei::IsolationData& i_isoData, 15 libhei::Signature& o_rootCause) 16 { 17 // We'll need to make a copy of the list so that the original list is 18 // maintained for the log. 19 std::vector<libhei::Signature> list{i_isoData.getSignatureList()}; 20 21 // START WORKAROUND 22 // TODO: Filtering should be data driven. Until that support is available, 23 // use the following isolation rules. 24 25 // Special and host attentions are not supported by this user application. 26 auto itr = std::remove_if(list.begin(), list.end(), [&](const auto& t) { 27 return (libhei::ATTN_TYPE_SP_ATTN == t.getAttnType() || 28 libhei::ATTN_TYPE_HOST_ATTN == t.getAttnType()); 29 }); 30 list.resize(std::distance(list.begin(), itr)); 31 32 // TODO: This is a rudimentary filter that first looks for any recoverable 33 // attention, then any unit checkstop, and then any system checkstop. 34 // This is built on the premise that recoverable errors could be the 35 // root cause of an system checkstop attentions. Fortunately, we 36 // just need to sort the list by the greater attention type value. 37 std::sort(list.begin(), list.end(), [&](const auto& a, const auto& b) { 38 return a.getAttnType() > b.getAttnType(); 39 }); 40 if (!list.empty()) 41 { 42 // The entry at the front of the list will be the root cause. 43 o_rootCause = list.front(); 44 return true; 45 } 46 47 // END WORKAROUND 48 49 return false; // default, no active attentions found. 50 } 51 52 //------------------------------------------------------------------------------ 53 54 } // namespace analyzer 55