diff -r 04a1b74efd48 -r d32f34975bbf userlibandfileserver/fileserver/shostmassstorage/server/src/cusbhostmssession.cpp --- a/userlibandfileserver/fileserver/shostmassstorage/server/src/cusbhostmssession.cpp Mon Feb 01 19:40:00 2010 +0100 +++ b/userlibandfileserver/fileserver/shostmassstorage/server/src/cusbhostmssession.cpp Mon Feb 01 19:49:38 2010 +0100 @@ -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; } @@ -118,13 +115,7 @@ } break; /* If it is a cleanup then we need to delete the iDeviceThread */ - case EUsbHostMsFinalCleanup: - if(iDeviceThread->IsActive()) - { - TRequestStatus* s=&iDeviceThread->iStatus; - iThread.RequestComplete(s, KErrSessionClosed); - } - iDeviceThread->Cancel(); + case EUsbHostMsFinalCleanup: delete iDeviceThread; iThread.Kill(KErrNone); aMessage.Complete(KErrNone); @@ -133,53 +124,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; - - nameBuf.Format(_L("Host Ms Thread%d"), msDeviceConfig.iInterfaceToken); - iDeviceThread = CUsbHostMsDeviceThread::NewL(msDeviceConfig.iInterfaceToken); + TBuf<32> nameBuf; + nameBuf.Format(_L("Host Ms Thread%8x"), 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 +166,24 @@ 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); - } - 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; + }