В Вс, 19/06/2022 в 14:40 +0300, andrey100100...@gmail.com пишет: > В Вс, 19/06/2022 в 10:32 +0000, adr пишет: > > On Sun, 19 Jun 2022, andrey100100...@gmail.com wrote: > > > No way. All processes must run simultaneously. > > > NFN limit cannot be bypassed. > > > > Yeah, that's why I said it was silly: > > > > > The solution is obvious, cancel the process' handlers before > > > > > it > > > > > exits so we don't run out of space. > > > > > > > > This was really silly... > > > > The changes I'm testing are not for evading the limit, but for > > making the handler managment more efficient and specially to avoid > > the case when a process could remove another process' handler from > > onnote[]. > > Ok. > > > More complete example with thread library: > > ------------------------------------------------------------- > #include <u.h> > #include <libc.h> > #include <thread.h> > > static int > handler_alarm(void *, char *msg) > { > if(strstr(msg, "alarm")){ > return 1; > } > > return 0; > } > > static void > proc_func(void *c) > { > Channel *chan = c; > > int fd, resp_len; > char req[] = "request"; > char resp[512], *r = nil; > > if(threadnotify(handler_alarm, 1) == 0){ > fprint(1, "handler not registred\n"); > } > > alarm(2000); > if((fd = dial("udp!185.157.221.201!5678", nil, nil, nil)) >= > 0){ > alarm(0); > alarm(2000); > if(write(fd, req, strlen(req)) == strlen(req)){ > alarm(0); > alarm(2000); > if((resp_len = read(fd, resp, sizeof(resp))) > 0){ > alarm(0); > if((r = malloc(sizeof(resp))) == > nil){ > sysfatal("malloc error: %r"); > } > memmove(r, resp, sizeof(resp)); > } > } > close(fd); > } >
+ alarm(0); > send(chan, r); > threadexits(nil); > } > > int mainstacksize = 5242880; > > void > threadmain(int argc, char *argv[]) > { > Channel *chan = nil; > char *data = nil; > int nproc = 0; > > ARGBEGIN{ > case 'n': > nproc = atoi(EARGF(threadexitsall(nil))); > break; > default: > threadexitsall(nil); > }ARGEND; > > if((chan = chancreate(sizeof(char *), 0)) == nil){ > sysfatal("channel error: %r"); > } > > for(int i = 0; i < nproc; i++){ > proccreate(proc_func, chan, 10240); > } > > for(int i = 0; i < nproc; i++){ > if(data = recvp(chan)){ > free(data); > } > } > > if(nproc) > fprint(1, "EXIT with nproc: %d\n", nproc); > > threadexitsall(nil); > } > ------------------------------------------------------------- > > cpu% 6.out -n 33 > EXIT with nproc: 33 > > with 34: > > cpu% 6.out -n 34 > handler not registred > > and stalled. > > > So it is important for me that all processes respond. > Such use, it seems to me, simplifies the program. > > Regards, Andrej ------------------------------------------ 9fans: 9fans Permalink: https://9fans.topicbox.com/groups/9fans/Tfa6823048ad90a21-M1bf9fc766759c5c66a48278e Delivery options: https://9fans.topicbox.com/groups/9fans/subscription