ioctl() on socket fd's take 3 seconds on 1.7.7

Corinna Vinschen corinna-cygwin@cygwin.com
Mon Nov 22 13:17:00 GMT 2010


On Nov 20 18:25, Jason Curl wrote:
> On 15/11/2010 17:22, Corinna Vinschen wrote:
> >On Nov 9 09:20, Jason Curl wrote:
> >> 166 65418 [main] ipcheck 5580 ioctl: fd 3, cmd 80087364
> >>--- Process 5580, exception C0000005 at 610C8C86
> >
> >Crash in Cygwin, but the address doesn't help much, unfortunately.
> >
> >>Interestingly enough, the program works. That is, it finds all
> >>interfaces and returns correct values (except interface names are
> >>UUIDs instead of something more friendly like "eth0" that existed in
> >>1.5.26).
> >>
> >>It will be a little later when I'm able to generate a working test case.
> >
> >T'would be nice. Please make it short and simple and, if possible, in
> >plain C.
>> I've generated a relatively simple test case that I can compile
> using cygwin1-20101102.dll.

Thank you. I can't reproduce any slowness, each ioctl takes only a
couple of milliseconds. At least I could reproduce the exception when
stracing the testcase and I've applied a matching patch to Cygwin.
Can you retry with the next developer snapshot? Are the ioctl calls
still slow? If so, I'm wondering if the GetAdaptersAddresses call is
rather slow if a lot of interfaces exist. Every single ioctl in your
application calls GetAdaptersAddresses twice, like this:
bool
get_adapters_addresses (PIP_ADAPTER_ADDRESSES *pa_ret, ULONG family)
{
 DWORD ret, size = 0;
 PIP_ADAPTER_ADDRESSES pa0 = NULL;
 if (!pa_ret)
 return ERROR_BUFFER_OVERFLOW
 == GetAdaptersAddresses (family, GAA_FLAG_INCLUDE_PREFIX
 | GAA_FLAG_INCLUDE_ALL_INTERFACES,
 NULL, NULL, &size);
 do
 {
 ret = GetAdaptersAddresses (family, GAA_FLAG_INCLUDE_PREFIX
 | GAA_FLAG_INCLUDE_ALL_INTERFACES,
 NULL, pa0, &size);
 if (ret == ERROR_BUFFER_OVERFLOW
 && !(pa0 = (PIP_ADAPTER_ADDRESSES) realloc (pa0, size)))
 break;
 }
 while (ret == ERROR_BUFFER_OVERFLOW);
 if (ret != ERROR_SUCCESS)
 {
 if (pa0)
 free (pa0);
 *pa_ret = NULL;
 return false;
 }
 *pa_ret = pa0;
 return true;
}
Can you test how long this call takes in your scenario, and if it
might be the culprit?
Corinna
-- 
Corinna Vinschen Please, send mails regarding Cygwin to
Cygwin Project Co-Leader cygwin AT cygwin DOT com
Red Hat
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple


More information about the Cygwin mailing list

AltStyle によって変換されたページ (->オリジナル) /