userlibandfileserver/fileserver/sfile/sf_ses.cpp
changeset 286 48e57fb1237e
parent 273 6a75fa55495f
child 299 b5a01337d018
equal deleted inserted replaced
285:ff5437e4337c 286:48e57fb1237e
    38 CSessionFs *CSessionFs::NewL()
    38 CSessionFs *CSessionFs::NewL()
    39 	{
    39 	{
    40 	return new(ELeave) CSessionFs;
    40 	return new(ELeave) CSessionFs;
    41 	}
    41 	}
    42 
    42 
    43 CSessionFs::~CSessionFs()
    43 
       
    44 void CSessionFs::Cleanup()
    44 	{
    45 	{
    45 	__PRINT1(_L("CSessionFs::~CSessionFs() deleting... = 0x%x"),this);
    46 	__PRINT1(_L("CSessionFs::~CSessionFs() deleting... = 0x%x"),this);
       
    47 
       
    48 	CancelAsyncRequests(this);
    46 		
    49 		
    47 	FsNotify::CancelSession(this);
    50 	FsNotify::CancelSession(this);
    48 
    51 
    49 #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
    52 #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
    50 	FsNotificationManager::RemoveNotificationRequest(this);
    53 	FsNotificationManager::RemoveNotificationRequest(this);
    72 	if (iHandles)
    75 	if (iHandles)
    73 		delete iHandles;
    76 		delete iHandles;
    74 
    77 
    75 	
    78 	
    76 	delete iPath;
    79 	delete iPath;
    77 	iSessionFlagsLock.Close();
       
    78 
    80 
    79 #if defined(_DEBUG) || defined(_DEBUG_RELEASE)
    81 #if defined(_DEBUG) || defined(_DEBUG_RELEASE)
    80     __e32_atomic_add_ord32(&SessionCount, (TUint32) -1);
    82     __e32_atomic_add_ord32(&SessionCount, (TUint32) -1);
    81 #endif
    83 #endif
    82 	}
    84 	}
    83 
    85 
       
    86 CSessionFs::~CSessionFs()
       
    87 	{
       
    88 	}
       
    89 
    84 void CSessionFs::Close()
    90 void CSessionFs::Close()
    85 	{
    91 	{
    86 	TheFileServer->SessionQueueLockWait();
       
    87 
       
    88 	if (iAccessCount == 1)
       
    89 		{
       
    90 		// close the objects owned by this session 
       
    91 		// NB closing a CFileShare may allocate a request to flush dirty data which will
       
    92 		// in turn increment iAccessCount on this session
       
    93 		if (iHandles)
       
    94 			{
       
    95 			// Cancel any ASYNC requests belonging to this session BEFORE 
       
    96 			// CSessionFs is deleted to avoid a KERN-EXEC 44 (EBadMessageHandle)
       
    97 			CancelAsyncRequests(this);
       
    98 			delete iHandles;
       
    99 			iHandles = NULL;
       
   100 			}
       
   101 		}
       
   102 
       
   103 	if (__e32_atomic_tas_ord32(&iAccessCount, 1, -1, 0) == 1)
    92 	if (__e32_atomic_tas_ord32(&iAccessCount, 1, -1, 0) == 1)
   104 		{
    93 		{
   105 		RMessage2 message = iMessage;
    94 		RMessage2 message = iMessage;
       
    95 		Cleanup();
       
    96 		TheFileServer->SessionQueueLockWait();
   106 		delete this;
    97 		delete this;
       
    98 		TheFileServer->SessionQueueLockSignal();
   107 		// NB Must complete the message AFTER the session has been deleted...
    99 		// NB Must complete the message AFTER the session has been deleted...
   108 		message.Complete(KErrNone);
   100 		message.Complete(KErrNone);
   109 		}
   101 		}
   110 
       
   111 	TheFileServer->SessionQueueLockSignal();
       
   112 	}
   102 	}
   113 
   103 
   114 void CSessionFs::CreateL()
   104 void CSessionFs::CreateL()
   115 //
   105 //
   116 // Create any additional resources.
   106 // Create any additional resources.
   117 //
   107 //
   118 	{
   108 	{
   119 	__PRINT1(_L("CSessionFs::CreateL 0x%x"),this);
   109 	__PRINT1(_L("CSessionFs::CreateL 0x%x"),this);
   120 
   110 
   121 	iHandles=CFsObjectIx::NewL();
   111 	iHandles=CFsObjectIx::NewL();
   122 	TInt r = iSessionFlagsLock.CreateLocal();
       
   123 	User::LeaveIfError(r);
       
   124 	}
   112 	}
   125 
   113 
   126 TInt CSessionFs::CurrentDrive()
   114 TInt CSessionFs::CurrentDrive()
   127 //
   115 //
   128 // Return the current drive.
   116 // Return the current drive.
   229 	}
   217 	}
   230 
   218 
   231 
   219 
   232 TBool CSessionFs::TestSessionFlags(TUint32 aFlags)
   220 TBool CSessionFs::TestSessionFlags(TUint32 aFlags)
   233 	{
   221 	{
   234 	iSessionFlagsLock.Wait();
   222 	return (TBool) ((iSessionFlags & aFlags) == aFlags);
   235 	TBool b = (iSessionFlags & aFlags) == aFlags;
       
   236 	iSessionFlagsLock.Signal();
       
   237 	return(b);
       
   238 	}
   223 	}
   239 
   224 
   240 
   225 
   241 void CSessionFs::SetSessionFlags(TUint32 aBitsToSet, TUint32 aBitsToClear)
   226 void CSessionFs::SetSessionFlags(TUint32 aBitsToSet, TUint32 aBitsToClear)
   242 	{
   227 	{
   243 	iSessionFlagsLock.Wait();
   228 	// currently this only called from the main thread.
   244 
   229 	__CHECK_MAINTHREAD();
   245 	iSessionFlags &= ~aBitsToClear;
   230 
   246 	iSessionFlags |= aBitsToSet;
   231 	__e32_atomic_ior_ord_ptr(&iSessionFlags, aBitsToSet);
   247 	
   232 	__e32_atomic_and_ord_ptr(&iSessionFlags, ~aBitsToClear);
   248 	iSessionFlagsLock.Signal();
       
   249 	}
   233 	}
   250 
   234 
   251 void CSessionFs::CloseRequestCountInc()
   235 void CSessionFs::CloseRequestCountInc()
   252 	{
   236 	{
   253 	iSessionFlagsLock.Wait();
   237     __e32_atomic_add_ord32(&iCloseRequestCount, (TUint32) 1);
   254 	iCloseRequestCount++;	
       
   255 	iSessionFlagsLock.Signal();
       
   256 	}
   238 	}
   257 
   239 
   258 void CSessionFs::CloseRequestCountDec()
   240 void CSessionFs::CloseRequestCountDec()
   259 	{
   241 	{
   260 	iSessionFlagsLock.Wait();
   242     __e32_atomic_add_ord32(&iCloseRequestCount, (TUint32) -1);
   261 	iCloseRequestCount--;
       
   262 	iSessionFlagsLock.Signal();
       
   263 	}
   243 	}
   264 
   244 
   265 //
   245 //
   266 // Start resource count
   246 // Start resource count
   267 //
   247 //