diff options
| author | Nat Goodspeed <nat@lindenlab.com> | 2020-04-03 10:38:53 -0400 | 
|---|---|---|
| committer | Nat Goodspeed <nat@lindenlab.com> | 2020-04-03 10:38:53 -0400 | 
| commit | dc07509f296661cf7a4d4bceb88a1a897757de98 (patch) | |
| tree | 07637f41c8dfbc4cab5cefa65749a8a748603c99 /indra/llcommon | |
| parent | b793ab8619d8c52a099aa85fdd831990ca95c6f4 (diff) | |
DRTVWR-476: Cherry-pick debug aids from commit 77b0c53 (fiber-mutex)
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/llerror.h | 15 | ||||
| -rw-r--r-- | indra/llcommon/llsingleton.h | 2 | ||||
| -rw-r--r-- | indra/llcommon/tests/lleventdispatcher_test.cpp | 119 | 
3 files changed, 87 insertions, 49 deletions
| diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h index 48162eca9e..3cdd051ac7 100644 --- a/indra/llcommon/llerror.h +++ b/indra/llcommon/llerror.h @@ -191,9 +191,9 @@ namespace LLError  		The classes CallSite and Log are used by the logging macros below.  		They are not intended for general use.  	*/ -	 +  	struct CallSite; -	 +  	class LL_COMMON_API Log  	{  	public: @@ -202,8 +202,17 @@ namespace LLError  		static void flush(std::ostringstream* out, char* message);  		static void flush(std::ostringstream*, const CallSite&);  		static std::string demangle(const char* mangled); +		/// classname<TYPE>() +		template <typename T> +		static std::string classname()             { return demangle(typeid(T).name()); } +		/// classname(some_pointer) +		template <typename T> +		static std::string classname(const T* ptr) { return demangle(typeid(*ptr).name()); } +		/// classname(some_reference) +		template <typename T> +		static std::string classname(const T& obj) { return demangle(typeid(obj).name()); }  	}; -	 +  	struct LL_COMMON_API CallSite  	{  		// Represents a specific place in the code where a message is logged diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 27c2ceb3b6..ccd2e48bf2 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -120,6 +120,8 @@ protected:      static void logdebugs(const char* p1, const char* p2="",                            const char* p3="", const char* p4="");      static std::string demangle(const char* mangled); +    // these classname() declarations restate template functions declared in +    // llerror.h because we avoid #including that here      template <typename T>      static std::string classname()       { return demangle(typeid(T).name()); }      template <typename T> diff --git a/indra/llcommon/tests/lleventdispatcher_test.cpp b/indra/llcommon/tests/lleventdispatcher_test.cpp index efb75951be..9da1ecfd67 100644 --- a/indra/llcommon/tests/lleventdispatcher_test.cpp +++ b/indra/llcommon/tests/lleventdispatcher_test.cpp @@ -23,6 +23,7 @@  #include "stringize.h"  #include "tests/wrapllerrs.h"  #include "../test/catch_and_store_what_in.h" +#include "../test/debug.h"  #include <map>  #include <string> @@ -46,15 +47,6 @@ using boost::lambda::var;  using namespace llsd;  /***************************************************************************** -*   Output control -*****************************************************************************/ -#ifdef DEBUG_ON -using std::cout; -#else -static std::ostringstream cout; -#endif - -/*****************************************************************************  *   Example data, functions, classes  *****************************************************************************/  // We don't need a whole lot of different arbitrary-params methods, just (no | @@ -155,13 +147,13 @@ struct Vars      /*------------- no-args (non-const, const, static) methods -------------*/      void method0()      { -        cout << "method0()\n"; +        debug()("method0()");          i = 17;      }      void cmethod0() const      { -        cout << 'c'; +        debug()('c', NONL);          const_cast<Vars*>(this)->method0();      } @@ -170,13 +162,13 @@ struct Vars      /*------------ Callable (non-const, const, static) methods -------------*/      void method1(const LLSD& obj)      { -        cout << "method1(" << obj << ")\n"; +        debug()("method1(", obj, ")");          llsd = obj;      }      void cmethod1(const LLSD& obj) const      { -        cout << 'c'; +        debug()('c', NONL);          const_cast<Vars*>(this)->method1(obj);      } @@ -196,12 +188,12 @@ struct Vars          else              vcp = std::string("'") + cp + "'"; -        cout << "methodna(" << b -             << ", " << i -             << ", " << f -             << ", " << d -             << ", " << vcp -             << ")\n"; +        debug()("methodna(", b, +              ", ", i, +              ", ", f, +              ", ", d, +              ", ", vcp, +              ")");          this->b = b;          this->i = i; @@ -218,12 +210,12 @@ struct Vars              vbin << std::hex << std::setfill('0') << std::setw(2) << unsigned(byte);          } -        cout << "methodnb(" << "'" << s << "'" -             << ", " << uuid -             << ", " << date -             << ", '" << uri << "'" -             << ", " << vbin.str() -             << ")\n"; +        debug()("methodnb(", "'", s, "'", +              ", ", uuid, +              ", ", date, +              ", '", uri, "'", +              ", ", vbin.str(), +              ")");          this->s = s;          this->uuid = uuid; @@ -234,18 +226,30 @@ struct Vars      void cmethodna(NPARAMSa) const      { -        cout << 'c'; +        debug()('c', NONL);          const_cast<Vars*>(this)->methodna(NARGSa);      }      void cmethodnb(NPARAMSb) const      { -        cout << 'c'; +        debug()('c', NONL);          const_cast<Vars*>(this)->methodnb(NARGSb);      }      static void smethodna(NPARAMSa);      static void smethodnb(NPARAMSb); + +    static Debug& debug() +    { +        // Lazily initialize this Debug instance so it can notice if main() +        // has forcibly set LOGTEST. If it were simply a static member, it +        // would already have examined the environment variable by the time +        // main() gets around to checking command-line switches. Since we have +        // a global static Vars instance, the same would be true of a plain +        // non-static member. +        static Debug sDebug("Vars"); +        return sDebug; +    }  };  /*------- Global Vars instance for free functions and static methods -------*/  static Vars g; @@ -253,25 +257,25 @@ static Vars g;  /*------------ Static Vars method implementations reference 'g' ------------*/  void Vars::smethod0()  { -    cout << "smethod0() -> "; +    debug()("smethod0() -> ", NONL);      g.method0();  }  void Vars::smethod1(const LLSD& obj)  { -    cout << "smethod1(" << obj << ") -> "; +    debug()("smethod1(", obj, ") -> ", NONL);      g.method1(obj);  }  void Vars::smethodna(NPARAMSa)  { -    cout << "smethodna(...) -> "; +    debug()("smethodna(...) -> ", NONL);      g.methodna(NARGSa);  }  void Vars::smethodnb(NPARAMSb)  { -    cout << "smethodnb(...) -> "; +    debug()("smethodnb(...) -> ", NONL);      g.methodnb(NARGSb);  } @@ -284,25 +288,25 @@ void clear()  /*------------------- Free functions also reference 'g' --------------------*/  void free0()  { -    cout << "free0() -> "; +    g.debug()("free0() -> ", NONL);      g.method0();  }  void free1(const LLSD& obj)  { -    cout << "free1(" << obj << ") -> "; +    g.debug()("free1(", obj, ") -> ", NONL);      g.method1(obj);  }  void freena(NPARAMSa)  { -    cout << "freena(...) -> "; +    g.debug()("freena(...) -> ", NONL);      g.methodna(NARGSa);  }  void freenb(NPARAMSb)  { -    cout << "freenb(...) -> "; +    g.debug()("freenb(...) -> ", NONL);      g.methodnb(NARGSb);  } @@ -313,6 +317,7 @@ namespace tut  {      struct lleventdispatcher_data      { +        Debug debug{"test"};          WrapLLErrs redirect;          Dispatcher work;          Vars v; @@ -431,7 +436,12 @@ namespace tut              // Same for freenb() et al.              params = LLSDMap("a", LLSDArray("b")("i")("f")("d")("cp"))                              ("b", LLSDArray("s")("uuid")("date")("uri")("bin")); -            cout << "params:\n" << params << "\nparams[\"a\"]:\n" << params["a"] << "\nparams[\"b\"]:\n" << params["b"] << std::endl; +            debug("params:\n", +                  params, "\n" +                  "params[\"a\"]:\n", +                  params["a"], "\n" +                  "params[\"b\"]:\n", +                  params["b"]);              // default LLSD::Binary value                 std::vector<U8> binary;              for (size_t ix = 0, h = 0xaa; ix < 6; ++ix, h += 0x11) @@ -448,7 +458,8 @@ namespace tut                                                     (LLDate::now())                                                     (LLURI("http://www.ietf.org/rfc/rfc3986.txt"))                                                     (binary)); -            cout << "dft_array_full:\n" << dft_array_full << std::endl; +            debug("dft_array_full:\n", +                  dft_array_full);              // Partial defaults arrays.              foreach(LLSD::String a, ab)              { @@ -457,7 +468,8 @@ namespace tut                      llsd_copy_array(dft_array_full[a].beginArray() + partition,                                      dft_array_full[a].endArray());              } -            cout << "dft_array_partial:\n" << dft_array_partial << std::endl; +            debug("dft_array_partial:\n", +                  dft_array_partial);              foreach(LLSD::String a, ab)              { @@ -473,7 +485,10 @@ namespace tut                      dft_map_partial[a][params[a][ix].asString()] = dft_array_full[a][ix];                  }              } -            cout << "dft_map_full:\n" << dft_map_full << "\ndft_map_partial:\n" << dft_map_partial << '\n'; +            debug("dft_map_full:\n", +                  dft_map_full, "\n" +                  "dft_map_partial:\n", +                  dft_map_partial);              // (Free function | static method) with (no | arbitrary) params,              // map style, no (empty array) defaults @@ -918,7 +933,12 @@ namespace tut                                                   params[a].endArray()),                                   dft_array_partial[a]);          } -        cout << "allreq:\n" << allreq << "\nleftreq:\n" << leftreq << "\nrightdft:\n" << rightdft << std::endl; +        debug("allreq:\n", +              allreq, "\n" +              "leftreq:\n", +              leftreq, "\n" +              "rightdft:\n", +              rightdft);          // Generate maps containing parameter names not provided by the          // dft_map_partial maps. @@ -930,7 +950,8 @@ namespace tut                  skipreq[a].erase(me.first);              }          } -        cout << "skipreq:\n" << skipreq << std::endl; +        debug("skipreq:\n", +              skipreq);          LLSD groups(LLSDArray       // array of groups @@ -975,7 +996,11 @@ namespace tut              LLSD names(grp[0]);              LLSD required(grp[1][0]);              LLSD optional(grp[1][1]); -            cout << "For " << names << ",\n" << "required:\n" << required << "\noptional:\n" << optional << std::endl; +            debug("For ", names, ",\n", +                  "required:\n", +                  required, "\n" +                  "optional:\n", +                  optional);              // Loop through 'names'              foreach(LLSD nm, inArray(names)) @@ -1163,7 +1188,7 @@ namespace tut          }          // Adjust expect["a"]["cp"] for special Vars::cp treatment.          expect["a"]["cp"] = std::string("'") + expect["a"]["cp"].asString() + "'"; -        cout << "expect: " << expect << '\n'; +        debug("expect: ", expect);          // Use substantially the same logic for args and argsplus          LLSD argsarrays(LLSDArray(args)(argsplus)); @@ -1218,7 +1243,8 @@ namespace tut          {              array_overfull[a].append("bogus");          } -        cout << "array_full: " << array_full << "\narray_overfull: " << array_overfull << std::endl; +        debug("array_full: ", array_full, "\n" +              "array_overfull: ", array_overfull);          // We rather hope that LLDate::now() will generate a timestamp          // distinct from the one it generated in the constructor, moments ago.          ensure_not_equals("Timestamps too close", @@ -1233,7 +1259,8 @@ namespace tut              map_overfull[a] = map_full[a];              map_overfull[a]["extra"] = "ignore";          } -        cout << "map_full: " << map_full << "\nmap_overfull: " << map_overfull << std::endl; +        debug("map_full: ", map_full, "\n" +              "map_overfull: ", map_overfull);          LLSD expect(map_full);          // Twiddle the const char* param.          expect["a"]["cp"] = std::string("'") + expect["a"]["cp"].asString() + "'"; @@ -1248,7 +1275,7 @@ namespace tut          // so won't bother returning it. Predict that behavior to match the          // LLSD values.          expect["a"].erase("b"); -        cout << "expect: " << expect << std::endl; +        debug("expect: ", expect);          // For this test, calling functions registered with different sets of          // parameter defaults should make NO DIFFERENCE WHATSOEVER. Every call          // should pass all params. | 
