[ros-dev] Re: [ros-diffs] [ekohl] 13825: Fix calls to ReadFile and
WriteFile for asynchronous I/O.
Hartmut Birr
hartmut.birr at gmx.de
Sun Mar 6 21:08:21 CET 2005
Hi,
you should send this mail to the Ros-Dev list because some people with a
deal-up connection dosn't read the Ros-Diffs list.
- Hartmut
Gunnar Dalsnes schrieb:
> Eric: Ping?
>
> Gunnar Dalsnes wrote:
>
>> From MSDN OVERLAPPED: "Functions such as WriteFile set the event to
>> the nonsignaled state before they begin an I/O operation"
>>
>> So the ResetEvent additions are meaningless... Why did you add them?
>>
>> Gunnar
>>
>> ekohl at svn.reactos.com wrote:
>>
>>> Fix calls to ReadFile and WriteFile for asynchronous I/O.
>>>
>>> Modified: trunk/reactos/lib/rpcrt4/rpc_message.c
>>>
>>> ------------------------------------------------------------------------
>>>
>>> *Modified: trunk/reactos/lib/rpcrt4/rpc_message.c*
>>>
>>> --- trunk/reactos/lib/rpcrt4/rpc_message.c 2005-03-05 11:27:15
>>> UTC (rev 13824)
>>> +++ trunk/reactos/lib/rpcrt4/rpc_message.c 2005-03-05 11:38:48
>>> UTC (rev 13825)
>>> @@ -265,10 +265,15 @@
>>>
>>> }
>>>
>>> /* transmit packet header */
>>>
>>> - if (!WriteFile(Connection->conn, Header, hdr_size, &count,
>>> NULL)) {
>>>
>>> + ResetEvent(Connection->ovl.hEvent);
>>> + if (!WriteFile(Connection->conn, Header, hdr_size, &count,
>>> &Connection->ovl)) {
>>>
>>> WARN("WriteFile failed with error %ld\n", GetLastError());
>>> return GetLastError();
>>> }
>>>
>>> + if (!GetOverlappedResult(Connection->conn, &Connection->ovl,
>>> &count, TRUE)) {
>>> + WARN("GetOverlappedResult failed with error %ld\n",
>>> GetLastError());
>>> + return GetLastError();
>>> + }
>>>
>>>
>>> /* fragment consisted of header only and is the last one */
>>> if (hdr_size == Header->common.frag_len &&
>>> @@ -277,10 +282,15 @@
>>>
>>> }
>>>
>>> /* send the fragment data */
>>>
>>> - if (!WriteFile(Connection->conn, buffer_pos,
>>> Header->common.frag_len - hdr_size, &count, NULL)) {
>>>
>>> + ResetEvent(Connection->ovl.hEvent);
>>> + if (!WriteFile(Connection->conn, buffer_pos,
>>> Header->common.frag_len - hdr_size, &count, &Connection->ovl)) {
>>>
>>> WARN("WriteFile failed with error %ld\n", GetLastError());
>>> return GetLastError();
>>> }
>>>
>>> + if (!GetOverlappedResult(Connection->conn, &Connection->ovl,
>>> &count, TRUE)) {
>>> + WARN("GetOverlappedResult failed with error %ld\n",
>>> GetLastError());
>>> + return GetLastError();
>>> + }
>>>
>>>
>>> Header->common.flags &= ~RPC_FLG_FIRST;
>>> }
>>> @@ -309,9 +319,15 @@
>>>
>>> TRACE("(%p, %p, %p)\n", Connection, Header, pMsg);
>>>
>>> /* read packet common header */
>>>
>>> - if (!ReadFile(Connection->conn, &common_hdr, sizeof(common_hdr),
>>> &dwRead, NULL)) {
>>>
>>> + ResetEvent(Connection->ovl.hEvent);
>>> + if (!ReadFile(Connection->conn, &common_hdr, sizeof(common_hdr),
>>> &dwRead, &Connection->ovl)) {
>>> + WARN("ReadFile failed with error %ld\n", GetLastError());
>>> + status = RPC_S_PROTOCOL_ERROR;
>>> + goto fail;
>>> + }
>>> + if (!GetOverlappedResult(Connection->conn, &Connection->ovl,
>>> &dwRead, TRUE)) {
>>>
>>> if (GetLastError() != ERROR_MORE_DATA) {
>>>
>>> - WARN("ReadFile failed with error %ld\n", GetLastError());
>>>
>>> + WARN("GetOverlappedResult failed with error %ld\n",
>>> GetLastError());
>>>
>>> status = RPC_S_PROTOCOL_ERROR;
>>> goto fail;
>>> }
>>> @@ -339,10 +355,16 @@
>>>
>>> memcpy(*Header, &common_hdr, sizeof(common_hdr));
>>>
>>> /* read the rest of packet header */
>>>
>>> + ResetEvent(Connection->ovl.hEvent);
>>>
>>> if (!ReadFile(Connection->conn, &(*Header)->common + 1,
>>>
>>> - hdr_length - sizeof(common_hdr), &dwRead, NULL)) {
>>>
>>> + hdr_length - sizeof(common_hdr), &dwRead,
>>> &Connection->ovl)) {
>>> + WARN("ReadFile failed with error %ld\n", GetLastError());
>>> + status = RPC_S_PROTOCOL_ERROR;
>>> + goto fail;
>>> + }
>>> + if (!GetOverlappedResult(Connection->conn, &Connection->ovl,
>>> &dwRead, TRUE)) {
>>>
>>> if (GetLastError() != ERROR_MORE_DATA) {
>>>
>>> - WARN("ReadFile failed with error %ld\n", GetLastError());
>>>
>>> + WARN("GetOverlappedResult failed with error %ld\n",
>>> GetLastError());
>>>
>>> status = RPC_S_PROTOCOL_ERROR;
>>> goto fail;
>>> }
>>> @@ -352,6 +374,7 @@
>>>
>>> goto fail;
>>> }
>>>
>>>
>>> +
>>>
>>> /* read packet body */
>>> switch (common_hdr.ptype) {
>>> case PKT_RESPONSE:
>>> @@ -379,13 +402,20 @@
>>>
>>> goto fail;
>>> }
>>>
>>>
>>> - if (data_length == 0) dwRead = 0; else
>>> - if (!ReadFile(Connection->conn, buffer_ptr, data_length,
>>> &dwRead, NULL)) {
>>> - if (GetLastError() != ERROR_MORE_DATA) {
>>>
>>> + if (data_length == 0) dwRead = 0; else {
>>> + ResetEvent(Connection->ovl.hEvent);
>>> + if (!ReadFile(Connection->conn, buffer_ptr, data_length,
>>> &dwRead, &Connection->ovl)) {
>>>
>>> WARN("ReadFile failed with error %ld\n", GetLastError());
>>> status = RPC_S_PROTOCOL_ERROR;
>>> goto fail;
>>> }
>>>
>>> + if (!GetOverlappedResult(Connection->conn, &Connection->ovl,
>>> &dwRead, TRUE)) {
>>> + if (GetLastError() != ERROR_MORE_DATA) {
>>> + WARN("GetOverlappedResult failed with error %ld\n",
>>> GetLastError());
>>> + status = RPC_S_PROTOCOL_ERROR;
>>> + goto fail;
>>> + }
>>> + }
>>>
>>> }
>>> if (dwRead != data_length) {
>>> status = RPC_S_PROTOCOL_ERROR;
>>> @@ -403,10 +433,16 @@
>>>
>>> TRACE("next header\n");
>>>
>>> /* read the header of next packet */
>>>
>>> - if (!ReadFile(Connection->conn, *Header, hdr_length, &dwRead,
>>> NULL)) {
>>>
>>> + ResetEvent(Connection->ovl.hEvent);
>>> + if (!ReadFile(Connection->conn, *Header, hdr_length, &dwRead,
>>> &Connection->ovl)) {
>>> + WARN("ReadFile failed with error %ld\n", GetLastError());
>>> + status = GetLastError();
>>> + goto fail;
>>> + }
>>> + if (!GetOverlappedResult(Connection->conn, &Connection->ovl,
>>> &dwRead, TRUE)) {
>>>
>>> if (GetLastError() != ERROR_MORE_DATA) {
>>>
>>> - WARN("ReadFile failed with error %ld\n", GetLastError());
>>> - status = GetLastError();
>>>
>>> + WARN("GetOverlappedResult failed with error %ld\n",
>>> GetLastError());
>>> + status = RPC_S_PROTOCOL_ERROR;
>>>
>>> goto fail;
>>> }
>>> }
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>>
More information about the Ros-dev
mailing list