mirror of
				https://git.proxmox.com/git/grub2
				synced 2025-10-31 17:40:15 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Pausing execution of the current thread.
 | |
|    Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc.
 | |
|    Written by Bruno Haible <bruno@clisp.org>, 2007.
 | |
| 
 | |
|    This program is free software: you can redistribute it and/or modify
 | |
|    it under the terms of the GNU General Public License as published by
 | |
|    the Free Software Foundation; either version 3 of the License, or
 | |
|    (at your option) any later version.
 | |
| 
 | |
|    This program is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|    GNU General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 | |
| 
 | |
| #include <config.h>
 | |
| 
 | |
| /* Specification.  */
 | |
| #include <unistd.h>
 | |
| 
 | |
| #include <limits.h>
 | |
| 
 | |
| #include "verify.h"
 | |
| 
 | |
| #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
 | |
| 
 | |
| # define WIN32_LEAN_AND_MEAN  /* avoid including junk */
 | |
| # include <windows.h>
 | |
| 
 | |
| unsigned int
 | |
| sleep (unsigned int seconds)
 | |
| {
 | |
|   unsigned int remaining;
 | |
| 
 | |
|   /* Sleep for 1 second many times, because
 | |
|        1. Sleep is not interruptible by Ctrl-C,
 | |
|        2. we want to avoid arithmetic overflow while multiplying with 1000.  */
 | |
|   for (remaining = seconds; remaining > 0; remaining--)
 | |
|     Sleep (1000);
 | |
| 
 | |
|   return remaining;
 | |
| }
 | |
| 
 | |
| #elif HAVE_SLEEP
 | |
| 
 | |
| # undef sleep
 | |
| 
 | |
| /* Guarantee unlimited sleep and a reasonable return value.  Cygwin
 | |
|    1.5.x rejects attempts to sleep more than 49.7 days (2**32
 | |
|    milliseconds), but uses uninitialized memory which results in a
 | |
|    garbage answer.  Similarly, Linux 2.6.9 with glibc 2.3.4 has a too
 | |
|    small return value when asked to sleep more than 24.85 days.  */
 | |
| unsigned int
 | |
| rpl_sleep (unsigned int seconds)
 | |
| {
 | |
|   /* This requires int larger than 16 bits.  */
 | |
|   verify (UINT_MAX / 24 / 24 / 60 / 60);
 | |
|   const unsigned int limit = 24 * 24 * 60 * 60;
 | |
|   while (limit < seconds)
 | |
|     {
 | |
|       unsigned int result;
 | |
|       seconds -= limit;
 | |
|       result = sleep (limit);
 | |
|       if (result)
 | |
|         return seconds + result;
 | |
|     }
 | |
|   return sleep (seconds);
 | |
| }
 | |
| 
 | |
| #else /* !HAVE_SLEEP */
 | |
| 
 | |
|  #error "Please port gnulib sleep.c to your platform, possibly using usleep() or select(), then report this to bug-gnulib."
 | |
| 
 | |
| #endif
 | 
