123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * 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
- *
- * 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.
- */
- #ifndef FRAMEWORK_NATIVE_CMDS_LSHAL_TABLE_ENTRY_H_
- #define FRAMEWORK_NATIVE_CMDS_LSHAL_TABLE_ENTRY_H_
- #include <stdint.h>
- #include <string>
- #include <vector>
- #include <iostream>
- #include <procpartition/procpartition.h>
- #include <vintf/Arch.h>
- #include <vintf/Transport.h>
- #include "TextTable.h"
- namespace android {
- namespace lshal {
- using android::procpartition::Partition;
- using Pids = std::vector<int32_t>;
- enum class TableColumnType : unsigned int {
- INTERFACE_NAME,
- TRANSPORT,
- SERVER_PID,
- SERVER_CMD,
- SERVER_ADDR,
- CLIENT_PIDS,
- CLIENT_CMDS,
- ARCH,
- THREADS,
- RELEASED,
- HASH,
- VINTF,
- SERVICE_STATUS,
- };
- enum : unsigned int {
- VINTF_INFO_EMPTY = 0,
- DEVICE_MANIFEST = 1 << 0,
- DEVICE_MATRIX = 1 << 1,
- FRAMEWORK_MANIFEST = 1 << 2,
- FRAMEWORK_MATRIX = 1 << 3,
- };
- using VintfInfo = unsigned int;
- enum {
- NO_PID = -1,
- NO_PTR = 0
- };
- enum class ServiceStatus {
- UNKNOWN, // For passthrough
- ALIVE,
- NON_RESPONSIVE, // registered but not respond to calls
- DECLARED, // in VINTF manifest
- };
- std::string to_string(ServiceStatus s);
- struct TableEntry {
- std::string interfaceName{};
- vintf::Transport transport{vintf::Transport::EMPTY};
- int32_t serverPid{NO_PID};
- uint32_t threadUsage{0};
- uint32_t threadCount{0};
- std::string serverCmdline{};
- uint64_t serverObjectAddress{NO_PTR};
- Pids clientPids{};
- std::vector<std::string> clientCmdlines{};
- vintf::Arch arch{vintf::Arch::ARCH_EMPTY};
- // empty: unknown, all zeros: unreleased, otherwise: released
- std::string hash{};
- Partition partition{Partition::UNKNOWN};
- VintfInfo vintfInfo{VINTF_INFO_EMPTY};
- // true iff hwbinder and service started
- ServiceStatus serviceStatus{ServiceStatus::UNKNOWN};
- static bool sortByInterfaceName(const TableEntry &a, const TableEntry &b) {
- return a.interfaceName < b.interfaceName;
- };
- static bool sortByServerPid(const TableEntry &a, const TableEntry &b) {
- return a.serverPid < b.serverPid;
- };
- std::string getThreadUsage() const {
- if (threadCount == 0) {
- return "N/A";
- }
- return std::to_string(threadUsage) + "/" + std::to_string(threadCount);
- }
- std::string isReleased() const;
- std::string getVintfInfo() const;
- std::string getField(TableColumnType type) const;
- bool operator==(const TableEntry& other) const;
- std::string to_string() const;
- };
- using SelectedColumns = std::vector<TableColumnType>;
- class Table {
- public:
- using Entries = std::vector<TableEntry>;
- Entries::iterator begin() { return mEntries.begin(); }
- Entries::const_iterator begin() const { return mEntries.begin(); }
- Entries::iterator end() { return mEntries.end(); }
- Entries::const_iterator end() const { return mEntries.end(); }
- size_t size() const { return mEntries.size(); }
- void add(TableEntry&& entry) { mEntries.push_back(std::move(entry)); }
- void setSelectedColumns(const SelectedColumns& s) { mSelectedColumns = s; }
- const SelectedColumns& getSelectedColumns() const { return mSelectedColumns; }
- void setDescription(std::string&& d) { mDescription = std::move(d); }
- // Write table content.
- TextTable createTextTable(bool neat = true,
- const std::function<std::string(const std::string&)>& emitDebugInfo = nullptr) const;
- private:
- std::string mDescription;
- Entries mEntries;
- SelectedColumns mSelectedColumns;
- };
- using TableEntryCompare = std::function<bool(const TableEntry &, const TableEntry &)>;
- class MergedTable {
- public:
- explicit MergedTable(std::vector<const Table*>&& tables) : mTables(std::move(tables)) {}
- TextTable createTextTable();
- private:
- std::vector<const Table*> mTables;
- };
- } // namespace lshal
- } // namespace android
- #endif // FRAMEWORK_NATIVE_CMDS_LSHAL_TABLE_ENTRY_H_
|