* For multi function devices it is not so unlikely to try to do multiple
concurent SendRequest() calls. Therefore it's probably a good idea to protect that, now that the request data is not dynamically allocated anymore. * Fix warning about not returning a result in the compatibility version of init_mutex_etc() (which wouldn't make a difference as the Haiku version does not return anything). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25707 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -55,7 +55,7 @@ mutex_init(mutex *ben, const char *name)
|
||||
inline status_t
|
||||
mutex_init_etc(mutex *ben, const char *name, int32 flags)
|
||||
{
|
||||
mutex_init(ben, name);
|
||||
return mutex_init(ben, name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -293,6 +293,7 @@ ControlPipe::ControlPipe(Object *parent)
|
||||
: Pipe(parent),
|
||||
fNotifySem(-1)
|
||||
{
|
||||
mutex_init(&fSendRequestLock, "control pipe send request");
|
||||
}
|
||||
|
||||
|
||||
@@ -300,6 +301,7 @@ ControlPipe::~ControlPipe()
|
||||
{
|
||||
if (fNotifySem >= 0)
|
||||
delete_sem(fNotifySem);
|
||||
mutex_destroy(&fSendRequestLock);
|
||||
}
|
||||
|
||||
|
||||
@@ -308,16 +310,24 @@ ControlPipe::SendRequest(uint8 requestType, uint8 request, uint16 value,
|
||||
uint16 index, uint16 length, void *data, size_t dataLength,
|
||||
size_t *actualLength)
|
||||
{
|
||||
status_t result = mutex_lock(&fSendRequestLock);
|
||||
if (result != B_OK)
|
||||
return result;
|
||||
|
||||
if (fNotifySem < 0) {
|
||||
fNotifySem = create_sem(0, "usb send request notify");
|
||||
if (fNotifySem < 0)
|
||||
if (fNotifySem < 0) {
|
||||
mutex_unlock(&fSendRequestLock);
|
||||
return B_NO_MORE_SEMS;
|
||||
}
|
||||
}
|
||||
|
||||
status_t result = QueueRequest(requestType, request, value, index, length,
|
||||
data, dataLength, SendRequestCallback, this);
|
||||
if (result < B_OK)
|
||||
result = QueueRequest(requestType, request, value, index, length, data,
|
||||
dataLength, SendRequestCallback, this);
|
||||
if (result < B_OK) {
|
||||
mutex_unlock(&fSendRequestLock);
|
||||
return result;
|
||||
}
|
||||
|
||||
// The sem will be released unconditionally in the callback after the
|
||||
// result data was filled in. Use a 1 second timeout for control transfers.
|
||||
@@ -334,12 +344,14 @@ ControlPipe::SendRequest(uint8 requestType, uint8 request, uint16 value,
|
||||
if (actualLength)
|
||||
*actualLength = 0;
|
||||
|
||||
mutex_unlock(&fSendRequestLock);
|
||||
return B_TIMED_OUT;
|
||||
}
|
||||
|
||||
if (actualLength)
|
||||
*actualLength = fActualLength;
|
||||
|
||||
mutex_unlock(&fSendRequestLock);
|
||||
return fTransferStatus;
|
||||
}
|
||||
|
||||
|
||||
@@ -334,6 +334,7 @@ static void SendRequestCallback(void *cookie,
|
||||
void *callbackCookie);
|
||||
|
||||
private:
|
||||
mutex fSendRequestLock;
|
||||
sem_id fNotifySem;
|
||||
status_t fTransferStatus;
|
||||
size_t fActualLength;
|
||||
|
||||
Reference in New Issue
Block a user