--- a/genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp Wed Sep 15 14:02:55 2010 +0300
@@ -79,10 +79,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 +197,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,&iDefConnLock,&iASelectLock);
+ iCleanup.StorePtrs(iPrivateHeap, &iFs, &iSs, &iCs, &iSSLock, &iCSLock,&iDefConnLock,&iASelectLock,&iTzServerLock);
}
@@ -219,7 +243,6 @@
//close the RTz connection
iTzServer.Close();
-
if( iDefConnPref )
{
switch( iDefConnPref->ExtensionId() )
@@ -1740,6 +1763,11 @@
return MapError(err,anErrno);
}
+EXPORT_C void CLocalSystemInterface::freednssuffixes(if_dns_suffixes * suffixes)
+ {
+ CSocketDesc::FreeDNSSuffixes(suffixes->suffixes);
+ }
+
int CLocalSystemInterface::ioctl_complete (int fid, int cmd, void* param, TRequestStatus& aStatus, int& anErrno)
{
return iFids.ioctlcomplete(fid,cmd,param,aStatus,anErrno);
@@ -2166,7 +2194,7 @@
{
timer.After(*reqarray[numReqs+arraycount], timeout);
// Wait for any request to complete
- CLocalSystemInterface::WaitForNRequest(*reqarray, numReqs+arraycount+1);
+ CLocalSystemInterface::WaitForNRequest(reqarray, numReqs+arraycount+1);
if( (*reqarray[numReqs+arraycount]).Int() == KRequestPending)
{
// The timer hasn't fired yet.
@@ -2181,7 +2209,7 @@
}
else
{
- CLocalSystemInterface::WaitForNRequest(*reqarray, numReqs+arraycount);
+ CLocalSystemInterface::WaitForNRequest(reqarray, numReqs+arraycount);
// Completion Status of one request has been gathered
onedown = ETrue;
}
@@ -3627,6 +3655,47 @@
// Used in lieu of User::WaitForNRequest because of need to support pre-Argus builds
// ---------------------------------------------------------------------------------
//
+void CLocalSystemInterface::WaitForNRequest(TRequestStatus **aStatusArray, TInt aNum)
+ {
+ if (aNum)
+ {
+ // used to keep count of requests we have not been asked to wait for
+ TInt nOther = -1;
+ TBool done = EFalse;
+
+ do
+ {
+ ++nOther;
+ User::WaitForAnyRequest();
+ for (TInt i = 0; i < aNum; ++i)
+ {
+ if ((*aStatusArray[i]).Int() != KRequestPending)
+ {
+ done = ETrue;
+ break;
+ }
+ }
+ } while (!done);
+
+ if (nOther)
+ {
+ // Adjust the thread's signal semaphore to account for the requests
+ // we were not asked to wait for.
+ RThread thrd;
+ for (TInt i = 0; i < nOther; ++i)
+ {
+ thrd.RequestSignal();
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------------
+// CLocalSystemInterface::WaitForNRequest
+// Wait for any one of the input asynchronous requests to complete
+// Used in lieu of User::WaitForNRequest because of need to support pre-Argus builds
+// ---------------------------------------------------------------------------------
+//
void CLocalSystemInterface::WaitForNRequest(TRequestStatus aStatusArray[], TInt aNum)
{
if (aNum)