Fixing issue with default C++ delete operator being called instead of Symbian C++ delete replacement with CBase derived classes from euser. Getting ride of SEH stuff used for WINS fixes our trap/leave runtime issues. anywhere
authorSlion
Wed, 28 Apr 2010 00:44:14 +0200
branchanywhere
changeset 96 428c5911a502
parent 95 f561f9ae805b
child 101 86a1781f0e9b
Fixing issue with default C++ delete operator being called instead of Symbian C++ delete replacement with CBase derived classes from euser. Getting ride of SEH stuff used for WINS fixes our trap/leave runtime issues.
kernel/eka/euser/CMakeLists.txt
kernel/eka/euser/epoc/symc/uc_exec.cpp
kernel/eka/euser/epoc/win32/uc_epoc.cpp
kernel/eka/euser/epoc/win32/uc_utl.cpp
kernel/eka/euser/us_trp.cpp
kernel/eka/include/e32cmn.h
--- a/kernel/eka/euser/CMakeLists.txt	Tue Apr 27 20:22:55 2010 +0200
+++ b/kernel/eka/euser/CMakeLists.txt	Wed Apr 28 00:44:14 2010 +0200
@@ -78,7 +78,7 @@
 set (sourcepath ../common/win32/)
 add_source(
 atomics.cpp
-seh.cpp
+#seh.cpp
 )
 
 #Adding the sources from maths
@@ -100,6 +100,7 @@
 uc_utl.cpp 
 uc_dll.cpp
 #uc_exec.cpp
+scppnwdl.cpp
 )
 
 #Adding the sources from epoc/symc
@@ -232,8 +233,6 @@
 )
 
 
-
-
 #define our target
 
 ### EMULATOR: used by euser and kernel for emulation
@@ -242,12 +241,9 @@
 #set_target_properties(emulator PROPERTIES COMPILE_FLAGS "/Zl") #No default library
 #set_target_properties(emulator PROPERTIES LINK_FLAGS "/ENTRY:_Win32DllMain") #Change the entry point
 
-###
-add_library (scppnwdl STATIC ../euser/epoc/win32/scppnwdl.cpp)
-
 ### EUSER: many user library
 add_library (euser SHARED ${source})
-add_dependencies(euser genexec emulator scppnwdl)
+add_dependencies(euser genexec emulator)
 target_link_libraries(euser emulator)
 #set_target_properties(euser PROPERTIES COMPILE_DEFINITIONS "__DLL__")
 
@@ -278,7 +274,7 @@
 #set_target_properties(epoc PROPERTIES LINK_FLAGS "/ENTRY:mainCRTStartup /SUBSYSTEM:WINDOWS")
 #set_target_properties(epoc PROPERTIES LINK_FLAGS "/NODEFAULTLIB")
 
- #set_target_properties(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...)
+#set_target_properties(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...)
 
 
 #No need for emulator here
--- a/kernel/eka/euser/epoc/symc/uc_exec.cpp	Tue Apr 27 20:22:55 2010 +0200
+++ b/kernel/eka/euser/epoc/symc/uc_exec.cpp	Wed Apr 28 00:44:14 2010 +0200
@@ -32,7 +32,8 @@
 enum TSymcExecPanic
 	{
 	ESymcExecPanicHeapAlreadyExists,
-	ESymcExecPanicCreateHeapFailed
+	ESymcExecPanicCreateHeapFailed,
+	ESymcExecPanicNotUsed
 	};
 
 void Panic(TInt aReason)
@@ -368,8 +369,8 @@
 	CActiveScheduler* iActiveScheduler; //Current active scheduler for this thread. Used.
 	TTrapHandler* iHandler; //This is our cleanup stack. Used.
 	//No idea why we need that trap stack
