diff options
Diffstat (limited to 'indra/llcommon')
-rw-r--r-- | indra/llcommon/llapp.cpp | 57 | ||||
-rw-r--r-- | indra/llcommon/llfasttimer_class.cpp | 3 | ||||
-rw-r--r-- | indra/llcommon/llqueuedthread.cpp | 5 | ||||
-rw-r--r-- | indra/llcommon/llstring.cpp | 9 | ||||
-rw-r--r-- | indra/llcommon/lluuid.cpp | 116 |
5 files changed, 101 insertions, 89 deletions
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index eedec0b24e..be3b18d9c8 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -32,6 +32,12 @@ #include <cstdlib> +#ifdef LL_DARWIN +#include <sys/types.h> +#include <unistd.h> +#include <sys/sysctl.h> +#endif + #include "linden_common.h" #include "llapp.h" @@ -306,7 +312,42 @@ void LLApp::setupErrorHandling() setup_signals(); // Add google breakpad exception handler configured for Darwin/Linux. - if(mExceptionHandler == 0) + bool installHandler = true; +#ifdef LL_DARWIN + // For the special case of Darwin, we do not want to install the handler if + // the process is being debugged as the app will exit with value ABRT (6) if + // we do. Unfortunately, the code below which performs that test relies on + // the structure kinfo_proc which has been tagged by apple as an unstable + // API. We disable this test for shipping versions to avoid conflicts with + // future releases of Darwin. This test is really only needed for developers + // starting the app from a debugger anyway. + #ifndef LL_RELEASE_FOR_DOWNLOAD + int mib[4]; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + struct kinfo_proc info; + memset(&info, 0, sizeof(info)); + + size_t size = sizeof(info); + int result = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); + if((result == 0) || (errno == ENOMEM)) + { + // P_TRACED flag is set, so this process is being debugged; do not install + // the handler + if(info.kp_proc.p_flag & P_TRACED) installHandler = false; + } + else + { + // Failed to discover if the process is being debugged; default to + // installing the handler. + installHandler = true; + } + #endif +#endif + if(installHandler && (mExceptionHandler == 0)) { std::string dumpPath = "/tmp/"; mExceptionHandler = new google_breakpad::ExceptionHandler(dumpPath, 0, &unix_post_minidump_callback, 0, true); @@ -364,7 +405,7 @@ void LLApp::setError() void LLApp::setMiniDumpDir(const std::string &path) { - llassert(mExceptionHandler); + if(mExceptionHandler == 0) return; #ifdef LL_WINDOWS wchar_t buffer[MAX_MINDUMP_PATH_LENGTH]; mbstowcs(buffer, path.c_str(), MAX_MINDUMP_PATH_LENGTH); @@ -376,7 +417,7 @@ void LLApp::setMiniDumpDir(const std::string &path) void LLApp::writeMiniDump() { - llassert(mExceptionHandler); + if(mExceptionHandler == 0) return; mExceptionHandler->WriteMinidump(); } @@ -822,7 +863,13 @@ bool unix_post_minidump_callback(const char *dump_dir, llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl; LLApp::runErrorHandler(); + +#ifndef LL_RELEASE_FOR_DOWNLOAD + clear_signals(); + return false; +#else return true; +#endif } #endif // !WINDOWS @@ -879,6 +926,10 @@ bool windows_post_minidump_callback(const wchar_t* dump_path, ms_sleep(10); } +#ifndef LL_RELEASE_FOR_DOWNLOAD + return false; +#else return true; +#endif } #endif diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp index 20727dd76e..dfbae09864 100644 --- a/indra/llcommon/llfasttimer_class.cpp +++ b/indra/llcommon/llfasttimer_class.cpp @@ -238,7 +238,8 @@ U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer #else // windows or x86-mac or x86-linux or x86-solaris U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer { - static U64 sCPUClockFrequency = U64(LLProcessorInfo().getCPUFrequency()); + //getCPUFrequency returns MHz and sCPUClockFrequency wants to be in Hz + static U64 sCPUClockFrequency = U64(LLProcessorInfo().getCPUFrequency()*1000000.0); // we drop the low-order byte in our timers, so report a lower frequency return sCPUClockFrequency >> 8; diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp index 809a626c93..e0b56b7973 100644 --- a/indra/llcommon/llqueuedthread.cpp +++ b/indra/llcommon/llqueuedthread.cpp @@ -428,9 +428,11 @@ S32 LLQueuedThread::processNextRequest() llassert_always(req->getStatus() == STATUS_QUEUED); break; } + U32 start_priority = 0 ; if (req) { req->setStatus(STATUS_INPROGRESS); + start_priority = req->getPriority(); } unlockData(); @@ -439,8 +441,7 @@ S32 LLQueuedThread::processNextRequest() // safe to access req. if (req) { - // process request - U32 start_priority = req->getPriority(); + // process request bool complete = req->processRequest(); if (complete) diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index f14d947734..1561bda201 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -994,7 +994,14 @@ void LLStringUtil::formatNumber(std::string& numStr, std::string decimals) convertToS32 (decimals, intDecimals); if (!sLocale.empty()) { - strStream.imbue (std::locale(sLocale.c_str())); + // std::locale() throws if the locale is unknown! (EXT-7926) + try + { + strStream.imbue(std::locale(sLocale.c_str())); + } catch (const std::exception &) + { + LL_WARNS_ONCE("Locale") << "Cannot set locale to " << sLocale << LL_ENDL; + } } if (!intDecimals) diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp index 583c1e589b..3bab01715a 100644 --- a/indra/llcommon/lluuid.cpp +++ b/indra/llcommon/lluuid.cpp @@ -456,101 +456,53 @@ static void get_random_bytes(void *buf, int nbytes) } #if LL_WINDOWS -// Code copied from http://msdn.microsoft.com/en-us/library/aa365939(VS.85).aspx -// This code grabs the first hardware address, rather than the first interface. -// Using a VPN can cause the first returned interface to be changed. - -const S32 MAC_ADDRESS_BYTES=6; +typedef struct _ASTAT_ +{ + ADAPTER_STATUS adapt; + NAME_BUFFER NameBuff [30]; +}ASTAT, * PASTAT; // static S32 LLUUID::getNodeID(unsigned char *node_id) { + ASTAT Adapter; + NCB Ncb; + UCHAR uRetCode; + LANA_ENUM lenum; + int i; + int retval = 0; - // Declare and initialize variables. - DWORD dwSize = 0; - DWORD dwRetVal = 0; - int i; - -/* variables used for GetIfTable and GetIfEntry */ - MIB_IFTABLE *pIfTable; - MIB_IFROW *pIfRow; + memset( &Ncb, 0, sizeof(Ncb) ); + Ncb.ncb_command = NCBENUM; + Ncb.ncb_buffer = (UCHAR *)&lenum; + Ncb.ncb_length = sizeof(lenum); + uRetCode = Netbios( &Ncb ); - // Allocate memory for our pointers. - pIfTable = (MIB_IFTABLE *) malloc(sizeof (MIB_IFTABLE)); - if (pIfTable == NULL) + for(i=0; i < lenum.length ;i++) { - printf("Error allocating memory needed to call GetIfTable\n"); - return 0; - } + memset( &Ncb, 0, sizeof(Ncb) ); + Ncb.ncb_command = NCBRESET; + Ncb.ncb_lana_num = lenum.lana[i]; - // Before calling GetIfEntry, we call GetIfTable to make - // sure there are entries to get and retrieve the interface index. + uRetCode = Netbios( &Ncb ); - // Make an initial call to GetIfTable to get the - // necessary size into dwSize - if (GetIfTable(pIfTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { - free(pIfTable); - pIfTable = (MIB_IFTABLE *) malloc(dwSize); - if (pIfTable == NULL) - { - printf("Error allocating memory\n"); - return 0; - } - } - // Make a second call to GetIfTable to get the actual - // data we want. - if ((dwRetVal = GetIfTable(pIfTable, &dwSize, 0)) == NO_ERROR) - { - if (pIfTable->dwNumEntries > 0) - { - pIfRow = (MIB_IFROW *) malloc(sizeof (MIB_IFROW)); - if (pIfRow == NULL) - { - printf("Error allocating memory\n"); - if (pIfTable != NULL) - { - free(pIfTable); - pIfTable = NULL; - } - return 0; - } + memset( &Ncb, 0, sizeof (Ncb) ); + Ncb.ncb_command = NCBASTAT; + Ncb.ncb_lana_num = lenum.lana[i]; - int limit = MAC_ADDRESS_BYTES; - memcpy(node_id, "\0\0\0\0\0\0", limit); // zero out array of bytes - for (i = 0; i < (int) pIfTable->dwNumEntries; i++) - { - pIfRow->dwIndex = pIfTable->table[i].dwIndex; - if ((dwRetVal = GetIfEntry(pIfRow)) == NO_ERROR) - { - switch (pIfRow->dwType) - { - case IF_TYPE_ETHERNET_CSMACD: - case IF_TYPE_IEEE80211: - limit = min((int) pIfRow->dwPhysAddrLen, limit); - if (pIfRow->dwPhysAddrLen == 0) - break; - memcpy(node_id, (UCHAR *)&pIfRow->bPhysAddr[0], limit); // just incase the PhysAddr is not the expected MAC_Address size - free(pIfTable); - return 1; //return first hardware device found. - break; - - case IF_TYPE_OTHER: - case IF_TYPE_PPP: - case IF_TYPE_SOFTWARE_LOOPBACK: - case IF_TYPE_ISO88025_TOKENRING: - case IF_TYPE_IEEE1394: - case IF_TYPE_ATM: - case IF_TYPE_TUNNEL: - default: - break; - } - } - } + strcpy( (char *)Ncb.ncb_callname, "* " ); /* Flawfinder: ignore */ + Ncb.ncb_buffer = (unsigned char *)&Adapter; + Ncb.ncb_length = sizeof(Adapter); + + uRetCode = Netbios( &Ncb ); + if ( uRetCode == 0 ) + { + memcpy(node_id,Adapter.adapt.adapter_address,6); /* Flawfinder: ignore */ + retval = 1; } } - free(pIfTable); - return 0; + return retval; } #elif LL_DARWIN |