/* Copyright (C) 2021-2023 Free Software Foundation, Inc. Contributed by Oracle. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ /* The DbeSession class is instantiated by a DbeApplication, and contains * all the data referring to a set of loaded experiments * * It manages a set of tables for the Experiments, for the LoadObjects * referenced in them, and for the other objects representing the * elements in the program hierarchy that can have metrics associated * with them. It also has a master list of all the metrics available * from all the loaded experiments. * * It gets an instance of the Settings class, instantiated as a copy * of the one in the DbeApplication that instantiated the DbeSession. * * In addition, it manages a vector of DbeView's (q.v.); each DbeView * represents a window into the DbeSession, and has its own set of * Settings, and FilterSets for the Experiments, and is the access point * for all processed data. */ #ifndef _DBESESSION_H #define _DBESESSION_H #include #include "dbe_structs.h" #include "vec.h" #include "Hist_data.h" #include "Histable.h" #include "BaseMetric.h" #include "BaseMetricTreeNode.h" #include "MemorySpace.h" #include "hwcentry.h" #include "dbe_types.h" #include "Settings.h" #include "HashMap.h" #include "Table.h" #include "Experiment.h" class DbeSession; class Experiment; class Expression; class ExpGroup; class Function; class JMethod; class Histable; class DbeView; class Module; class LoadObject; class DataObject; class SourceFile; class Settings; class StringBuilder; class UserLabel; class DbeFile; class DbeJarFile; class FileData; class HeapData; template class DbeSyncMap; template class Vector; struct DispTab; struct List; struct Countable; class IndexObjType_t; typedef struct { char *path; Experiment *exp; DbeSession *ds; bool read_ahead; } exp_ctx; class DbeSession { public: DbeSession (Settings *_settings, bool _ipc_mode, bool _rdt_mode); ~DbeSession (); void reset (); void reset_data (); void set_interactive (bool _interactive) { interactive = _interactive; } bool is_interactive () { return interactive; } bool is_datamode_available (); bool is_leaklist_available (); bool is_heapdata_available (); bool is_iodata_available (); bool is_racelist_available (); bool is_deadlocklist_available (); bool is_timeline_available (); bool is_ifreq_available (); bool is_omp_available (); bool has_java (); bool has_ompavail (); // XXX get_clock should be removed, to support cpus with different clocks // XXX means reworking time-convertible HWC code int get_clock (int id); // Access functions for DbeView's int createView (); int createView (int index, int cloneindex); DbeView *getView (int index); void dropView (int index); // Access functions controlling the experiment list Vector *get_group_or_expt (char *path); // load an experiment or group void open_experiment (Experiment *exp, char *path); Experiment *get_exp (int exp_ind); Vector*> *getExperimensGroups (); char *setExperimentsGroups (Vector*> *groups); char *drop_experiment (int exp_ind); int find_experiment (char *path); int nexps () { return exps->size (); } int ngoodexps (); // Access functions controlling the DataObject list DataObject *createDataObject (); DataObject *createDataObject (DataObject *d, DataObject *p = NULL); DataObject *createMasterDataObject (DataObject *); Vector *get_dobj_elements (DataObject *); DataObject * get_Total_DataObject () { return d_total; }; DataObject * get_Unknown_DataObject () { return d_unknown; }; DataObject * get_Scalars_DataObject () { return d_scalars; }; DataObject *find_dobj_by_name (char *dobj_name); DataObject *find_dobj_match (DataObject *dobj); DataObject *find_dobj_master (DataObject *dobj); int ndobjs () { return dobjs->size (); } // check if no -xhwcprof should be ignored bool check_ignore_no_xhwcprof () { return settings->get_ignore_no_xhwcprof (); }; // check if FS warning should be comment, or real warning bool check_ignore_fs_warn () { return settings->get_ignore_fs_warn (); }; // Access functions controlling the LoadObject list DbeSyncMap *loadObjMap; void append (LoadObject *lobj); LoadObject *createLoadObject (const char *nm, int64_t cksum = 0); LoadObject *createLoadObject (const char *nm, const char *runTimePath, DbeFile *df); Vector * get_LoadObjects () { return lobjs; }; void dobj_updateHT (DataObject *dobj); LoadObject *get_Total_LoadObject (); Vector *get_text_segments (); LoadObject *get_Unknown_LoadObject (); LoadObject *find_lobj_by_name (const char *lobj_name, int64_t cksum = 0); // Access functions controlling the Tab list Vector * get_TabList () { return settings->get_TabList (); }; Vector * get_MemTabList () { return settings->get_MemTabState (); }; void mobj_define (MemObjType_t *); // Access functions controlling metrics BaseMetric *find_base_reg_metric (char *mcmd); Vector *get_base_reg_metrics (); // excludes comparison (expr) variants Vector * get_all_reg_metrics () { return reg_metrics; // includes comparison (expr) variants }; BaseMetricTreeNode *get_reg_metrics_tree (); BaseMetric *register_metric_expr (BaseMetric::Type type, char *aux, char *expr_spec); BaseMetric *register_metric (BaseMetric::Type type); BaseMetric *register_metric (char *name, char *username, char *_def); BaseMetric *register_metric (Hwcentry *ctr, const char* cmdname, const char* username); void drop_metric (BaseMetric *); Module *createModule (LoadObject *lo, const char *nm); Module *createUnknownModule (LoadObject *lo); Module *createClassFile (char *className); DbeFile *getDbeFile (char *filename, int filetype); SourceFile *get_Unknown_Source (); SourceFile *createSourceFile (const char *path); Histable *createHistObject (Histable::Type); Function *createFunction (); Function *create_hide_function (LoadObject *lo); Function *get_Total_Function (); Function *get_Unknown_Function (); Function *get_JUnknown_Function (); Function *get_jvm_Function (); LoadObject *get_OMP_LoadObject (); Function *get_OMP_Function (int); JMethod *createJMethod (); Histable *createIndexObject (int idxtype, int64_t idx); Histable *createIndexObject (int idxtype, Histable *hobj); enum SpecialFunction { TruncatedStackFunc, FailedUnwindFunc, LastSpecialFunction }; Function *getSpecialFunction (SpecialFunction); Histable * findObjectById (uint64_t _id) { long id = (long) _id; return (id >= 0 && id < objs->size ()) ? objs->fetch (id) : NULL; } Histable *findObjectById (Histable::Type type, int subtype, uint64_t id); // Other access functions bool find_obj (FILE *dis_file, FILE *inp_file, Histable *&obj, char *name, const char *sel, Histable::Type type, bool xdefault); int ask_which (FILE *dis_file, FILE *inp_file, Vector *list, char *name); LoadObject *map_NametoLoadObject (char *name, Vector *, int which); Module *map_NametoModule (char *name, Vector *, int which); Function *map_NametoFunction (char *, Vector *, const char *); DataObject *map_NametoDataObject (char *name, Vector *, int which); bool match_FName (char *name, Function *func); // Functions to convert a string to all matching Functions/DataObjects Vector *match_func_names (const char *ustr, Histable::NameFormat nfmt); Vector *match_dobj_names (char *); // Functions to convert a string to all matching JThreads Vector *match_java_threads (char *ustr, int matchParent, Vector * &grids, Vector * &expids); // Function to convert a string to all matching File names Vector *match_file_names (char *ustr, Histable::NameFormat nfmt); // Access functions concerning the search path Vector * get_search_path () { return search_path; } Vector*get_classpath (); void set_search_path (Vector *path, bool reset); void set_search_path (char *lpath, bool reset); bool add_classpath (char *path); bool add_path (char *path); void set_pathmaps (Vector *newPathMap); Vector *get_pathmaps (); // functions to aid debugging void dump_stacks (FILE *); void dump_dataobjects (FILE *); void dump_segments (FILE *); void dump_map (FILE *); // Find dynamic property by name int registerPropertyName (const char *name); int getPropIdByName (const char *name); char* getPropName (int propId); char* getPropUName (int propId); Vector *userLabels; // List of er_labels UserLabel *findUserLabel (const char *name); DbeJarFile *get_JarFile (const char *name); void append (UserLabel *lbl); void append (SourceFile *sf); void append (Experiment *exp); void append (Hwcentry *exp); void set_need_refind (); // Find user defined object by name Expression *findObjDefByName (const char *); void get_filter_keywords (Vector *res); // Get the Settings class object Settings * get_settings () { return settings; } // static members, used to define or fetch the various IndexSpaces Vector *getIndxObjDescriptions (void); Vector *getCustomIndxObjects (void); char *indxobj_define (const char *, char *, const char *, char *, char *); char *getIndexSpaceName (int index); char *getIndexSpaceDescr (int index); Expression *getIndexSpaceExpr (int index); char *getIndexSpaceExprStr (int index); int findIndexSpaceByName (const char *mname); void removeIndexSpaceByName (const char *mname); IndexObjType_t *getIndexSpace (int index); IndexObjType_t *findIndexSpace (const char *mname); Expression *ql_parse (const char *expr_spec); BaseMetric *find_metric (BaseMetric::Type type, const char *cmd, const char *expr_spec = NULL); static void dump (char *msg, Vector *mlist); static void dump (char *msg, Vector *mlist); static Platform_t platform; // Sparc, Intel Vector *expGroups; HashMap *comp_lobjs; // list of comparable LoadObjects HashMap *comp_dbelines; // list of comparable DbeLines HashMap*comp_sources; // list of comparable SourceFiles char *localized_SP_UNKNOWN_NAME; void set_lib_visibility_used () { lib_visibility_used = true; } bool is_lib_visibility_used () { return lib_visibility_used; } void unlink_tmp_files (); char *get_tmp_file_name (const char *nm, bool for_java); Vector *tmp_files; int status_ompavail; int archive_mode; bool ipc_mode; bool rdt_mode; // data and methods concerning the machine model // methods are in source file MachineModel.cc Vector *list_mach_models (); // scan . and system lib directory for models char *load_mach_model (char *); char * get_mach_model () { return dbe_strdup (mach_model_loaded); }; Vector *get_sources (); private: void init (); void check_tab_avail (); bool add_path (char *path, Vector *pathes); Experiment *createExperiment (); // Divide the regular createExperiment into two parts - // Part1 creates just the Experiment data structure // Part2 updates related fields and vectors Experiment *createExperimentPart1 (); void createExperimentPart2 (Experiment *exp); Histable *findIndexObject (int idxtype, uint64_t idx); void append_mesgs (StringBuilder *sb, char *path, Experiment *exp); static void insert_metric (BaseMetric *mtr, Vector *mlist); void update_metric_tree (BaseMetric *m); char *find_mach_model (char *); // fine machine model file by name Vector *exps; // Master list of experiments Vector *objs; // Master list of Functions,Modules,Segments Vector *dobjs; // Master list of DataObjects Vector *lobjs; // Auxiliary list of LoadObjects Vector *hwcentries; Vector*> *idxobjs; // Master list of IndexObjects HashMap *sourcesMap; // list of Source which were not archived Vector *sources; // list of SourceFiles Map*dbeJarFiles; Vector *metrics; Vector *reg_metrics; // Master list of BaseMetrics BaseMetricTreeNode* reg_metrics_tree; // Hierarchy of BaseMetrics Vector *search_path; Vector *classpath; Vector *classpath_df; Map*dbeFiles; Vector *views; // Master list of DbeViews bool interactive; // interactive mode bool lib_visibility_used; LoadObject *lo_total; // Total LoadObject Function *f_total; // Total function LoadObject *lo_unknown; // Unknown LoadObject Function *f_unknown; // Unknown function SourceFile *sf_unknown; // Unknown source file Function *f_jvm; // pseudo-function Vector *f_special; // pseudo-functions Function *j_unknown; // pseudo-function LoadObject *lo_omp; // OMP LoadObject (libmtsk) Vector *omp_functions; // OMP-overhead, etc. DataObject *d_unknown; // Unknown dataobject DataObject *d_scalars; // Scalars dataobject DataObject *d_total; // Total dataobject List **dnameHTable; // DataObject name hash table Settings *settings; // setting/defaults structure Vector *dyn_indxobj; // Index Object definitions int dyn_indxobj_indx; int dyn_indxobj_indx_fixed; void propNames_name_store (int propId, const char *propName); void propNames_name_store (int propId, const char *propName, const char *propUName, VType_type vType, int flags); char* propNames_name_fetch (int propId); Vector *propNames; char *defExpName; int user_exp_id_counter; char *mach_model_loaded; char *tmp_dir_name; }; // For now, there's only one, so keep its pointer extern DbeSession *dbeSession; extern Vector *split_str (char *str, char delimiter); #endif /* _DBESESSION_H */