genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp
changeset 68 ff3fc7722556
parent 63 a117ad66e027
--- a/genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp	Fri Sep 17 08:38:54 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp	Mon Oct 04 02:56:42 2010 +0300
@@ -39,6 +39,7 @@
 #include "tsignalmessage.h"
 #endif // SYMBIAN_OE_POSIX_SIGNALS
 
+
 #ifdef SYMBIAN_OE_POSIX_SIGNALS
 #define SIG_SIGNAL_PRESENT_IN_SIGSET(sig,set) ((set & (1ULL << (sig-1))) != 0x0000000000000000ULL)
 #define SIG_ISEMPTY_SIGSET(set) (set == 0x0000000000000000ULL)
@@ -79,10 +80,42 @@
 		return &backend;
 #endif
 		}
+		
+EXPORT_C RTz& CLocalSystemInterface::TZServer(TInt &aStatus)
+	{
+	aStatus = OnDemandTZServerConnection();
+	return iTzServer;
+	} 
+		
+TInt CLocalSystemInterface::OnDemandTZServerConnection()
+        {
+		TInt v = EFalse;
+		TInt err = KErrNone;
+		
+		if(__e32_atomic_load_acq32(&iIsRTzConnected))
+			return err;
+			
+		iTzServerLock.Wait();
+		if (!iIsRTzConnected) 
+			{
+			err = iTzServer.Connect();
+			if ( err == KErrNone ) 
+				{
+				err = iTzServer.ShareAuto();
+				if( err == KErrNone) {
+					v = ETrue;
+					}
+				}
+			__e32_atomic_store_rel32(&iIsRTzConnected, v); 
+			}
+		iTzServerLock.Signal();
+		
+        return err;
+        } 
 
 // Construction of Backend Object which is going to be singleton object for the process
 EXPORT_C CLocalSystemInterface::CLocalSystemInterface() : iOpenDirList(CLocalSystemInterface::KDirGran),
-iTLDInfoList(CLocalSystemInterface::KTLDInfoListGran), iDefConnResurrect(ETrue), iDefConnPref(NULL)
+iTLDInfoList(CLocalSystemInterface::KTLDInfoListGran), iDefConnResurrect(ETrue), iDefConnPref(NULL), iIsRTzConnected(EFalse)
 		{
 #ifdef SYMBIAN_OE_POSIX_SIGNALS
 		iSignalsInitialized = EFalse;
@@ -165,25 +198,17 @@
 			err |=  iASelectLock.CreateLocal();
 	        //Protect the iDefConnection from concurrent GetDefaultConnection calls
 	        err |= iDefConnLock.CreateLocal();
+			//Protect the time zone server while connecting
+			err |= iTzServerLock.CreateLocal();
 			}
 
-        if(err == KErrNone)
-            {
-            err = iTzServer.Connect();
-            if(!err)
-                {
-                err = iTzServer.ShareAuto();
-                }
-            }
-
-
 		//Panic if any of the above operation returns with error
 		if (err)
 			{
 			User::Panic(KEstlibInit, err);
 			}
 
-		iCleanup.StorePtrs(iPrivateHeap, &iFs, &iSs, &iCs, &iSSLock, &iCSLock);
+		iCleanup.StorePtrs(iPrivateHeap, &iFs, &iSs, &iCs, &iSSLock, &iCSLock,&iDefConnLock,&iASelectLock,&iTzServerLock);
 
 		}
 
@@ -194,10 +219,6 @@
 	{
 	iTLDListLock.Close();
 	iSessionPathLock.Close();
-	// Close the aselect lock
-	iASelectLock.Close();
-	// Close the default connection lock
-	iDefConnLock.Close();
 	
 	//close the default RConnection
 	if(iDefConnection.SubSessionHandle() != 0)