userlibandfileserver/fileserver/sfile/sf_plugin_man.cpp
changeset 273 6a75fa55495f
parent 243 c7a0ce20c48c
--- a/userlibandfileserver/fileserver/sfile/sf_plugin_man.cpp	Wed Sep 22 10:53:45 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_plugin_man.cpp	Mon Sep 27 10:52:00 2010 +0100
@@ -205,28 +205,6 @@
 	aPluginFactory.DecrementMounted();
 	}
 
-/*
- * This will iterate through a plugins request queue and 
- * search for the first occurance it finds of a CancelPluginOp
- * request.
- */
-void FsPluginManager::GetNextCancelPluginOpRequest(CPluginThread* aPluginThread, CFsRequest*& aCancelPluginRequest)
-    {
-    __THRD_PRINT(_L("FsPluginManager::GetNextCancelPluginOpRequest"));
-    
-    TDblQueIter<CFsRequest> iter(aPluginThread->iList);
-    CFsRequest* request = NULL;
-
-    while((request=iter++)!=NULL)
-        {
-        if(request->Operation()->iFunction == KCancelPlugin)
-            {
-            aCancelPluginRequest = request;
-            break;
-            }
-        }
-    }
- 
 
 
 
@@ -248,100 +226,51 @@
 	 * We are transferring requests up and down the chain
 	 * because this plugin is being removed.
 	 * 
-	 * There is a potential problem when one of the outstanding requests
-	 * is CancelPluginOp which is called when the Session is being closed.
-	 * The CancelPluginOp will try to cancel all of the requests on a plugin's
-	 * queue which is associated with that session.
-	 * DismountPlugin(and thus TransferRequests) is trying to preserve the requests
-	 * by passing them along to the Next/Previous plugins. 
-	 * 
-	 * If there is a cancel in the chain we must NOT pass any requests to Previous Plugins 
-	 * as these have already had their chains emptied.
-	 * We should also be wary of passing requests up the chain as they will simply be cancelled 
-	 * somewhere closer to the drive [thread].
-	 * 
-	 * Therefore, we shall check whether there is a KCancelPlugin op in the 
-	 * chain first. 
-     * If there is a cancelPluginOp in the chain, we will cancel of the requests 
-     * that are associated with that session.
-     * 
-     * After that is out of the way we preserve the remaining requests for different sessions by
-     * passing them on.
+	 * ToDo: This next 'while' might be able to be replaced with a call to
+	 * DispatchToPlugin/DispatchToDrive instead.
 	 */
-	if(!aPluginThread->iList.IsEmpty())
+	while(!aPluginThread->iList.IsEmpty())
 	    {
-	    CFsRequest* cancelRequest = NULL;
-	    //For every CancelPluginOp 
-	    while(FsPluginManager::GetNextCancelPluginOpRequest(aPluginThread, cancelRequest), cancelRequest!=NULL)
+	    CFsRequest* pR=aPluginThread->iList.First();
+	    CFsMessageRequest& mR = *(CFsMessageRequest*) pR;
+	    pR->iLink.Deque();
+	    pR->iCurrentPlugin=NULL;
+
+	    if(pR->IsPluginSpecific())
 	        {
-	        RDebug::Print(_L("Transferring Plugin Requests - CancelPluginOp"));
-	        TDblQueIter<CFsRequest> iter(aPluginThread->iList);
-	        CFsRequest* request = NULL;
-	        //For every request
-	        while((request=iter++)!=NULL)
-	            {
-	            if(request->Session() == cancelRequest->Session() && request != cancelRequest)
-	                {
-	                request->iLink.Deque();
-	                request->Complete(KErrCancel);
-	                }
-	            }
-	        cancelRequest->iLink.Deque();
-	        cancelRequest->Complete(KErrNone);
-	        cancelRequest = NULL;
+	        pR->Complete(KErrCancel);
+	        continue;
 	        }
 
-	    /*
-	     * Now that all requests that were to be cancelled have been cancelled,
-	     * we can now go about moving the remaining ones on to , or back to, 
-	     * the appropriate next or previous plugins.
-	     * 
-	     * ToDo: This next 'while' might be able to be replaced with a call to
-	     * DispatchToPlugin/DispatchToDrive instead.
-	     */
-	    while(!aPluginThread->iList.IsEmpty())
+	    if(pR->IsPostOperation())
+	        {
+	        //[set the plugin to] pass the request backwards in the chain
+	        PrevPlugin(pR->iCurrentPlugin, &mR);
+	        }
+	    else //IsPreOperations
 	        {
-	        CFsRequest* pR=aPluginThread->iList.First();
-	        CFsMessageRequest& mR = *(CFsMessageRequest*) pR;
-	        pR->iLink.Deque();
-	        pR->iCurrentPlugin=NULL;
+	        //[set the plugin to] pass the request forwards in the chain
+	        NextPlugin(pR->iCurrentPlugin, &mR);
+	        }
 
-	        if(pR->IsPluginSpecific())
+	    if(pR->iCurrentPlugin)
+	        {
+	        pR->iCurrentPlugin->iThreadP->DeliverBack(pR);
+	        }
+	    else
+	        {
+	        if(!pR->IsPostOperation() && (pR->DriveNumber()>=EDriveA && pR->DriveNumber()<=EDriveZ))
 	            {
-	            pR->Complete(KErrCancel);
-	            continue;
-	            }
-
-	        if(pR->IsPostOperation())
-	            {
-	            //[set the plugin to] pass the request backwards in the chain
-	            PrevPlugin(pR->iCurrentPlugin, &mR);
-	            }
-	        else //IsPreOperations
-	            {
-	            //[set the plugin to] pass the request forwards in the chain
-	            NextPlugin(pR->iCurrentPlugin, &mR);
-	            }
-
-	        if(pR->iCurrentPlugin)
-	            {
-	            pR->iCurrentPlugin->iThreadP->DeliverBack(pR);
+	            //Deliver to drive thread
+	            CDriveThread* dT=NULL;
+	            TInt r=FsThreadManager::GetDriveThread(pR->DriveNumber(),&dT);
+	            __ASSERT_ALWAYS(r==KErrNone && dT,Fault(EFsDriveThreadError));
+	            CRequestThread* pT = (CRequestThread*)dT;
+	            pT->DeliverBack(pR);
 	            }
 	        else
 	            {
-	            if(!pR->IsPostOperation() && (pR->DriveNumber()>=EDriveA && pR->DriveNumber()<=EDriveZ))
-	                {
-	                //Deliver to drive thread
-	                CDriveThread* dT=NULL;
-	                TInt r=FsThreadManager::GetDriveThread(pR->DriveNumber(),&dT);
-	                __ASSERT_ALWAYS(r==KErrNone && dT,Fault(EFsDriveThreadError));
-	                CRequestThread* pT = (CRequestThread*)dT;
-	                pT->DeliverBack(pR);
-	                }
-	            else
-	                {
-	                pR->Complete(KErrCancel);
-	                }
+	            pR->Complete(KErrCancel);
 	            }
 	        }
 	    }
