I am not aware that async socket events could be lost. On the other hand, I would not be surprised as the mechanism in both Windows and in j.exe is messy and non-trivial. I am loath to open the j.exe can of worms by releasing the source.
Is there any chance that a timer event running every few seconds to run socket_handler would be an adequate/acceptable workaround? On Sat, Mar 3, 2012 at 4:47 PM, Henry Rich <henryhr...@nc.rr.com> wrote: > I have a file server written in J6.02. It works most of the time - for > thousands of transactions - and then locks up. I have tracked it down > to a missing event. At the point of failure: > > there is one socket, and that is the socket I am listening on. It is > marked asynchronous; > > the socket shows up as readable in sdselect'' (indicating pending > connection); > > if I issue socket_handler '' from the keybosrd the system will start > up again and run fine. > > > Apparently an FD_ACCEPT event has been lost. > > > > At this point I will have to build a large load-generating setup to > create enough traffic to fail. I would prefer to troubleshoot this from > the source code, so I am asking for someone with access to the source > for 6.02 j.exe to send me the relevant modules for inspection, or to see > if they can find a problem in the area. (My understanding is that the > source for this bit is not open-source). > > > > Below is the relevant part of my socket system. I'm including it just > to show that what I'm doing is simple and robust. The listening socket > is handled in the last 2 lines of socket_handler, which calls the recv > verb to do the accept. When the system is locked up, socklist has one > atom, as does sockobj (and they are correct - remember, a manual call to > socket_handler gets things moving again) > > socket_handler =: 3 : 0 > NB. Look for a writable socket with space > if. #wsocklist do. > 'v r w e' =. sdselect_jsocket_ ($0);wsocklist;($0);0 > done =. $0 > for_l. sockobj {~ socklist i. w do. done =. done , 0 = send__l '' end. > wsocklist =: wsocklist -. done # w > end. > 'v r w e' =. sdselect_jsocket_ socklist;($0);($0);0 > for_l. sockobj {~ socklist i. r do. recv__l '' end. > ) > > recv =: 3 : 0 > NB. sock is the socket number for the object > if. 0 = 0 {:: 'r c' =. sdaccept_jsocket_ sock do. > NB. this part configures the clone socket, not part of the problem > if. #callback do. cloneinfo =: cloneinfo callback~ c end. > o =. conew > {. cloneinfo > c create__o }. cloneinfo > end. > '' > ) > > > Henry Rich > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm