1*0e209d39SAndroid Build Coastguard Worker // © 2019 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker 4*0e209d39SAndroid Build Coastguard Worker #ifndef __RESTRACE_H__ 5*0e209d39SAndroid Build Coastguard Worker #define __RESTRACE_H__ 6*0e209d39SAndroid Build Coastguard Worker 7*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 8*0e209d39SAndroid Build Coastguard Worker 9*0e209d39SAndroid Build Coastguard Worker #if U_ENABLE_TRACING 10*0e209d39SAndroid Build Coastguard Worker 11*0e209d39SAndroid Build Coastguard Worker struct UResourceBundle; 12*0e209d39SAndroid Build Coastguard Worker 13*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 14*0e209d39SAndroid Build Coastguard Worker 15*0e209d39SAndroid Build Coastguard Worker class CharString; 16*0e209d39SAndroid Build Coastguard Worker 17*0e209d39SAndroid Build Coastguard Worker /** 18*0e209d39SAndroid Build Coastguard Worker * Instances of this class store information used to trace reads from resource 19*0e209d39SAndroid Build Coastguard Worker * bundles when ICU is built with --enable-tracing. 20*0e209d39SAndroid Build Coastguard Worker * 21*0e209d39SAndroid Build Coastguard Worker * All arguments of type const UResourceBundle*, const char*, and 22*0e209d39SAndroid Build Coastguard Worker * const ResourceTracer& are stored as pointers. The caller must retain 23*0e209d39SAndroid Build Coastguard Worker * ownership for the lifetime of this ResourceTracer. 24*0e209d39SAndroid Build Coastguard Worker * 25*0e209d39SAndroid Build Coastguard Worker * Exported as U_COMMON_API for Windows because it is a value field 26*0e209d39SAndroid Build Coastguard Worker * in other exported types. 27*0e209d39SAndroid Build Coastguard Worker */ 28*0e209d39SAndroid Build Coastguard Worker class U_COMMON_API ResourceTracer { 29*0e209d39SAndroid Build Coastguard Worker public: ResourceTracer()30*0e209d39SAndroid Build Coastguard Worker ResourceTracer() : 31*0e209d39SAndroid Build Coastguard Worker fResB(nullptr), 32*0e209d39SAndroid Build Coastguard Worker fParent(nullptr), 33*0e209d39SAndroid Build Coastguard Worker fKey(nullptr), 34*0e209d39SAndroid Build Coastguard Worker fIndex(-1) {} 35*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const UResourceBundle * resB)36*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const UResourceBundle* resB) : 37*0e209d39SAndroid Build Coastguard Worker fResB(resB), 38*0e209d39SAndroid Build Coastguard Worker fParent(nullptr), 39*0e209d39SAndroid Build Coastguard Worker fKey(nullptr), 40*0e209d39SAndroid Build Coastguard Worker fIndex(-1) {} 41*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const UResourceBundle * resB,const char * key)42*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const UResourceBundle* resB, const char* key) : 43*0e209d39SAndroid Build Coastguard Worker fResB(resB), 44*0e209d39SAndroid Build Coastguard Worker fParent(nullptr), 45*0e209d39SAndroid Build Coastguard Worker fKey(key), 46*0e209d39SAndroid Build Coastguard Worker fIndex(-1) {} 47*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const UResourceBundle * resB,int32_t index)48*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const UResourceBundle* resB, int32_t index) : 49*0e209d39SAndroid Build Coastguard Worker fResB(resB), 50*0e209d39SAndroid Build Coastguard Worker fParent(nullptr), 51*0e209d39SAndroid Build Coastguard Worker fKey(nullptr), 52*0e209d39SAndroid Build Coastguard Worker fIndex(index) {} 53*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const ResourceTracer & parent,const char * key)54*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const ResourceTracer& parent, const char* key) : 55*0e209d39SAndroid Build Coastguard Worker fResB(nullptr), 56*0e209d39SAndroid Build Coastguard Worker fParent(&parent), 57*0e209d39SAndroid Build Coastguard Worker fKey(key), 58*0e209d39SAndroid Build Coastguard Worker fIndex(-1) {} 59*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const ResourceTracer & parent,int32_t index)60*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const ResourceTracer& parent, int32_t index) : 61*0e209d39SAndroid Build Coastguard Worker fResB(nullptr), 62*0e209d39SAndroid Build Coastguard Worker fParent(&parent), 63*0e209d39SAndroid Build Coastguard Worker fKey(nullptr), 64*0e209d39SAndroid Build Coastguard Worker fIndex(index) {} 65*0e209d39SAndroid Build Coastguard Worker 66*0e209d39SAndroid Build Coastguard Worker ~ResourceTracer(); 67*0e209d39SAndroid Build Coastguard Worker 68*0e209d39SAndroid Build Coastguard Worker void trace(const char* type) const; 69*0e209d39SAndroid Build Coastguard Worker void traceOpen() const; 70*0e209d39SAndroid Build Coastguard Worker 71*0e209d39SAndroid Build Coastguard Worker /** 72*0e209d39SAndroid Build Coastguard Worker * Calls trace() if the resB or parent provided to the constructor was 73*0e209d39SAndroid Build Coastguard Worker * non-null; otherwise, does nothing. 74*0e209d39SAndroid Build Coastguard Worker */ maybeTrace(const char * type)75*0e209d39SAndroid Build Coastguard Worker void maybeTrace(const char* type) const { 76*0e209d39SAndroid Build Coastguard Worker if (fResB || fParent) { 77*0e209d39SAndroid Build Coastguard Worker trace(type); 78*0e209d39SAndroid Build Coastguard Worker } 79*0e209d39SAndroid Build Coastguard Worker } 80*0e209d39SAndroid Build Coastguard Worker 81*0e209d39SAndroid Build Coastguard Worker private: 82*0e209d39SAndroid Build Coastguard Worker const UResourceBundle* fResB; 83*0e209d39SAndroid Build Coastguard Worker const ResourceTracer* fParent; 84*0e209d39SAndroid Build Coastguard Worker const char* fKey; 85*0e209d39SAndroid Build Coastguard Worker int32_t fIndex; 86*0e209d39SAndroid Build Coastguard Worker 87*0e209d39SAndroid Build Coastguard Worker CharString& getFilePath(CharString& output, UErrorCode& status) const; 88*0e209d39SAndroid Build Coastguard Worker 89*0e209d39SAndroid Build Coastguard Worker CharString& getResPath(CharString& output, UErrorCode& status) const; 90*0e209d39SAndroid Build Coastguard Worker }; 91*0e209d39SAndroid Build Coastguard Worker 92*0e209d39SAndroid Build Coastguard Worker /** 93*0e209d39SAndroid Build Coastguard Worker * This class provides methods to trace data file reads when ICU is built 94*0e209d39SAndroid Build Coastguard Worker * with --enable-tracing. 95*0e209d39SAndroid Build Coastguard Worker */ 96*0e209d39SAndroid Build Coastguard Worker class FileTracer { 97*0e209d39SAndroid Build Coastguard Worker public: 98*0e209d39SAndroid Build Coastguard Worker static void traceOpen(const char* path, const char* type, const char* name); 99*0e209d39SAndroid Build Coastguard Worker 100*0e209d39SAndroid Build Coastguard Worker private: 101*0e209d39SAndroid Build Coastguard Worker static void traceOpenDataFile(const char* path, const char* type, const char* name); 102*0e209d39SAndroid Build Coastguard Worker static void traceOpenResFile(const char* path, const char* name); 103*0e209d39SAndroid Build Coastguard Worker }; 104*0e209d39SAndroid Build Coastguard Worker 105*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 106*0e209d39SAndroid Build Coastguard Worker 107*0e209d39SAndroid Build Coastguard Worker #else // U_ENABLE_TRACING 108*0e209d39SAndroid Build Coastguard Worker 109*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 110*0e209d39SAndroid Build Coastguard Worker 111*0e209d39SAndroid Build Coastguard Worker /** 112*0e209d39SAndroid Build Coastguard Worker * Default trivial implementation when --enable-tracing is not used. 113*0e209d39SAndroid Build Coastguard Worker */ 114*0e209d39SAndroid Build Coastguard Worker class U_COMMON_API ResourceTracer { 115*0e209d39SAndroid Build Coastguard Worker public: 116*0e209d39SAndroid Build Coastguard Worker ResourceTracer() {} 117*0e209d39SAndroid Build Coastguard Worker 118*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const void*) {} 119*0e209d39SAndroid Build Coastguard Worker 120*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const void*, const char*) {} 121*0e209d39SAndroid Build Coastguard Worker 122*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const void*, int32_t) {} 123*0e209d39SAndroid Build Coastguard Worker 124*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const ResourceTracer&, const char*) {} 125*0e209d39SAndroid Build Coastguard Worker 126*0e209d39SAndroid Build Coastguard Worker ResourceTracer(const ResourceTracer&, int32_t) {} 127*0e209d39SAndroid Build Coastguard Worker 128*0e209d39SAndroid Build Coastguard Worker void trace(const char*) const {} 129*0e209d39SAndroid Build Coastguard Worker 130*0e209d39SAndroid Build Coastguard Worker void traceOpen() const {} 131*0e209d39SAndroid Build Coastguard Worker 132*0e209d39SAndroid Build Coastguard Worker void maybeTrace(const char*) const {} 133*0e209d39SAndroid Build Coastguard Worker }; 134*0e209d39SAndroid Build Coastguard Worker 135*0e209d39SAndroid Build Coastguard Worker /** 136*0e209d39SAndroid Build Coastguard Worker * Default trivial implementation when --enable-tracing is not used. 137*0e209d39SAndroid Build Coastguard Worker */ 138*0e209d39SAndroid Build Coastguard Worker class FileTracer { 139*0e209d39SAndroid Build Coastguard Worker public: 140*0e209d39SAndroid Build Coastguard Worker static void traceOpen(const char*, const char*, const char*) {} 141*0e209d39SAndroid Build Coastguard Worker }; 142*0e209d39SAndroid Build Coastguard Worker 143*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 144*0e209d39SAndroid Build Coastguard Worker 145*0e209d39SAndroid Build Coastguard Worker #endif // U_ENABLE_TRACING 146*0e209d39SAndroid Build Coastguard Worker 147*0e209d39SAndroid Build Coastguard Worker #endif //__RESTRACE_H__ 148