-	TTrap* iTrapStack[KTrapStackSize];
-	TInt iTrapCount;
+	//TTrap* iTrapStack[KTrapStackSize];
+	//TInt iTrapCount;
 	};
 
 /*
@@ -391,7 +392,7 @@
 
 void TProcess::CreateHeap()
 	{
-	iThread.iTrapCount=0;
+	//iThread.iTrapCount=0;
 	//Define the size of our heap
 	const TInt KHeapMaxSize=1024*1024*10; // 10 Mo for now
 	__ASSERT_ALWAYS(iAllocator==NULL && iBase==NULL,Panic(ESymcExecPanicHeapAlreadyExists));	
@@ -433,17 +434,21 @@
 
 __EXECDECL__ TTrapHandler* Exec::PushTrapFrame(TTrap* aTrap)
 	{
+	Panic(ESymcExecPanicNotUsed);
+	return NULL;
 	//FAST_EXEC1(EFastExecPushTrapFrame);
-	ASSERT(gProcess.iThread.iTrapCount<=KTrapStackSize);
-	gProcess.iThread.iTrapStack[gProcess.iThread.iTrapCount++]=aTrap;
-	return gProcess.iThread.iHandler;
+	//ASSERT(gProcess.iThread.iTrapCount<=KTrapStackSize);
+	//gProcess.iThread.iTrapStack[gProcess.iThread.iTrapCount++]=aTrap;
+	//return gProcess.iThread.iHandler;
 	}
 
 __EXECDECL__ TTrap* Exec::PopTrapFrame()
 	{
+	Panic(ESymcExecPanicNotUsed);
+	return NULL;
 	//FAST_EXEC0(EFastExecPopTrapFrame);
-	ASSERT(gProcess.iThread.iTrapCount>0);
-	return gProcess.iThread.iTrapStack[gProcess.iThread.iTrapCount--];
+	//ASSERT(gProcess.iThread.iTrapCount>0);
+	//return gProcess.iThread.iTrapStack[gProcess.iThread.iTrapCount--];
 	}
 
 __EXECDECL__ CActiveScheduler* Exec::ActiveScheduler()
--- a/kernel/eka/euser/epoc/win32/uc_epoc.cpp	Tue Apr 27 20:22:55 2010 +0200
+++ b/kernel/eka/euser/epoc/win32/uc_epoc.cpp	Wed Apr 28 00:44:14 2010 +0200
@@ -28,11 +28,21 @@
 //For now we use this for basic testing on our SYMC implementation
 
 
-GLDEF_C void MainL()
+class CBaseTest: public CBase
 	{
 
+	};
+
+
+GLDEF_C void MainL()
+	{
+	
+	CBase* other=new(ELeave) CBase();
+	CleanupStack::PushL(other);
 	CBase* base=new(ELeave) CBase();
-	delete base;
+	CleanupStack::PushL(base);
+	CleanupStack::PopAndDestroy(2,other);
+	//delete base;
 	
 	//Testing cleanup stack
 	TRAPD(err,
@@ -50,7 +60,10 @@
 	);
 
 	ASSERT(err==KErrNoMemory);
-
+	
+	//Testing unbalanced cleanup stack
+	//base=new(ELeave) CBase();
+	//CleanupStack::PushL(base);
 	}
 
 
@@ -64,6 +77,15 @@
 	CBase* base=new CBase();
 	delete base;
 
+	CBaseTest* baseTest=new CBaseTest();
+	delete baseTest;
+
+	HBufC* buf=HBufC::New(10);
+	delete buf;
+
+	CArrayFix<TInt>* active=new CArrayFixFlat<TInt>(10);
+	delete active;
+
 	TUint8* test=new TUint8[1024*9];
 	delete[] test;
 
@@ -73,7 +95,8 @@
 		return KErrNoMemory;
 		}
 
-	TRAPD(err,MainL());
+	TInt err=KErrNone;
+	TRAP(err,MainL());
 
 	delete cleanupStack;
 
--- a/kernel/eka/euser/epoc/win32/uc_utl.cpp	Tue Apr 27 20:22:55 2010 +0200
+++ b/kernel/eka/euser/epoc/win32/uc_utl.cpp	Wed Apr 28 00:44:14 2010 +0200
@@ -36,6 +36,24 @@
 	IMPORT_C static void UnTrap();
 	};
 
+
+#ifdef __SYMC__
+
+EXPORT_C TInt TTrap::Trap(TInt&)
+	{
+		/*
+	TTrapHandler* h = Exec::PushTrapFrame(this);
+	if (h != NULL)
+		h->Trap();
+*/
+	return 0;
+	}
+
+EXPORT_C void TTrap::UnTrap()
+	{
+	}
+
+#else
 EXPORT_C TInt TTrap::Trap(TInt&)
 	{
 	return 0;
@@ -44,6 +62,7 @@
 EXPORT_C void TTrap::UnTrap()
 	{
 	}
+#endif
 
 #endif
 
--- a/kernel/eka/euser/us_trp.cpp	Tue Apr 27 20:22:55 2010 +0200
+++ b/kernel/eka/euser/us_trp.cpp	Wed Apr 28 00:44:14 2010 +0200
@@ -91,6 +91,16 @@
 	return KErrNone;
 #endif //__SUPPORT_CPP_EXCEPTIONS__
 	}
+#elif defined(__LEAVE_EQUALS_THROW__) && defined(__SYMC__)
+EXPORT_C TInt XLeaveException::GetReason() const
+	{
+#ifdef __SUPPORT_CPP_EXCEPTIONS__
+	Exec::LeaveEnd();
+	return iR;
+#else // !__SUPPORT_CPP_EXCEPTIONS__
+	return KErrNone;
+#endif //__SUPPORT_CPP_EXCEPTIONS__
+	}
 #endif	// !defined(__LEAVE_EQUALS_THROW__) || !defined(__WINS__)
 
 EXPORT_C void User::LeaveNoMemory()
--- a/kernel/eka/include/e32cmn.h	Tue Apr 27 20:22:55 2010 +0200
+++ b/kernel/eka/include/e32cmn.h	Wed Apr 28 00:44:14 2010 +0200
@@ -5884,7 +5884,7 @@
 
 #else //__LEAVE_EQUALS_THROW__
 
-#ifdef __WINS__
+#if defined(__WINS__) && !defined(__SYMC__)
 /** @internalComponent */
 #define __WIN32SEHTRAP		TWin32SEHTrap __trap; __trap.Trap();
 /** @internalComponent */