Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Feb 2002 06:20:03 -0800 (PST)
From:      Maxim Konovalov <maxim@freebsd.org>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: i386/34536: accept() blocks other threads
Message-ID:  <200202131420.g1DEK3988616@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/34536; it has been noted by GNATS.

From: Maxim Konovalov <maxim@freebsd.org>
To: David Malone <dwmalone@maths.tcd.ie>
Cc: roam@freebsd.org, <yxpan@yahoo.com>,
	<freebsd-gnats-submit@freebsd.org>
Subject: Re: i386/34536: accept() blocks other threads
Date: Wed, 13 Feb 2002 17:11:07 +0300 (MSK)

 Hello,
 
 I have finally realized where the problem is. It comes from
 libc_r/uthread/uthread_exit.c:
 
         /*
          * Enter a loop to set all file descriptors to blocking
          * if they were not created as non-blocking:
          */
         for (i = 0; i < _thread_dtablesize; i++) {
                 /* Check if this file descriptor is in use: */
                 if (_thread_fd_table[i] != NULL &&
                         !(_thread_fd_table[i]->flags & O_NONBLOCK)) {
                         /* Get the current flags: */
                         flags = _thread_sys_fcntl(i, F_GETFL, NULL);
                         /* Clear the nonblocking file descriptor flag: */
                         _thread_sys_fcntl(i, F_SETFL, flags & ~O_NONBLOCK);
                 }
         }
 
 The parent calls exit(2) and changes flags of all open descriptors to
 ~O_NONBLOCK so the child gets a blocking socket and just blocks on
 accept(2).
 
 I made a patch but I am not sure at all is it correct or not. Btw,
 who is our libc_r guru I can ask for review? At the moment I have no
 clue why we should restore files flags at exit(2).
 
 Index: libc_r/uthread/uthread_exit.c
 ===================================================================
 RCS file: /home/ncvs/src/lib/libc_r/uthread/uthread_exit.c,v
 retrieving revision 1.24
 diff -u -r1.24 uthread_exit.c
 --- libc_r/uthread/uthread_exit.c	2001/11/17 14:28:39	1.24
 +++ libc_r/uthread/uthread_exit.c	2002/02/13 13:56:16
 @@ -66,6 +66,7 @@
  	 * Enter a loop to set all file descriptors to blocking
  	 * if they were not created as non-blocking:
  	 */
 +#ifdef 0
  	for (i = 0; i < _thread_dtablesize; i++) {
  		/* Check if this file descriptor is in use: */
  		if (_thread_fd_table[i] != NULL &&
 @@ -76,6 +77,7 @@
  			__sys_fcntl(i, F_SETFL, flags & ~O_NONBLOCK);
  		}
  	}
 +#endif
 
  	/* Call the _exit syscall: */
  	__sys_exit(status);
 
 -- 
 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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200202131420.g1DEK3988616>