[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