--- 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)