I may have found a potential bug in
packages/net/bsd_tcpip/current/src/sys/kern/uipc_socket.c (or I may be
completely wrong :-).
At the end of sodealloc(), the following code exists:
zfreei(so->so_zone, so);
wakeup(so->so_zone);
The problem is that zfreei() changes so->so_zone. Shouldn't wakeup() be
done on the original so->so_zone? I only noticed this problem by:
1- while(1) {
sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
connect( sock, ... );
close( sock );
}
Eventually this pauses in socket() (in cyg_tsleep()) when you run out
of eCos sockets.
2- After 2*MSL or so, cyg_wakeup() gets called with chan == 0x0. Why?
The zfreei() call in sodealloc() changes so->so_zone to 0 before the
wakeup() call.