diff options
| author | Oz Linden <oz@lindenlab.com> | 2013-06-06 16:46:31 -0400 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2013-06-06 16:46:31 -0400 | 
| commit | a2fa9a2bc26bb67c0bb952d3295c380dcb853eb5 (patch) | |
| tree | 5f2e8de9027fc924947b304c20e1aaf81ce1234a /indra/llcommon | |
| parent | 72e7269da376d660385f3c66ac2a25a5e50871ea (diff) | |
| parent | dcfb18373eca7986a73d8b9a1d34970cc0a23ed9 (diff) | |
merge changes for 3.5.3-release
Diffstat (limited to 'indra/llcommon')
| -rwxr-xr-x | indra/llcommon/CMakeLists.txt | 1 | ||||
| -rwxr-xr-x | indra/llcommon/llcoros.cpp | 13 | ||||
| -rwxr-xr-x | indra/llcommon/llcoros.h | 6 | ||||
| -rwxr-xr-x | indra/llcommon/llstring.cpp | 17 | ||||
| -rwxr-xr-x | indra/llcommon/llstring.h | 1 | ||||
| -rwxr-xr-x | indra/llcommon/lluri.cpp | 29 | ||||
| -rwxr-xr-x | indra/llcommon/tests/lleventcoro_test.cpp | 37 | 
7 files changed, 86 insertions, 18 deletions
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 95b1d536fe..3a4a8facc2 100755 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -337,6 +337,7 @@ if (LL_TESTS)    LL_ADD_INTEGRATION_TEST(reflection "" "${test_libs}")    LL_ADD_INTEGRATION_TEST(stringize "" "${test_libs}")    LL_ADD_INTEGRATION_TEST(lleventdispatcher "" "${test_libs}") +  LL_ADD_INTEGRATION_TEST(lleventcoro "" "${test_libs};${BOOST_CONTEXT_LIBRARY}")    LL_ADD_INTEGRATION_TEST(llprocess "" "${test_libs}")    LL_ADD_INTEGRATION_TEST(llleap "" "${test_libs}")    LL_ADD_INTEGRATION_TEST(llstreamqueue "" "${test_libs}") diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index 9122704306..a629f71d4b 100755 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -39,7 +39,12 @@  #include "llerror.h"  #include "stringize.h" -LLCoros::LLCoros() +LLCoros::LLCoros(): +    // MAINT-2724: default coroutine stack size too small on Windows. +    // Previously we used +    // boost::context::guarded_stack_allocator::default_stacksize(); +    // empirically this is 64KB on Windows and Linux. Try quadrupling. +    mStackSize(256*1024)  {      // Register our cleanup() method for "mainloop" ticks      LLEventPumps::instance().obtain("mainloop").listen( @@ -125,6 +130,12 @@ std::string LLCoros::getNameByID(const void* self_id) const      return "";  } +void LLCoros::setStackSize(S32 stacksize) +{ +    LL_INFOS("LLCoros") << "Setting coroutine stack size to " << stacksize << LL_ENDL; +    mStackSize = stacksize; +} +  /*****************************************************************************  *   MUST BE LAST  *****************************************************************************/ diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index 03df406b68..01ee11da1a 100755 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -125,7 +125,7 @@ public:      template <typename CALLABLE>      std::string launch(const std::string& prefix, const CALLABLE& callable)      { -        return launchImpl(prefix, new coro(callable)); +        return launchImpl(prefix, new coro(callable, mStackSize));      }      /** @@ -152,6 +152,9 @@ public:      /// getName() by self.get_id()      std::string getNameByID(const void* self_id) const; +    /// for delayed initialization +    void setStackSize(S32 stacksize); +  private:      friend class LLSingleton<LLCoros>;      LLCoros(); @@ -159,6 +162,7 @@ private:      std::string generateDistinctName(const std::string& prefix) const;      bool cleanup(const LLSD&); +    S32 mStackSize;      typedef boost::ptr_map<std::string, coro> CoroMap;      CoroMap mCoros;  }; diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 0c32679744..22c8681983 100755 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -52,6 +52,23 @@ std::string ll_safe_string(const char* in, S32 maxlen)  	return std::string();  } +bool is_char_hex(char hex) +{ +	if((hex >= '0') && (hex <= '9')) +	{ +		return true; +	} +	else if((hex >= 'a') && (hex <='f')) +	{ +		return true; +	} +	else if((hex >= 'A') && (hex <='F')) +	{ +		return true; +	} +	return false; // uh - oh, not hex any more... +} +  U8 hex_as_nybble(char hex)  {  	if((hex >= '0') && (hex <= '9')) diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 119efc7957..f9702868c8 100755 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -470,6 +470,7 @@ inline std::string chop_tail_copy(   * @brief This translates a nybble stored as a hex value from 0-f back   * to a nybble in the low order bits of the return byte.   */ +LL_COMMON_API bool is_char_hex(char hex);  LL_COMMON_API U8 hex_as_nybble(char hex);  /** diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp index 21456a599b..37f5b3d6a3 100755 --- a/indra/llcommon/lluri.cpp +++ b/indra/llcommon/lluri.cpp @@ -129,11 +129,30 @@ std::string LLURI::unescape(const std::string& str)  		{  			++it;  			if(it == end) break; -			U8 c = hex_as_nybble(*it++); -			c = c << 4; -			if (it == end) break; -			c |= hex_as_nybble(*it); -			ostr.put((char)c); + +			if(is_char_hex(*it)) +			{ +				U8 c = hex_as_nybble(*it++); + +				c = c << 4; +				if (it == end) break; + +				if(is_char_hex(*it)) +				{ +					c |= hex_as_nybble(*it); +					ostr.put((char)c); +				} +				else +				{ +					ostr.put((char)c); +					ostr.put(*it); +				} +			} +			else +			{ +				ostr.put('%'); +				ostr.put(*it); +			}  		}  		else  		{ diff --git a/indra/llcommon/tests/lleventcoro_test.cpp b/indra/llcommon/tests/lleventcoro_test.cpp index 8d12529613..5ebde1a31d 100755 --- a/indra/llcommon/tests/lleventcoro_test.cpp +++ b/indra/llcommon/tests/lleventcoro_test.cpp @@ -78,6 +78,7 @@  #include "../test/lltut.h"  #include "llsd.h" +#include "llsdutil.h"  #include "llevents.h"  #include "tests/wrapllerrs.h"  #include "stringize.h" @@ -108,7 +109,7 @@ match_substring(BidirectionalIterator begin,  		BidirectionalIterator end,   		std::string xmatch,  		BOOST_DEDUCED_TYPENAME coroutine<BidirectionalIterator(void)>::self& self) {  -  BidirectionalIterator begin_ = begin; +//BidirectionalIterator begin_ = begin;    for(; begin != end; ++begin)       if(match(begin, end, xmatch)) {        self.yield(begin); @@ -213,7 +214,7 @@ namespace tut              BEGIN              {                  result = postAndWait(self, -                                     LLSD().insert("value", 17), // request event +                                     LLSDMap("value", 17),       // request event                                       immediateAPI.getPump(),     // requestPump                                       "reply1",                   // replyPump                                       "reply");                   // request["reply"] = name @@ -226,7 +227,7 @@ namespace tut              BEGIN              {                  LLEventWithID pair = ::postAndWait2(self, -                                                    LLSD().insert("value", 18), +                                                    LLSDMap("value", 18),                                                      immediateAPI.getPump(),                                                      "reply2",                                                      "error2", @@ -244,7 +245,7 @@ namespace tut              BEGIN              {                  LLEventWithID pair = ::postAndWait2(self, -                                                    LLSD().insert("value", 18).insert("fail", LLSD()), +                                                    LLSDMap("value", 18)("fail", LLSD()),                                                      immediateAPI.getPump(),                                                      "reply2",                                                      "error2", @@ -273,7 +274,7 @@ namespace tut              BEGIN              {                  LLCoroEventPump waiter; -                result = waiter.postAndWait(self, LLSD().insert("value", 17), +                result = waiter.postAndWait(self, LLSDMap("value", 17),                                              immediateAPI.getPump(), "reply");              }              END @@ -365,7 +366,7 @@ namespace tut              BEGIN              {                  LLCoroEventPumps waiter; -                LLEventWithID pair(waiter.postAndWait(self, LLSD().insert("value", 23), +                LLEventWithID pair(waiter.postAndWait(self, LLSDMap("value", 23),                                                        immediateAPI.getPump(), "reply", "error"));                  result = pair.first;                  which  = pair.second; @@ -379,7 +380,7 @@ namespace tut              {                  LLCoroEventPumps waiter;                  LLEventWithID pair( -                    waiter.postAndWait(self, LLSD().insert("value", 23).insert("fail", LLSD()), +                    waiter.postAndWait(self, LLSDMap("value", 23)("fail", LLSD()),                                         immediateAPI.getPump(), "reply", "error"));                  result = pair.first;                  which  = pair.second; @@ -392,7 +393,7 @@ namespace tut              BEGIN              {                  LLCoroEventPumps waiter; -                result = waiter.postAndWaitWithException(self, LLSD().insert("value", 8), +                result = waiter.postAndWaitWithException(self, LLSDMap("value", 8),                                                           immediateAPI.getPump(), "reply", "error");              }              END @@ -406,7 +407,7 @@ namespace tut                  try                  {                      result = waiter.postAndWaitWithException(self, -                        LLSD().insert("value", 9).insert("fail", LLSD()), +                        LLSDMap("value", 9)("fail", LLSD()),                          immediateAPI.getPump(), "reply", "error");                      debug("no exception");                  } @@ -424,7 +425,7 @@ namespace tut              BEGIN              {                  LLCoroEventPumps waiter; -                result = waiter.postAndWaitWithLog(self, LLSD().insert("value", 30), +                result = waiter.postAndWaitWithLog(self, LLSDMap("value", 30),                                                     immediateAPI.getPump(), "reply", "error");              }              END @@ -439,7 +440,7 @@ namespace tut                  try                  {                      result = waiter.postAndWaitWithLog(self, -                        LLSD().insert("value", 31).insert("fail", LLSD()), +                        LLSDMap("value", 31)("fail", LLSD()),                          immediateAPI.getPump(), "reply", "error");                      debug("no exception");                  } @@ -796,4 +797,18 @@ namespace tut          ensure("no result", result.isUndefined());          ensure_contains("got error", threw, "32");      } +} + +/*==========================================================================*| +#include <boost/context/guarded_stack_allocator.hpp> + +namespace tut +{ +    template<> template<> +    void object::test<23>() +    { +        set_test_name("stacksize"); +        std::cout << "default_stacksize: " << boost::context::guarded_stack_allocator::default_stacksize() << '\n'; +    }  } // namespace tut +|*==========================================================================*/  | 
