Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Apr 1998 22:48:58 +0400
From:      =?koi8-r?B?4c7E0sXKIP7F0s7P1w==?= <ache@nagual.pp.ru>
To:        Poul-Henning Kamp <phk@critter.freebsd.dk>, "Alok K. Dhir" <adhir@worldbank.org>, current@FreeBSD.ORG, adkin003@tc.umn.edu
Subject:   Working patch *with* splhigh() (Was Re: More info RE: X slowdown in -current)
Message-ID:  <19980403224858.27971@nagual.pp.ru>
In-Reply-To: <19980403222540.64574@nagual.pp.ru>; from ache@nagual.pp.ru on Fri, Apr 03, 1998 at 10:25:40PM %2B0400
References:  <19980403214836.43861@nagual.pp.ru> <2814.891626804@critter.freebsd.dk> <19980403222540.64574@nagual.pp.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
Well, here is working patch *WITH* splhigh(), since no errors here,
it even can be commited until real solution found. So I take out my
splhigh() claims.

*** sys_generic.c.orig	Thu Apr  2 11:22:17 1998
--- sys_generic.c	Fri Apr  3 22:31:09 1998
***************
*** 538,545 ****
  	 */
  	fd_mask s_selbits[howmany(2048, NFDBITS)];
  	fd_mask *ibits[3], *obits[3], *selbits, *sbp;
! 	struct timeval atv;
! 	int s, ncoll, error, timo, term;
  	u_int nbufbytes, ncpbytes, nfdbits;
  
  	if (uap->nd < 0)
--- 538,545 ----
  	 */
  	fd_mask s_selbits[howmany(2048, NFDBITS)];
  	fd_mask *ibits[3], *obits[3], *selbits, *sbp;
! 	struct timeval atv, ctv;
! 	int s, ncoll, error, timo;
  	u_int nbufbytes, ncpbytes, nfdbits;
  
  	if (uap->nd < 0)
***************
*** 600,620 ****
  			error = EINVAL;
  			goto done;
  		}
! 		term = ticks + tvtohz(&atv);
  	} else
! 		term = 0;
  retry:
  	ncoll = nselcoll;
  	p->p_flag |= P_SELECT;
  	error = selscan(p, ibits, obits, uap->nd);
  	if (error || p->p_retval[0])
  		goto done;
! 	s = splhigh();
! 	if (term && term <= ticks) {
! 		splx(s);
  		goto done;
  	}
! 	timo = term ? term - ticks : 0;
  	if ((p->p_flag & P_SELECT) == 0 || nselcoll != ncoll) {
  		splx(s);
  		goto retry;
--- 600,623 ----
  			error = EINVAL;
  			goto done;
  		}
! 		getmicrotime(&ctv);
! 		timevaladd(&atv, &ctv);
! 		timo = hzto(&atv);
  	} else
! 		timo = 0;
  retry:
  	ncoll = nselcoll;
  	p->p_flag |= P_SELECT;
  	error = selscan(p, ibits, obits, uap->nd);
  	if (error || p->p_retval[0])
  		goto done;
! 	getmicrotime(&ctv);
! 	/* this should be timercmp(&time, &atv, >=) */
! 	if (uap->tv && (ctv.tv_sec > atv.tv_sec ||
! 	    (ctv.tv_sec == atv.tv_sec && ctv.tv_usec >= atv.tv_usec))) {
  		goto done;
  	}
! 	s = splhigh();
  	if ((p->p_flag & P_SELECT) == 0 || nselcoll != ncoll) {
  		splx(s);
  		goto retry;
***************
*** 701,708 ****
  {
  	caddr_t bits;
  	char smallbits[32 * sizeof(struct pollfd)];
! 	struct timeval atv;
! 	int s, ncoll, error = 0, timo, term;
  	size_t ni;
  
  	if (SCARG(uap, nfds) > p->p_fd->fd_nfiles) {
--- 704,711 ----
  {
  	caddr_t bits;
  	char smallbits[32 * sizeof(struct pollfd)];
! 	struct timeval atv, ctv;
! 	int s, ncoll, error = 0, timo;
  	size_t ni;
  
  	if (SCARG(uap, nfds) > p->p_fd->fd_nfiles) {
***************
*** 724,744 ****
  			error = EINVAL;
  			goto done;
  		}
! 		term = ticks + tvtohz(&atv);
  	} else
! 		term = 0;
  retry:
  	ncoll = nselcoll;
  	p->p_flag |= P_SELECT;
  	error = pollscan(p, (struct pollfd *)bits, SCARG(uap, nfds));
  	if (error || p->p_retval[0])
  		goto done;
! 	s = splhigh(); 
! 	if (term && term <= ticks) {
! 		splx(s);
  		goto done;
! 	}
! 	timo = term ? term - ticks : 0;
  	if ((p->p_flag & P_SELECT) == 0 || nselcoll != ncoll) {
  		splx(s);
  		goto retry;
--- 727,747 ----
  			error = EINVAL;
  			goto done;
  		}
! 		getmicrotime(&ctv);
! 		timevaladd(&atv, &ctv);
! 		timo = hzto(&atv);
  	} else
! 		timo = 0;
  retry:
  	ncoll = nselcoll;
  	p->p_flag |= P_SELECT;
  	error = pollscan(p, (struct pollfd *)bits, SCARG(uap, nfds));
  	if (error || p->p_retval[0])
  		goto done;
! 	getmicrotime(&ctv);
! 	if (timo && timercmp(&ctv, &atv, >=))
  		goto done;
! 	s = splhigh();
  	if ((p->p_flag & P_SELECT) == 0 || nselcoll != ncoll) {
  		splx(s);
  		goto retry;



-- 
Andrey A. Chernov
http://www.nagual.pp.ru/~ache/
MTH/SH/HE S-- W-- N+ PEC>+ D A a++ C G>+ QH+(++) 666+>++ Y

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



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