OpenSim crash fixes, thx to Henri and Zauber
This commit is contained in:
@@ -65,6 +65,8 @@ LLFontManager *gFontManagerp = NULL;
|
|||||||
|
|
||||||
FT_Library gFTLibrary = NULL;
|
FT_Library gFTLibrary = NULL;
|
||||||
|
|
||||||
|
bool LLFont::sOpenGLcrashOnRestart = false;
|
||||||
|
|
||||||
//static
|
//static
|
||||||
void LLFontManager::initClass()
|
void LLFontManager::initClass()
|
||||||
{
|
{
|
||||||
@@ -269,8 +271,11 @@ void LLFont::resetBitmapCache()
|
|||||||
}
|
}
|
||||||
mFontBitmapCachep->reset();
|
mFontBitmapCachep->reset();
|
||||||
|
|
||||||
|
if (!mIsFallback || !sOpenGLcrashOnRestart) // because this often crashes under Linux...
|
||||||
|
{
|
||||||
// Add the empty glyph`5
|
// Add the empty glyph`5
|
||||||
addGlyph(0, 0);
|
addGlyph(0, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LLFontGlyphInfo* LLFont::getGlyphInfo(const llwchar wch) const
|
LLFontGlyphInfo* LLFont::getGlyphInfo(const llwchar wch) const
|
||||||
|
|||||||
@@ -151,6 +151,8 @@ public:
|
|||||||
F32 getXKerning(const llwchar char_left, const llwchar char_right) const; // Get the kerning between the two characters
|
F32 getXKerning(const llwchar char_left, const llwchar char_right) const; // Get the kerning between the two characters
|
||||||
virtual void reset() = 0;
|
virtual void reset() = 0;
|
||||||
|
|
||||||
|
static bool sOpenGLcrashOnRestart;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual BOOL hasGlyph(const llwchar wch) const; // Has a glyph for this character
|
virtual BOOL hasGlyph(const llwchar wch) const; // Has a glyph for this character
|
||||||
virtual BOOL addChar(const llwchar wch) const; // Add a new character to the font if necessary
|
virtual BOOL addChar(const llwchar wch) const; // Add a new character to the font if necessary
|
||||||
|
|||||||
@@ -267,8 +267,16 @@ void LLFontGL::destroyAllGL()
|
|||||||
{
|
{
|
||||||
if (sFontRegistry)
|
if (sFontRegistry)
|
||||||
{
|
{
|
||||||
|
if (LLFont::sOpenGLcrashOnRestart)
|
||||||
|
{
|
||||||
|
// This will leak memory but will prevent a crash...
|
||||||
|
sFontRegistry = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
sFontRegistry->destroyGL();
|
sFontRegistry->destroyGL();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLFontGL::destroyGL()
|
void LLFontGL::destroyGL()
|
||||||
|
|||||||
@@ -927,11 +927,6 @@ S32 LLTextEditor::getCursorPosFromLocalCoord( S32 local_x, S32 local_y, BOOL rou
|
|||||||
|
|
||||||
void LLTextEditor::setCursor(S32 row, S32 column)
|
void LLTextEditor::setCursor(S32 row, S32 column)
|
||||||
{
|
{
|
||||||
// Make sure we're not trying to set the cursor anywhere
|
|
||||||
// it can't go by always setting the min to 0 -- MC
|
|
||||||
row = (row < 0) ? 0 : row;
|
|
||||||
column = (column < 0) ? 0 : column;
|
|
||||||
|
|
||||||
const llwchar* doc = mWText.c_str();
|
const llwchar* doc = mWText.c_str();
|
||||||
const char CR = 10;
|
const char CR = 10;
|
||||||
|
|
||||||
|
|||||||
@@ -74,6 +74,13 @@ if [ "$GTK_IM_MODULE" = "scim" ]; then
|
|||||||
export GTK_IM_MODULE=xim
|
export GTK_IM_MODULE=xim
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Work around for a crash bug when restarting OpenGL after a change in the
|
||||||
|
# graphic settings (anti-aliasing, VBO, FSAA, full screen mode, UI scale).
|
||||||
|
# When you enable this work around, you can change the settings without
|
||||||
|
# crashing, but you will have to restart the viewer after changing them
|
||||||
|
# because the display still gets corrupted.
|
||||||
|
export LL_OPENGL_RESTART_CRASH_BUG=x
|
||||||
|
|
||||||
## - Automatically work around the ATI mouse cursor crash bug:
|
## - Automatically work around the ATI mouse cursor crash bug:
|
||||||
## (this workaround is disabled as most fglrx users do not see the bug)
|
## (this workaround is disabled as most fglrx users do not see the bug)
|
||||||
#if lsmod | grep fglrx &>/dev/null ; then
|
#if lsmod | grep fglrx &>/dev/null ; then
|
||||||
|
|||||||
@@ -74,6 +74,7 @@
|
|||||||
#include "llurlhistory.h"
|
#include "llurlhistory.h"
|
||||||
#include "llfirstuse.h"
|
#include "llfirstuse.h"
|
||||||
#include "llrender.h"
|
#include "llrender.h"
|
||||||
|
#include "llfont.h"
|
||||||
|
|
||||||
#include "llweb.h"
|
#include "llweb.h"
|
||||||
#include "llsecondlifeurls.h"
|
#include "llsecondlifeurls.h"
|
||||||
@@ -680,6 +681,8 @@ bool LLAppViewer::init()
|
|||||||
settings_setup_listeners();
|
settings_setup_listeners();
|
||||||
// Modify settings based on system configuration and compile options
|
// Modify settings based on system configuration and compile options
|
||||||
settings_modify();
|
settings_modify();
|
||||||
|
// Work around for a crash bug when changing OpenGL settings
|
||||||
|
LLFont::sOpenGLcrashOnRestart = (getenv("LL_OPENGL_RESTART_CRASH_BUG") != NULL);
|
||||||
|
|
||||||
// Find partition serial number (Windows) or hardware serial (Mac)
|
// Find partition serial number (Windows) or hardware serial (Mac)
|
||||||
mSerialNumber = generateSerialNumber();
|
mSerialNumber = generateSerialNumber();
|
||||||
|
|||||||
@@ -120,6 +120,10 @@ LLColor4 LLFolderViewItem::sSearchStatusColor;
|
|||||||
LLUIImagePtr LLFolderViewItem::sArrowImage;
|
LLUIImagePtr LLFolderViewItem::sArrowImage;
|
||||||
LLUIImagePtr LLFolderViewItem::sBoxImage;
|
LLUIImagePtr LLFolderViewItem::sBoxImage;
|
||||||
|
|
||||||
|
// This is used to keep track of existing folder view items and
|
||||||
|
// avoid a crash bug due to a race condition (see in doIdle()).
|
||||||
|
static std::set<LLFolderViewItem*> sFolderViewItems;
|
||||||
|
|
||||||
//static
|
//static
|
||||||
void LLFolderViewItem::initClass()
|
void LLFolderViewItem::initClass()
|
||||||
{
|
{
|
||||||
@@ -170,6 +174,7 @@ LLFolderViewItem::LLFolderViewItem( const std::string& name, LLUIImagePtr icon,
|
|||||||
mDragAndDropTarget(FALSE),
|
mDragAndDropTarget(FALSE),
|
||||||
mIsLoading(FALSE)
|
mIsLoading(FALSE)
|
||||||
{
|
{
|
||||||
|
sFolderViewItems.insert(this);
|
||||||
refresh(); // possible opt: only call refreshFromListener()
|
refresh(); // possible opt: only call refreshFromListener()
|
||||||
setTabStop(FALSE);
|
setTabStop(FALSE);
|
||||||
}
|
}
|
||||||
@@ -177,6 +182,7 @@ LLFolderViewItem::LLFolderViewItem( const std::string& name, LLUIImagePtr icon,
|
|||||||
// Destroys the object
|
// Destroys the object
|
||||||
LLFolderViewItem::~LLFolderViewItem( void )
|
LLFolderViewItem::~LLFolderViewItem( void )
|
||||||
{
|
{
|
||||||
|
sFolderViewItems.erase(this);
|
||||||
delete mListener;
|
delete mListener;
|
||||||
mListener = NULL;
|
mListener = NULL;
|
||||||
}
|
}
|
||||||
@@ -4401,7 +4407,19 @@ void LLFolderView::doIdle()
|
|||||||
LLFastTimer t3(LLFastTimer::FTM_AUTO_SELECT);
|
LLFastTimer t3(LLFastTimer::FTM_AUTO_SELECT);
|
||||||
// select new item only if a filtered item not currently selected
|
// select new item only if a filtered item not currently selected
|
||||||
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
|
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
|
||||||
if ((!selected_itemp || !selected_itemp->getFiltered()) && !mAutoSelectOverride)
|
if (selected_itemp != NULL && sFolderViewItems.count(selected_itemp) == 0)
|
||||||
|
{
|
||||||
|
// There is a crash bug due to a race condition: when a folder view item is
|
||||||
|
// destroyed, its address may still appear in mSelectedItems a couple of doIdle()
|
||||||
|
// later, even if you explicitely clear this list and dirty the filters in the
|
||||||
|
// destructor...
|
||||||
|
// This code avoids the crash bug.
|
||||||
|
llwarns << "Invalid folder view item (" << selected_itemp << ") in selection: clearing the latter." << llendl;
|
||||||
|
dirtyFilter();
|
||||||
|
clearSelection();
|
||||||
|
requestArrange();
|
||||||
|
}
|
||||||
|
else if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->getFiltered()))
|
||||||
{
|
{
|
||||||
// select first filtered item
|
// select first filtered item
|
||||||
LLSelectFirstFilteredItem filter;
|
LLSelectFirstFilteredItem filter;
|
||||||
|
|||||||
@@ -1812,12 +1812,19 @@ void LLInventoryPanel::modelChanged(U32 mask)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
|
LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
|
||||||
|
if (new_parent)
|
||||||
|
{
|
||||||
if (view_item->getParentFolder() != new_parent)
|
if (view_item->getParentFolder() != new_parent)
|
||||||
{
|
{
|
||||||
view_item->getParentFolder()->extractItem(view_item);
|
view_item->getParentFolder()->extractItem(view_item);
|
||||||
view_item->addToFolder(new_parent, mFolders);
|
view_item->addToFolder(new_parent, mFolders);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
llwarns << model_item->getParentUUID() << ": parent folder gone !" << llendl;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1832,7 +1839,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl;
|
llwarns << *id_it << ": Item does not exist in either view or model, but notification triggered" << llendl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2778,11 +2778,11 @@ LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& ass
|
|||||||
for( ; it != end; ++it)
|
for( ; it != end; ++it)
|
||||||
{
|
{
|
||||||
LLInventoryObject* obj = *it;
|
LLInventoryObject* obj = *it;
|
||||||
if(obj->getType() != LLAssetType::AT_CATEGORY)
|
if (obj && obj->getType() != LLAssetType::AT_CATEGORY && obj->getType() != LLAssetType::AT_NONE)
|
||||||
{
|
{
|
||||||
// *FIX: gank-ass down cast!
|
// *FIX: gank-ass down cast!
|
||||||
item = (LLViewerInventoryItem*)obj;
|
item = (LLViewerInventoryItem*)obj;
|
||||||
if(item->getAssetUUID() == asset_id)
|
if (item && item->getAssetUUID() == asset_id)
|
||||||
{
|
{
|
||||||
rv = item;
|
rv = item;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -4375,10 +4375,13 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
|
|||||||
if (high_res)
|
if (high_res)
|
||||||
{
|
{
|
||||||
send_agent_pause();
|
send_agent_pause();
|
||||||
|
if (show_ui || !hide_hud)
|
||||||
|
{
|
||||||
//rescale fonts
|
//rescale fonts
|
||||||
initFonts(scale_factor);
|
initFonts(scale_factor);
|
||||||
LLHUDText::reshape();
|
LLHUDText::reshape();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
S32 output_buffer_offset_y = 0;
|
S32 output_buffer_offset_y = 0;
|
||||||
|
|
||||||
@@ -4501,7 +4504,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
|
|||||||
LLPipeline::sShowHUDAttachments = TRUE;
|
LLPipeline::sShowHUDAttachments = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (high_res)
|
if (high_res && (show_ui || !hide_hud))
|
||||||
{
|
{
|
||||||
initFonts(1.f);
|
initFonts(1.f);
|
||||||
LLHUDText::reshape();
|
LLHUDText::reshape();
|
||||||
|
|||||||
Reference in New Issue
Block a user