userlibandfileserver/fileserver/sfile/sf_thread.cpp
branchRCL_3
changeset 43 c1f20ce4abcf
parent 41 0ffb4e86fcc9
child 44 3e88ff8f41d5
equal deleted inserted replaced
42:a179b74831c9 43:c1f20ce4abcf
   923 	TUint id=t.Id();
   923 	TUint id=t.Id();
   924 	return(id);
   924 	return(id);
   925 	}
   925 	}
   926 
   926 
   927 
   927 
   928 CPluginThread::CPluginThread(CFsPlugin& aPlugin)
   928 CPluginThread::CPluginThread(CFsPlugin& aPlugin, RLibrary aLibrary)
   929   : iPlugin(aPlugin)
   929   : iPlugin(aPlugin), iLib(aLibrary)
   930 	{
   930 	{
   931 	/** @prototype */
   931 	/** @prototype */
   932 	iOperationLock.Close();
   932 	iOperationLock.Close();
   933 	iPlugin.Open();
   933 	iPlugin.Open();
       
   934 	
       
   935     /* 
       
   936     Duplicate the handle to the DLL which created the plugin to prevent 
       
   937     TFsRemovePlugin::DoRequestL() from unmapping the DLL's code segment before
       
   938     this thread's destructor has been called as the destructor closes the plugin 
       
   939     which results in a call to the plugin's derived destructor contained in the DLL (!)
       
   940     */ 
       
   941     TInt r = iLib.Duplicate(iThread, EOwnerProcess);
       
   942     __ASSERT_ALWAYS(r==KErrNone, Fault(EFsThreadConstructor));
   934 	}
   943 	}
   935 
   944 
   936 CPluginThread::~CPluginThread()
   945 CPluginThread::~CPluginThread()
   937     {
   946     {
   938     iPlugin.Close();
   947     iPlugin.Close();
       
   948 	iLib.Close();
   939     }
   949     }
   940 
   950 
   941 
   951 
   942 CPluginThread* CPluginThread::NewL(CFsPlugin& aPlugin)
   952 CPluginThread* CPluginThread::NewL(CFsPlugin& aPlugin, RLibrary aLibrary)
   943 	{
   953 	{
   944 	__PRINT(_L("CPluginThread::NewL()"));
   954 	__PRINT(_L("CPluginThread::NewL()"));
   945 	CPluginThread* pT=new(ELeave) CPluginThread(aPlugin);
   955 	CPluginThread* pT=new(ELeave) CPluginThread(aPlugin, aLibrary);
   946 	TInt r=pT->Initialise();
   956 	TInt r=pT->Initialise();
   947 
   957 
   948 	/** @prototype */
   958 	/** @prototype */
   949 	if(r == KErrNone)
   959 	if(r == KErrNone)
   950 		r=pT->iOperationLock.CreateLocal(0);
   960 		r=pT->iOperationLock.CreateLocal(0);