From owner-freebsd-current@FreeBSD.ORG Wed Jul 21 08:13:13 2004 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6540716A4CE for ; Wed, 21 Jul 2004 08:13:13 +0000 (GMT) Received: from freebsd3.cimlogic.com.au (adsl-20-121.swiftdsl.com.au [218.214.20.121]) by mx1.FreeBSD.org (Postfix) with ESMTP id 932FF43D2D for ; Wed, 21 Jul 2004 08:13:12 +0000 (GMT) (envelope-from jb@cimlogic.com.au) Received: by freebsd3.cimlogic.com.au (Postfix, from userid 102) id 110256AC0E; Wed, 21 Jul 2004 18:13:11 +1000 (EST) Date: Wed, 21 Jul 2004 18:13:10 +1000 From: John Birrell To: current@freebsd.org Message-ID: <20040721081310.GJ22160@freebsd3.cimlogic.com.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.1i Subject: nanosleep returning early X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Jul 2004 08:13:13 -0000 Today I increased HZ in a current kernel to 1000 when adding dummynet. Now I find that nanosleep regularly comes back a little early. Can anyone explain why? I would have expected that the *overrun* beyond the required time to vary, but never that it would come back early. ------------------ #include #include #include #include int main(int argc,char *argv[]) { struct timespec rmt; struct timespec rqt; struct timeval abstime; struct timeval curtime; gettimeofday(&curtime,NULL); rqt.tv_sec = 5; rqt.tv_nsec = 50000000; abstime.tv_sec = curtime.tv_sec + rqt.tv_sec; abstime.tv_usec = curtime.tv_usec + rqt.tv_nsec / 1000; if (abstime.tv_usec >= 1000000) { abstime.tv_sec += 1; abstime.tv_usec -= 1000000; } printf("curtime %ld.%06ld\n",curtime.tv_sec,curtime.tv_usec); printf("rqt %ld.%09ld\n",(long) rqt.tv_sec,rqt.tv_nsec); if (nanosleep(&rqt,&rmt) != 0) { } else if (gettimeofday(&curtime,NULL) != 0) { } else if (curtime.tv_sec < abstime.tv_sec || (curtime.tv_sec == abstime.tv_sec && curtime.tv_usec < abstime.tv_usec)) { printf("Early: curtime %ld.%06ld abstime %ld.%06ld\n",curtime.tv_sec,curtime.tv_usec,abstime.tv_sec,abstime.tv_usec); } return(0); } ------------------ -- John Birrell