[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MiNT] tcp_select / sys_f_select

Hello to the list,

> It seems like the poll is returning to early, it returns when the
> socket is ready to be used for sending data ( from FreeMiNTs point of
> view) - but it is still not ready for reading, the recv() call is
> ending up with the ENOTCON error... but previous send() did not return
> that error!

OK, I found the problem. the whole thing can be fixed within tcp_ioctl
( I prefer that, because users don't have to update the kernel).
But probably it can also be fixed within sys_f_select, if it's OK to
change it's behavior. 

I'm writing all the things I found, although not everything is needed
to fix the problem:

1. sys_f_select looks for data even if device->select returned 0 
   is this correct behavior? This possible can be changed
   when the second (or was it the third?) for loop uses col_wfd,
col_rfd, col_xfd 
   instead of wfd,rfd... 
   wfd, rfd etc. contain the original descriptors that the user passed
to sys_f_select, col_wfd, etc contain 
   the descriptors which returned 1 during device->select. 

2. tcp_ioctl FIONWRITE returns space = UNLIMITED as default... is this
OK? wouldn't it be better to return 0 as default? 
   Anyway, for my situation it would be enough if states TCBS_SYNSENT,
TCBS_SYNRCVD return 0. 
   But then I would have to clear the socket error within curl before
calling poll, 
    because data->err is set and that also results in space =
UNLIMITED. (And because sys _f_select doesn't bother if 
   tcp_select returned 0, this means the socket is writable).

3. no need to change curl or sys_f_select when tcp_ioctl is altered
that way that it returns 0
   for the states TCBS_SYNSENT, TCBS_SYNRCVD AND if data->err == true. 

How would you decide? :)