1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Async reading fixes

This commit is contained in:
Brian Fiete 2025-04-05 14:26:03 -04:00
parent 412729e536
commit d542f9a34b

View file

@ -692,23 +692,34 @@ struct BfOverlappedReleaser
{ {
BfpAsyncData* mAsyncData; BfpAsyncData* mAsyncData;
OverlappedReadResult* mOverlapped; OverlappedReadResult* mOverlapped;
bool mProducerFree;
bool mConsumerFree;
BfOverlappedReleaser() BfOverlappedReleaser()
{ {
mAsyncData = NULL; mAsyncData = NULL;
mOverlapped = NULL; mOverlapped = NULL;
mProducerFree = true;
mConsumerFree = true;
} }
BfOverlappedReleaser(BfpAsyncData* asyncData, OverlappedReadResult* overlapped) BfOverlappedReleaser(BfpAsyncData* asyncData, OverlappedReadResult* overlapped)
{ {
mAsyncData = asyncData; mAsyncData = asyncData;
mOverlapped = overlapped; mOverlapped = overlapped;
mProducerFree = true;
mConsumerFree = true;
} }
~BfOverlappedReleaser() ~BfOverlappedReleaser()
{ {
if (mOverlapped != NULL) if (mOverlapped != NULL)
{
if (mProducerFree)
mAsyncData->Release(mOverlapped); mAsyncData->Release(mOverlapped);
if (mConsumerFree)
mAsyncData->Release(mOverlapped);
}
} }
}; };
@ -3322,6 +3333,16 @@ BFP_EXPORT intptr BFP_CALLTYPE BfpFile_Read(BfpFile* file, void* buffer, intptr
} }
} }
if (file->mAsyncData != NULL)
{
int readSize = file->mAsyncData->ReadQueued(buffer, (int)size);
if (readSize > 0)
{
OUTRESULT(BfpFileResult_Ok);
return readSize;
}
}
if ((timeoutMS != -1) && (!forceNormalRead)) if ((timeoutMS != -1) && (!forceNormalRead))
{ {
if (file->mAsyncData == NULL) if (file->mAsyncData == NULL)
@ -3332,13 +3353,6 @@ BFP_EXPORT intptr BFP_CALLTYPE BfpFile_Read(BfpFile* file, void* buffer, intptr
while (true) while (true)
{ {
int readSize = file->mAsyncData->ReadQueued(buffer, (int)size);
if (readSize > 0)
{
OUTRESULT(BfpFileResult_Ok);
return readSize;
}
OverlappedReadResult* overlapped = file->mAsyncData->AllocBuffer((int)size); OverlappedReadResult* overlapped = file->mAsyncData->AllocBuffer((int)size);
overlapped->mFile = file; overlapped->mFile = file;
@ -3347,11 +3361,12 @@ BFP_EXPORT intptr BFP_CALLTYPE BfpFile_Read(BfpFile* file, void* buffer, intptr
//TODO: this doesn't set file stream location. It only works for streams like pipes, sockets, etc //TODO: this doesn't set file stream location. It only works for streams like pipes, sockets, etc
if (::ReadFileEx(file->mHandle, overlapped->GetPtr(), (uint32)size, overlapped, OverlappedReadComplete)) if (::ReadFileEx(file->mHandle, overlapped->GetPtr(), (uint32)size, overlapped, OverlappedReadComplete))
{ {
overlappedReleaser.mProducerFree = false;
file->mAsyncData->WaitAndResetEvent(timeoutMS); file->mAsyncData->WaitAndResetEvent(timeoutMS);
DWORD errorCode = 0; DWORD errorCode = 0;
int readResult = file->mAsyncData->FinishRead(overlapped, buffer, (int)size, errorCode); int readResult = file->mAsyncData->FinishRead(overlapped, buffer, (int)size, errorCode);
overlappedReleaser.mOverlapped = NULL; overlappedReleaser.mConsumerFree = false;
if (readResult != -2) if (readResult != -2)
{ {
if (errorCode == 0) if (errorCode == 0)
@ -3382,6 +3397,8 @@ BFP_EXPORT intptr BFP_CALLTYPE BfpFile_Read(BfpFile* file, void* buffer, intptr
} }
else else
{ {
overlapped->mData.Clear();
int lastError = ::GetLastError(); int lastError = ::GetLastError();
if (lastError == ERROR_PIPE_LISTENING) if (lastError == ERROR_PIPE_LISTENING)
{ {