@@ -624,13 +553,6 @@
 	aPlugin.iThreadId = aPlugin.iThreadP->StartL();
 	return err;
 	}
-/**
-Cancels plugin requests
-*/
-void FsPluginManager::CancelPlugin(CFsPlugin* aPlugin,CSessionFs* aSession)
-	{
-	aPlugin->iThreadP->CompleteSessionRequests(aSession,KErrCancel);
-	}
 
 /**
 Gets number of plugins in the plugin stack
@@ -727,46 +649,4 @@
 		}
 	}
 
-void FsPluginManager::CompleteSessionRequests(CSessionFs* aSession, TInt aValue, CFsInternalRequest* aRequest)
-/**
- * Complete outstanding requests for the specified session
- */
-	{
-	__PRINT2(_L("FsPluginManager::CompleteSessionRequests(%08x, %d)"), aSession, aValue);
 
-	// Iterate through all plugins, cancelling outstanding session requests
-	aRequest->Set(CancelPluginOp, aSession);
-
-	FsPluginManager::ReadLockChain();
-	TInt count = FsPluginManager::ChainCount();
-	TInt oldCount = count;
-	TInt i;
-	for(i=0; i<count; i++)
-	    {
-	    CFsPlugin* plugin = NULL;
-	    (void) FsPluginManager::Plugin(plugin, i); // (void) as chain is locked.
-	    __ASSERT_DEBUG(plugin, User::Leave(KErrNotFound));
-	    aRequest->iCurrentPlugin = plugin;
-	    aRequest->Status() = KRequestPending;
-	    aRequest->Dispatch();
-	    //Cancel is delivered to the front of the request queue
-	    //so hopefully this wont take too long.
-	    FsPluginManager::UnlockChain();
-	    User::WaitForRequest(aRequest->Status());
-	    FsPluginManager::ReadLockChain();
-	    __ASSERT_ALWAYS(aRequest->Status().Int()==KErrNone||aRequest->Status().Int()==KErrCancel,Fault(ESessionDisconnectThread2));
-	    count = FsPluginManager::ChainCount();
-	    //If a plugin was removed whilst the chain was unlocked we need to make sure we don't skip any plugins
-	    if(count != oldCount)
-	        {
-	        i=0;
-	        oldCount = count;
-	        }
-	    }
-	FsPluginManager::UnlockChain();
-	
-//	RDebug::Print(_L("FsPluginManager::CompleteSessionRequests - CSRs"));
-	iScheduler->CompleteSessionRequests(aSession, aValue);
-	}
-
-