From owner-freebsd-bugs Sun Feb 3 0:20: 8 2002 Delivered-To: freebsd-bugs@freebsd.org Received: from relay1.macomnet.ru (relay1.macomnet.ru [195.128.64.10]) by hub.freebsd.org (Postfix) with ESMTP id 34EB137B417; Sun, 3 Feb 2002 00:19:46 -0800 (PST) Received: from news1.macomnet.ru (news1.macomnet.ru [195.128.64.14]) by relay1.macomnet.ru (8.11.3/8.11.3) with ESMTP id g138JeO6485267; Sun, 3 Feb 2002 11:19:40 +0300 (MSK) Date: Sun, 3 Feb 2002 11:19:39 +0300 (MSK) From: Maxim Konovalov To: David Malone Cc: roam@FreeBSD.ORG, , Subject: Re: i386/34536: accept() blocks other threads In-Reply-To: <20020203011345.G59736-100000@news1.macomnet.ru> Message-ID: <20020203110107.P50975-100000@news1.macomnet.ru> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org By the way, I cannot reproduce the problem. I tried on -current and old 4.3 a code below, it works as expected: /* This is just a test program * Compile: * cc -o thread thread.c -pthread * Test: * ./thread 90 * telnet localhost 90 */ #include #include #include #include #include #include #include #include #include void * bg(void *a) { for (;;) { printf("+"); fflush(NULL); sleep(1); } } void * srv(void *arg) { char buff[100]; printf("Begin to read\n"); count=read((int)arg, buff, 10); close((int)arg); printf("Begin to exit\n"); } main(int argc, char *argv[]){ int sock, newsock, length, port,pid, i; struct sockaddr_in addr, daddr; pthread_t ptid; pthread_attr_t tattr; if(argc==1) { printf("Usage:\n %s Port\n", argv[0]); exit(1); } port=atoi(argv[1]); if(port==0){ printf("Illegal Port:%s\n", argv[1]); exit(1); } sock=socket(AF_INET, SOCK_STREAM,0); if(sock < 0){ perror("Opening stream socket"); exit(1); } bzero(&addr, sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(port); if(bind(sock, (struct sockaddr *)&addr, sizeof addr) == -1){ perror("Binding stream socket"); exit(1); }; bzero(&addr, sizeof(addr)); i = sizeof(addr); if(getsockname(sock, (struct sockaddr *)&addr, &i) < 0){ perror("getsockname"); exit(1); } if(listen(sock, 5) == -1){ perror("Listening stream socket"); exit(1); }; pthread_attr_init(&tattr); pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); pthread_attr_setscope(&tattr, PTHREAD_SCOPE_SYSTEM); pthread_create(&ptid, NULL, bg, NULL); while((newsock=accept(sock, (struct sockaddr *)&daddr, (length=sizeof daddr, &length))) != -1){ printf("Main Thread is going to start a new thread\n"); if(pthread_create(&ptid, &tattr, srv, (void *)newsock)){ printf("pthread_create() failed\n"); close(newsock); } } /* never reached */ close(sock); } Here is an output: [maxim@try maxim]$ ./thread 2000 +++++Main Thread is going to start a new thread Begin to read +++Main Thread is going to start a new thread Begin to read +++Begin to exit +++Begin to exit +^C [maxim@try maxim]$ So all four threads are sheduled. I guess there may by libc/libc_r interoperability somewhere. -- Maxim Konovalov, MAcomnet, Internet-Intranet Dept., system engineer phone: +7 (095) 796-9079, mailto: maxim@macomnet.ru To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message