merge changes for 3.5.3-release

master
Oz Linden 2013-06-06 16:46:31 -04:00
commit a2fa9a2bc2
20 changed files with 142 additions and 34 deletions

View File

@ -456,3 +456,4 @@ a314f1c94374ab1f6633dd2983f7090a68663eb2 3.5.2-beta4
895628bb5e162410cfdf4bca58f0a57d22ccfcde 3.5.2-beta5
9013c07bfe1c51107233f1924dccdcc5057dd909 3.5.2-beta6
9b1b6f33aa5394b27bb652b31b5cb81ef6060370 3.5.2-release
a277b841729f2a62ba1e34acacc964bc13c1ad6f 3.5.3-release

View File

@ -357,7 +357,7 @@ then
else
upload_item installer "$package" binary/octet-stream
upload_item quicklink "$package" binary/octet-stream
[ -f summary.json ] && upload_item installer summary.json text/plain
[ -f $build_dir/summary.json ] && upload_item installer $build_dir/summary.json text/plain
case "$last_built_variant" in
Release)

View File

@ -909,6 +909,7 @@ Nicky Dasmijn
VWR-29228
MAINT-873
SUN-72
BUG-2432
Nicky Perian
OPEN-1
STORM-1087

View File

@ -22,12 +22,12 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
OUTPUT_VARIABLE VIEWER_VERSION_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if (DEFINED VIEWER_VERSION_REVISION)
if ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
message("Revision (from hg) ${VIEWER_VERSION_REVISION}")
else (DEFINED VIEWER_VERSION_REVISION)
else ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
set(VIEWER_VERSION_REVISION 0 )
message("Revision not set, repository not found, using ${VIEWER_VERSION_REVISION}")
endif (DEFINED VIEWER_VERSION_REVISION)
endif ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
else (DEFINED MERCURIAL)
set(VIEWER_VERSION_REVISION 0)
message("Revision not set, 'hg' not found (${MERCURIAL}), using ${VIEWER_VERSION_REVISION}")

View File

@ -104,6 +104,9 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
//if(Check_FMOD_Error(result, "FMOD::Memory_Initialize"))
// return false;
// turn off non-error log spam to fmod.log (TODO: why do we even have an fmod.log if we don't link against log lib?)
FMOD::Debug_SetLevel(FMOD_DEBUG_LEVEL_ERROR);
result = FMOD::System_Create(&mSystem);
if(Check_FMOD_Error(result, "FMOD::System_Create"))
return false;

View File

@ -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}")

View File

@ -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
*****************************************************************************/

View File

@ -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;
};

View File

@ -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'))

View File

@ -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);
/**

View File

@ -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
{

View File

@ -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
|*==========================================================================*/

View File

@ -3206,14 +3206,14 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin
LLWString offsetString(text.c_str() + segment_offset + mStart);
if(getLength() < segment_offset + mStart)
{
llerrs << "getLength() < segment_offset + mStart\t getLength()\t" << getLength() << "\tsegment_offset:\t"
{
llinfos << "getLength() < segment_offset + mStart\t getLength()\t" << getLength() << "\tsegment_offset:\t"
<< segment_offset << "\tmStart:\t" << mStart << "\tsegments\t" << mEditor.mSegments.size() << "\tmax_chars\t" << max_chars << llendl;
}
if(offsetString.length() + 1 < max_chars)
{
llerrs << "offsetString.length() + 1 < max_chars\t max_chars:\t" << max_chars << "\toffsetString.length():\t" << offsetString.length()
llinfos << "offsetString.length() + 1 < max_chars\t max_chars:\t" << max_chars << "\toffsetString.length():\t" << offsetString.length() << " getLength() : "
<< getLength() << "\tsegment_offset:\t" << segment_offset << "\tmStart:\t" << mStart << "\tsegments\t" << mEditor.mSegments.size() << llendl;
}

View File

@ -1247,8 +1247,12 @@ set(viewer_HEADER_FILES
source_group("CMake Rules" FILES ViewerInstall.cmake)
# the viewer_version.txt file created here is for passing to viewer_manifest
# the summary.json file is created for the benefit of the TeamCity builds, where
# it is used to provide descriptive information to the build results page
add_custom_target(generate_viewer_version ALL
COMMAND echo "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
COMMAND printf '${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}' > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
COMMAND printf '{"Type":"viewer","Version":"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}"}' > ${CMAKE_BINARY_DIR}/summary.json
COMMENT Generating viewer_version.txt for manifest processing
)

View File

@ -1 +1 @@
3.5.3
3.5.4

View File

@ -1905,6 +1905,17 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>CoroutineStackSize</key>
<map>
<key>Comment</key>
<string>Size (in bytes) for each coroutine stack</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>262144</integer>
</map>
<key>CreateToolCopyCenters</key>
<map>
<key>Comment</key>
@ -12505,6 +12516,17 @@
<key>Value</key>
<string>update</string>
</map>
<key>UpdaterWillingToTest</key>
<map>
<key>Comment</key>
<string>Whether or not the updater should offer test candidate upgrades.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<string>1</string>
</map>
<key>UploadBakedTexOld</key>
<map>
<key>Comment</key>

View File

@ -117,6 +117,7 @@
#include "llleap.h"
#include "stringize.h"
#include "llcoros.h"
// Third party library includes
#include <boost/bind.hpp>
@ -755,6 +756,7 @@ bool LLAppViewer::init()
//set the max heap size.
initMaxHeapSize() ;
LLCoros::instance().setStackSize(gSavedSettings.getS32("CoroutineStackSize"));
LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")*1024*1024) ;
@ -2810,6 +2812,16 @@ bool LLAppViewer::initConfiguration()
loadColorSettings();
// Let anyone else who cares know that we've populated our settings
// variables.
for (LLControlGroup::key_iter ki(LLControlGroup::beginKeys()), kend(LLControlGroup::endKeys());
ki != kend; ++ki)
{
// For each named instance of LLControlGroup, send an event saying
// we've initialized an LLControlGroup instance by that name.
LLEventPumps::instance().obtain("LLControlGroup").post(LLSDMap("init", *ki));
}
return true; // Config was successful.
}

View File

@ -1215,8 +1215,8 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
mLODReqQ.push(req);
LLMeshRepository::sLODProcessing++;
}
mPendingLOD.erase(iter);
}
mPendingLOD.erase(iter);
}
return true;

View File

@ -237,8 +237,7 @@
enabled="true"
follows="left|top"
height="14"
initial_value="true"
control_name="UpdateWillingToTest"
control_name="UpdaterWillingToTest"
label="Willing to update to release candidates"
left_delta="0"
mouse_opaque="true"

View File

@ -154,10 +154,8 @@ class ViewerManifest(LLManifest):
# Files in the newview/ directory
self.path("gpu_table.txt")
# The summary.json file gets left in the base checkout dir by
# build.sh. It's only created for a build.sh build.
if not self.path2basename(os.path.join(os.pardir, os.pardir), "summary.json"):
# The summary.json file gets left in the build directory by newview/CMakeLists.txt.
if not self.path2basename(os.pardir, "summary.json"):
print "No summary.json file"
def grid(self):