diff -r 4122176ea935 -r 56f325a607ea userlibandfileserver/fileserver/shostmassstorage/server/src/cusbhostmssession.cpp --- a/userlibandfileserver/fileserver/shostmassstorage/server/src/cusbhostmssession.cpp Mon Dec 21 16:14:42 2009 +0000 +++ b/userlibandfileserver/fileserver/shostmassstorage/server/src/cusbhostmssession.cpp Wed Dec 23 11:43:31 2009 +0000 @@ -19,10 +19,8 @@ */ #include -#include -#include + #include "msctypes.h" -#include "mscutils.h" #include "shared.h" #include "msgservice.h" #include "cusbhostmslogicalunit.h" @@ -59,7 +57,6 @@ : iUsbHostMsServer(aServer) { __MSFNLOG - iMsgCount = 0; } @@ -121,10 +118,9 @@ case EUsbHostMsFinalCleanup: if(iDeviceThread->IsActive()) { - TRequestStatus* s=&iDeviceThread->iStatus; - iThread.RequestComplete(s, KErrSessionClosed); + iThread.RequestComplete(iClientStatus, KErrSessionClosed); } - iDeviceThread->Cancel(); + delete iDeviceThread; iThread.Kill(KErrNone); aMessage.Complete(KErrNone); @@ -133,53 +129,41 @@ break; } - __HOSTPRINT1(_L("Queuing %d message"), ++iMsgCount); __ASSERT_DEBUG(iDeviceThread != NULL, User::Panic(KUsbMsHostPanicCat, EDeviceThreadDoesNotExist)); r = iDeviceThread->QueueMsg(aMessage); - if(r != KErrNone) + if (r != KErrNone) { aMessage.Complete(r); return; } - if(iDeviceThread->IsActive()) + if (iClientStatus && *iClientStatus == KRequestPending) { - iDeviceThread->Lock(); - if(iDeviceThread->iIsSignalled) - { - iDeviceThread->Unlock(); - return; - } - iDeviceThread->iIsSignalled = ETrue; - iDeviceThread->Unlock(); __HOSTPRINT(_L("Signaling device thread to handle message")); - TRequestStatus* s=&iDeviceThread->iStatus; - iThread.RequestComplete(s, KErrNone); + iThread.RequestComplete(iClientStatus, KErrNone); } } void CUsbHostMsSession::CreateDeviceThreadL(const RMessage2& aMessage) { + __MSFNLOG THostMassStorageConfig msDeviceConfig; TPtr8 ptr((TUint8*)&msDeviceConfig,sizeof(THostMassStorageConfig)); aMessage.ReadL(0, ptr); __HOSTPRINT1(_L("EUsbHostMsRegisterInterface Token=%d "), msDeviceConfig.iInterfaceToken); - TInt r = KErrNone; - TName nameBuf; - TRequestStatus aStatus; - + TBuf<20> nameBuf; nameBuf.Format(_L("Host Ms Thread%d"), msDeviceConfig.iInterfaceToken); - iDeviceThread = CUsbHostMsDeviceThread::NewL(msDeviceConfig.iInterfaceToken); + iDeviceThread = CUsbHostMsDeviceThread::NewL(*this, msDeviceConfig.iInterfaceToken); RHeap* h = (RHeap*)&User::Allocator(); TInt maxsize = h->MaxLength(); // loader heap max size = file server heap max size const TUint KHeapMinSize = 2048; - r = iThread.Create(nameBuf, CUsbHostMsDeviceThread::Entry, KDefaultStackSize, KHeapMinSize, maxsize, iDeviceThread); + TInt r = iThread.Create(nameBuf, CUsbHostMsDeviceThread::Entry, KDefaultStackSize, KHeapMinSize, maxsize, iDeviceThread); if(r != KErrNone) { delete iDeviceThread; @@ -187,20 +171,29 @@ User::Leave(r); } iThread.SetPriority(EPriorityAbsoluteBackgroundNormal); - iThread.Rendezvous(aStatus); + TRequestStatus status; + iThread.Rendezvous(status); iThread.Resume(); - User::WaitForRequest(aStatus); - if(aStatus != KErrNone) + User::WaitForRequest(status); + if(status != KErrNone) { if(iDeviceThread->IsActive()) - { - TRequestStatus* s=&iDeviceThread->iStatus; - iThread.RequestComplete(s, KErrSessionClosed); + { + iThread.RequestComplete(iClientStatus, KErrSessionClosed); } iDeviceThread->Cancel(); delete iDeviceThread; iDeviceThread = NULL; iThread.Kill(KErrNone); - User::Leave(aStatus.Int()); + User::Leave(status.Int()); } } + + + +void CUsbHostMsSession::MessageRequest(TRequestStatus& aStatus) + { + __MSFNLOG + iClientStatus = &aStatus; + *iClientStatus = KRequestPending; + }