Fix spurious assertion failures. Avoid glibc bug.

OBS-URL: https://build.opensuse.org/package/show/games/0ad?expand=0&rev=6
This commit is contained in:
Philip Taylor 2010-07-24 20:00:53 +00:00 committed by Git OBS Bridge
parent 2404e1c9d9
commit 4f7165d27d
4 changed files with 76 additions and 0 deletions

37
0ad-apicids.patch Normal file
View File

@ -0,0 +1,37 @@
diff -r f2cdbf31ce9b source/lib/sysdep/arch/x86_x64/topology.cpp
--- source/lib/sysdep/arch/x86_x64/topology.cpp Sat Jul 10 18:42:54 2010 +0100
+++ source/lib/sysdep/arch/x86_x64/topology.cpp Sat Jul 24 19:57:17 2010 +0100
@@ -137,18 +137,24 @@
// core, package and shared cache. if they are available, we can determine
// the exact topology; otherwise we have to guess.
-// side effect: `removes' (via std::unique) duplicate IDs.
-static bool AreApicIdsUnique(u8* apicIds, size_t numProcessors)
+// if false is returned, the APIC IDs are fishy and shouldn't be used.
+// side effect: sorts IDs and `removes' (via std::unique) duplicates.
+static bool AreApicIdsUnique(u8* apicIds, size_t numIds)
{
- u8* const end = std::unique(apicIds, apicIds+numProcessors);
- const size_t numIds = end-apicIds;
- if(numIds == numProcessors) // all unique
+ std::sort(apicIds, apicIds+numIds);
+ u8* const end = std::unique(apicIds, apicIds+numIds);
+ const size_t numUnique = end-apicIds;
+ // all unique => IDs are valid.
+ if(numUnique == numIds)
return true;
- // the only legitimate cause of duplication is when no xAPIC is
- // present (i.e. all are 0)
- debug_assert(numIds == 1);
- debug_assert(apicIds[0] == 0);
+ // all zero => the system lacks an xAPIC.
+ if(numUnique == 1 && apicIds[0] == 0)
+ return false;
+
+ // duplicated IDs => something went wrong. for example, VMs might not
+ // expose all physical processors, and OS X still doesn't support
+ // thread affinity masks.
return false;
}

33
0ad-traceparse.patch Normal file
View File

@ -0,0 +1,33 @@
diff -r 976c6a6b04e9 source/lib/file/common/trace.cpp
--- source/lib/file/common/trace.cpp Sat Jul 24 19:57:17 2010 +0100
+++ source/lib/file/common/trace.cpp Sat Jul 24 20:30:39 2010 +0100
@@ -57,13 +57,26 @@
wchar_t pathname[PATH_MAX+1] = L""; // includes space for terminator
wchar_t action;
#if EMULATE_SECURE_CRT
- #define TRACE_FORMAT L"%f: %lc \"%" STRINGIZE(PATH_MAX) "l[^\"]\" %zd\n" /* use a macro to allow compile-time type-checking */
- const int fieldsRead = swscanf(text.c_str(), TRACE_FORMAT, &m_timestamp, &action, pathname, &m_size);
+ // The desired code:
+// #define TRACE_FORMAT L"%f: %lc \"%" STRINGIZE(PATH_MAX) "l[^\"]\" %zd\n" /* use a macro to allow compile-time type-checking */
+// const int fieldsRead = swscanf(text.c_str(), TRACE_FORMAT, &m_timestamp, &action, pathname, &m_size);
+ // but that hits http://sources.redhat.com/bugzilla/show_bug.cgi?id=5225 and crashes on glibc 2.7
+ // We need to avoid reading any numbers after the %[]
+ #define TRACE_FORMAT_1 L"%f: %lc \"%" STRINGIZE(PATH_MAX) "l[^\"]\" %n"
+ #define TRACE_FORMAT_2 L"%zd\n"
+ int charsRead = 0;
+ int fieldsRead = swscanf(text.c_str(), TRACE_FORMAT_1, &m_timestamp, &action, pathname, &charsRead);
+ debug_assert(fieldsRead == 3);
+ if (fieldsRead == 3) // first part parsed okay
+ {
+ fieldsRead = swscanf(text.c_str() + charsRead, TRACE_FORMAT_2, &m_size);
+ debug_assert(fieldsRead == 1);
+ }
#else
#define TRACE_FORMAT L"%f: %lc \"%l[^\"]\" %d\n"
const int fieldsRead = swscanf_s(text.c_str(), TRACE_FORMAT, &m_timestamp, &action, 1, pathname, ARRAY_SIZE(pathname), &m_size);
+ debug_assert(fieldsRead == 4);
#endif
- debug_assert(fieldsRead == 4);
debug_assert(action == 'L' || action == 'S');
m_action = (EAction)action;
m_pathname = pathname;

View File

@ -16,6 +16,8 @@ Patch5: 0ad-cs7793.patch
Patch6: 0ad-cs7795.patch
Patch7: 0ad-cs7796.patch
Patch8: 0ad-DllLoader.patch
Patch9: 0ad-apicids.patch
Patch10: 0ad-traceparse.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: binutils-devel
BuildRequires: boost-devel
@ -103,6 +105,8 @@ history.
%patch6
%patch7
%patch8
%patch9
%patch10
%build
export CFLAGS="%{optflags}"

View File

@ -7,3 +7,5 @@
0ad-cs7795.patch -p0
0ad-cs7796.patch -p0
0ad-DllLoader.patch -p0
0ad-apicids.patch -p0
0ad-traceparse.patch -p0