equal
deleted
inserted
replaced
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); |