summaryrefslogtreecommitdiff
path: root/src/s60main
diff options
context:
space:
mode:
authorQt Continuous Integration System <qt-info@nokia.com>2010-10-11 20:51:52 +0200
committerQt Continuous Integration System <qt-info@nokia.com>2010-10-11 20:51:52 +0200
commit405b55e497120187b9d127f902a5009d0c9430bf (patch)
tree902ded03f1f191e2087d501a1d0f1ede262f8ee6 /src/s60main
parent22d7d0e10aefa36e7cab90454f04205a5249a2cb (diff)
parentb2cbe3659bb39204922fa43d9f9625a9de2f5e29 (diff)
downloadqt4-tools-405b55e497120187b9d127f902a5009d0c9430bf.tar.gz
Merge branch 4.7 into qt-master-from-4.7
Diffstat (limited to 'src/s60main')
-rw-r--r--src/s60main/newallocator_hook.cpp87
-rw-r--r--src/s60main/s60main.pro3
2 files changed, 89 insertions, 1 deletions
diff --git a/src/s60main/newallocator_hook.cpp b/src/s60main/newallocator_hook.cpp
index 9cc6afb728..9ea2ef0962 100644
--- a/src/s60main/newallocator_hook.cpp
+++ b/src/s60main/newallocator_hook.cpp
@@ -41,6 +41,11 @@
#include <e32std.h>
#include <qglobal.h>
+#ifdef QT_EXPORTS_NOT_FROZEN
+// If exports in Qt DLLs are not frozen in this build, then we have to pick up the
+// allocator creation function by import link. We know the function will be present
+// in the DLLs we test with, as we have to use the DLLs we have built.
+
struct SStdEpocThreadCreateInfo;
Q_CORE_EXPORT TInt qt_symbian_SetupThreadHeap(TBool aNotFirst, SStdEpocThreadCreateInfo& aInfo);
@@ -51,8 +56,88 @@ Q_CORE_EXPORT TInt qt_symbian_SetupThreadHeap(TBool aNotFirst, SStdEpocThreadCre
* Uses link-time symbol preemption to capture a call from the application
* startup. On return, there is some kind of heap allocator installed on the
* thread.
-*/
+*/
TInt UserHeap::SetupThreadHeap(TBool aNotFirst, SStdEpocThreadCreateInfo& aInfo)
{
return qt_symbian_SetupThreadHeap(aNotFirst, aInfo);
}
+
+#else // QT_EXPORTS_NOT_FROZEN
+// If we are using an export frozen build, it should be compatible with all 4.7.x Qt releases.
+// We want to use the allocator creation function introduced in qtcore.dll after 4.7.1. But we
+// can't import link to it, as it may not be present in whatever 4.7.x DLLs we are running with.
+// So the function is found and called dynamically, by library lookup. If it is not found, we
+// use the OS allocator creation functions instead.
+
+struct SThreadCreateInfo
+ {
+ TAny* iHandle;
+ TInt iType;
+ TThreadFunction iFunction;
+ TAny* iPtr;
+ TAny* iSupervisorStack;
+ TInt iSupervisorStackSize;
+ TAny* iUserStack;
+ TInt iUserStackSize;
+ TInt iInitialThreadPriority;
+ TPtrC iName;
+ TInt iTotalSize; // Size including any extras (must be a multiple of 8 bytes)
+ };
+
+struct SStdEpocThreadCreateInfo : public SThreadCreateInfo
+ {
+ RAllocator* iAllocator;
+ TInt iHeapInitialSize;
+ TInt iHeapMaxSize;
+ TInt iPadding; // Make structure size a multiple of 8 bytes
+ };
+
+
+/* \internal
+ *
+ * Uses link-time symbol preemption to capture a call from the application
+ * startup. On return, there is some kind of heap allocator installed on the
+ * thread.
+*/
+TInt UserHeap::SetupThreadHeap(TBool aNotFirst, SStdEpocThreadCreateInfo& aInfo)
+{
+ TInt r = KErrNone;
+
+#ifndef __WINS__
+ // attempt to create the fast allocator through a known export ordinal in qtcore.dll
+ RLibrary qtcore;
+ if (qtcore.Load(_L("qtcore.dll")) == KErrNone)
+ {
+ const int qt_symbian_SetupThreadHeap_eabi_ordinal = 3713;
+ TLibraryFunction libFunc = qtcore.Lookup(qt_symbian_SetupThreadHeap_eabi_ordinal);
+ if (libFunc)
+ {
+ typedef int (*TSetupThreadHeapFunc)(TBool aNotFirst, SStdEpocThreadCreateInfo& aInfo);
+ TSetupThreadHeapFunc p_qt_symbian_SetupThreadHeap = TSetupThreadHeapFunc(libFunc);
+ r = (*p_qt_symbian_SetupThreadHeap)(aNotFirst, aInfo);
+ }
+ qtcore.Close();
+ if (libFunc)
+ return r;
+ }
+#endif
+
+ // no fast allocator support - use default allocator creation
+ if (!aInfo.iAllocator && aInfo.iHeapInitialSize>0)
+ {
+ // new heap required
+ RHeap* pH = NULL;
+ r = UserHeap::CreateThreadHeap(aInfo, pH);
+ }
+ else if (aInfo.iAllocator)
+ {
+ // sharing a heap
+ RAllocator* pA = aInfo.iAllocator;
+ pA->Open();
+ User::SwitchAllocator(pA);
+ r = KErrNone;
+ }
+ return r;
+}
+
+#endif // QT_EXPORTS_NOT_FROZEN
diff --git a/src/s60main/s60main.pro b/src/s60main/s60main.pro
index 664f155f7d..8ab3bd381d 100644
--- a/src/s60main/s60main.pro
+++ b/src/s60main/s60main.pro
@@ -31,6 +31,9 @@ symbian {
# against GCCE apps, so remove it
MMP_RULES -= $$MMP_RULES_DONT_EXPORT_ALL_CLASS_IMPEDIMENTA
linux-armcc:QMAKE_CXXFLAGS *= --export_all_vtbl
+
+ # Flag if exports are not frozen to avoid lookup of qtcore allocator creation function by ordinal
+ contains(CONFIG, def_files_disabled): DEFINES += QT_EXPORTS_NOT_FROZEN
} else {
error("$$_FILE_ is intended only for Symbian!")
}