Clone
ixen <ixen@copyhandler.com>
committed
on 28 Oct 16
Decoupled overlapped completion functions from ReaderWriter object. Added notifications to ordered buffer to support correct linking between… Show more
Decoupled overlapped completion functions from ReaderWriter object. Added notifications to ordered buffer to support correct linking between reader and writer. Various other cleanups. (CH-270)

Show less

ParallelizeReaderWriter + 4 more
src/libchcore/OverlappedCallbacks.cpp (+4 -4)
11 11 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 12 //  GNU General Public License for more details.
13 13 //
14 14 //  You should have received a copy of the GNU Library General Public
15 15 //  License along with this program; if not, write to the
16 16 //  Free Software Foundation, Inc.,
17 17 //  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 18 // ============================================================================
19 19 #include "stdafx.h"
20 20 #include "OverlappedCallbacks.h"
21 21 #include "TOverlappedDataBuffer.h"
22 22 #include "TOverlappedReaderWriter.h"
23 23
24 24 #define STATUS_END_OF_FILE 0xc0000011
25 25
26 26 namespace chcore
27 27 {
28 28         VOID CALLBACK OverlappedReadCompleted(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)
29 29         {
30 30                 TOverlappedDataBuffer* pBuffer = (TOverlappedDataBuffer*)lpOverlapped;
31                   TOverlappedReaderWriter* pQueue = (TOverlappedReaderWriter*)pBuffer->GetParam();
  31                 TOverlappedReader* pQueue = (TOverlappedReader*)pBuffer->GetParam();
32 32
33 33                 // determine if this is the last packet
34 34                 bool bEof = (dwErrorCode == ERROR_HANDLE_EOF ||
35 35                         pBuffer->GetStatusCode() == STATUS_END_OF_FILE ||
36 36                         (dwErrorCode == ERROR_SUCCESS && dwNumberOfBytesTransfered != pBuffer->GetRequestedDataSize()));
37 37
38 38                 // reset status code and error code if they pointed out to EOF
39 39                 if(pBuffer->GetStatusCode() == STATUS_END_OF_FILE)
40 40                         pBuffer->SetStatusCode(0);
41 41
42 42                 pBuffer->SetErrorCode(dwErrorCode == ERROR_HANDLE_EOF ? ERROR_SUCCESS : dwErrorCode);
43 43
44 44                 pBuffer->SetRealDataSize(dwNumberOfBytesTransfered);
45 45                 pBuffer->SetLastPart(bEof);
46 46                 // NOTE: updating the bytes transferred as system does not update lpOverlapped with correct value
47 47                 // in case of error (e.g end-of-file error triggers the difference and dwNumberOfBytesTransfered contains more up-to-date information)
48 48                 pBuffer->SetBytesTransferred(dwNumberOfBytesTransfered);
49 49
50 50                 if (pBuffer->HasError())
51 51                         pQueue->AddFailedReadBuffer(pBuffer);
52 52                 else
53                           pQueue->AddFinishedReadBuffer(pBuffer);
  53                         pQueue->AddFullBuffer(pBuffer);
54 54         }
55 55
56 56         VOID CALLBACK OverlappedWriteCompleted(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)
57 57         {
58 58                 TOverlappedDataBuffer* pBuffer = (TOverlappedDataBuffer*)lpOverlapped;
59                   TOverlappedReaderWriter* pQueue = (TOverlappedReaderWriter*)pBuffer->GetParam();
  59                 TOverlappedWriter* pQueue = (TOverlappedWriter*)pBuffer->GetParam();
60 60
61 61                 pBuffer->SetErrorCode(dwErrorCode);
62 62                 pBuffer->SetBytesTransferred(dwNumberOfBytesTransfered);
63 63
64 64                 if (pBuffer->HasError())
65 65                         pQueue->AddFailedWriteBuffer(pBuffer);
66 66                 else
67                           pQueue->AddFinishedWriteBuffer(pBuffer);
  67                         pQueue->AddFinishedBuffer(pBuffer);
68 68         }
69 69 }