diff --git a/0ad-apicids.patch b/0ad-apicids.patch new file mode 100644 index 0000000..62e7c8a --- /dev/null +++ b/0ad-apicids.patch @@ -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; + } + diff --git a/0ad-traceparse.patch b/0ad-traceparse.patch new file mode 100644 index 0000000..938ea31 --- /dev/null +++ b/0ad-traceparse.patch @@ -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; diff --git a/0ad.spec b/0ad.spec index 605cc5d..059e0dc 100644 --- a/0ad.spec +++ b/0ad.spec @@ -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}" diff --git a/debian.series b/debian.series index 8368b01..82b42ac 100644 --- a/debian.series +++ b/debian.series @@ -7,3 +7,5 @@ 0ad-cs7795.patch -p0 0ad-cs7796.patch -p0 0ad-DllLoader.patch -p0 +0ad-apicids.patch -p0 +0ad-traceparse.patch -p0