diff --git a/library/changes b/library/changes index 1e76d5e..7c42506 100644 --- a/library/changes +++ b/library/changes @@ -1,3 +1,6 @@ +- Added usleep(), and created wrapper code that both sleep() and + usleep() can use. + - Added strtoll() and strtoull(), with further changes to and . diff --git a/library/include/unistd.h b/library/include/unistd.h index 91b0405..5ffc4e5 100644 --- a/library/include/unistd.h +++ b/library/include/unistd.h @@ -1,5 +1,5 @@ /* - * $Id: unistd.h,v 1.4 2004-08-07 09:15:33 obarthel Exp $ + * $Id: unistd.h,v 1.5 2004-09-29 12:10:35 obarthel Exp $ * * :ts=4 * @@ -87,6 +87,7 @@ extern int symlink(const char * actual_path, const char * symbolic_path); extern int readlink(const char * path_name, char * buffer, int buffer_size); extern int chdir(const char * path_name); extern unsigned int sleep(unsigned int seconds); +extern void usleep(unsigned long microseconds); extern int getopt(int argc, char * argv[], char *opts); extern pid_t getpid(void); extern char *realpath(const char *file_name, char *resolved_name); diff --git a/library/smakefile b/library/smakefile index 6d2ddd3..c18b821 100644 --- a/library/smakefile +++ b/library/smakefile @@ -1,5 +1,5 @@ # -# $Id: smakefile,v 1.8 2004-09-20 17:16:06 obarthel Exp $ +# $Id: smakefile,v 1.9 2004-09-29 12:10:29 obarthel Exp $ # # :ts=8 # @@ -497,12 +497,14 @@ UNISTD_OBJ = \ unistd_sleep.o \ unistd_strip_double_slash.o \ unistd_symlink.o \ + unistd_time_delay.o \ unistd_translatea2u.o \ unistd_translaterel.o \ unistd_translateu2a.o \ unistd_truncate.o \ unistd_unix_path_semantics.o \ - unistd_unlink.o + unistd_unlink.o \ + unistd_usleep.o # \ # unistd_wildcard_expand.o diff --git a/library/unistd_data.c b/library/unistd_data.c index ff4c349..6ee4cf2 100644 --- a/library/unistd_data.c +++ b/library/unistd_data.c @@ -1,5 +1,5 @@ /* - * $Id: unistd_data.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $ + * $Id: unistd_data.c,v 1.3 2004-09-29 12:10:29 obarthel Exp $ * * :ts=4 * @@ -46,12 +46,6 @@ struct MinList __unlink_list; /****************************************************************************/ -/* Local timer I/O. */ -struct MsgPort * __timer_port; -struct timerequest * __timer_request; - -/****************************************************************************/ - /* If the program's current directory was changed, here is where * we find out about it. */ diff --git a/library/unistd_headers.h b/library/unistd_headers.h index c678e15..c4e671c 100644 --- a/library/unistd_headers.h +++ b/library/unistd_headers.h @@ -1,5 +1,5 @@ /* - * $Id: unistd_headers.h,v 1.1.1.1 2004-07-26 16:32:28 obarthel Exp $ + * $Id: unistd_headers.h,v 1.2 2004-09-29 12:10:29 obarthel Exp $ * * :ts=4 * @@ -54,6 +54,14 @@ extern struct MinList __unlink_list; /* Local timer I/O. */ extern struct MsgPort * __timer_port; extern struct timerequest * __timer_request; +extern BOOL __timer_busy; +extern struct Library * __TimerBase; + +/****************************************************************************/ + +#if defined(__amigaos4__) +extern struct TimerIFace * __ITimer; +#endif /* __amigaos4__ */ /****************************************************************************/ @@ -75,4 +83,8 @@ extern void __strip_double_slash(char * file_name,int len); /****************************************************************************/ +extern unsigned int __time_delay(unsigned long seconds,unsigned long microseconds); + +/****************************************************************************/ + #endif /* _UNISTD_HEADERS_H */ diff --git a/library/unistd_init_exit.c b/library/unistd_init_exit.c index 2557e9e..bb03b21 100644 --- a/library/unistd_init_exit.c +++ b/library/unistd_init_exit.c @@ -1,5 +1,5 @@ /* - * $Id: unistd_init_exit.c,v 1.3 2004-08-07 10:24:04 obarthel Exp $ + * $Id: unistd_init_exit.c,v 1.4 2004-09-29 12:10:29 obarthel Exp $ * * :ts=4 * @@ -80,21 +80,6 @@ __unistd_exit(void) } } - if(__timer_request != NULL) - { - if(__timer_request->tr_node.io_Device != NULL) - CloseDevice((struct IORequest *)__timer_request); - - DeleteIORequest((struct IORequest *)__timer_request); - __timer_request = NULL; - } - - if(__timer_port != NULL) - { - DeleteMsgPort(__timer_port); - __timer_port = NULL; - } - if(__current_directory_changed) { BPTR old_dir; diff --git a/library/unistd_sleep.c b/library/unistd_sleep.c index 2bc9dc3..acdacc2 100644 --- a/library/unistd_sleep.c +++ b/library/unistd_sleep.c @@ -1,5 +1,5 @@ /* - * $Id: unistd_sleep.c,v 1.2 2004-08-07 09:15:33 obarthel Exp $ + * $Id: unistd_sleep.c,v 1.3 2004-09-29 12:10:29 obarthel Exp $ * * :ts=4 * @@ -44,132 +44,11 @@ unsigned int sleep(unsigned int seconds) { - static BOOL sleeping; - unsigned int result = 0; + unsigned int result; ENTER(); - SHOWVALUE(seconds); - - if(__check_abort_enabled) - __check_abort(); - - if(seconds > 0) - { - if(NOT sleeping) - { - BOOL timer_open; - - sleeping = TRUE; - - if(__timer_request == NULL) - { - timer_open = FALSE; - - SHOWMSG("trying to open the timer"); - - PROFILE_OFF(); - - __timer_port = CreateMsgPort(); - if(__timer_port != NULL) - { - __timer_request = (struct timerequest *)CreateIORequest(__timer_port,sizeof(*__timer_request)); - if(__timer_request != NULL) - { - if(OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)__timer_request,0) == 0) - timer_open = TRUE; - } - } - - if(NOT timer_open) - { - SHOWMSG("that didn't work"); - - DeleteIORequest((struct IORequest *)__timer_request); - __timer_request = NULL; - - DeleteMsgPort(__timer_port); - __timer_port = NULL; - } - - PROFILE_ON(); - } - else - { - timer_open = TRUE; - } - - if(timer_open) - { - ULONG signals_to_wait_for; - ULONG seconds_then; - ULONG timer_signal; - struct DateStamp ds; - ULONG signals; - - __timer_request->tr_node.io_Command = TR_ADDREQUEST; - __timer_request->tr_time.tv_secs = seconds; - __timer_request->tr_time.tv_micro = 0; - - timer_signal = (1UL << __timer_port->mp_SigBit); - - signals_to_wait_for = timer_signal; - - SetSignal(0,signals_to_wait_for); - - if(__check_abort_enabled) - SET_FLAG(signals_to_wait_for,SIGBREAKF_CTRL_C); - - PROFILE_OFF(); - DateStamp(&ds); - PROFILE_ON(); - - seconds_then = (ds.ds_Days * 24 * 60 + ds.ds_Minute) * 60 + ds.ds_Tick / TICKS_PER_SECOND; - - SendIO((struct IORequest *)__timer_request); - - while(TRUE) - { - PROFILE_OFF(); - signals = Wait(signals_to_wait_for); - PROFILE_ON(); - - if(FLAG_IS_SET(signals,SIGBREAKF_CTRL_C)) - { - ULONG seconds_now; - - if(CheckIO((struct IORequest *)__timer_request)) - AbortIO((struct IORequest *)__timer_request); - - WaitIO((struct IORequest *)__timer_request); - - SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C); - __check_abort(); - - PROFILE_OFF(); - DateStamp(&ds); - PROFILE_ON(); - - seconds_now = (ds.ds_Days * 24 * 60 + ds.ds_Minute) * 60 + ds.ds_Tick / TICKS_PER_SECOND; - - seconds_now -= seconds_then; - if(seconds_now < seconds) - result = (seconds - seconds_now); - - break; - } - - if(FLAG_IS_SET(signals,timer_signal)) - { - WaitIO((struct IORequest *)__timer_request); - break; - } - } - } - - sleeping = FALSE; - } - } + result = __time_delay(seconds,0); RETURN(result); return(result); diff --git a/library/unistd_time_delay.c b/library/unistd_time_delay.c new file mode 100644 index 0000000..a03df61 --- /dev/null +++ b/library/unistd_time_delay.c @@ -0,0 +1,135 @@ +/* + * $Id: unistd_time_delay.c,v 1.1 2004-09-29 12:10:29 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2004 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _UNISTD_HEADERS_H +#include "unistd_headers.h" +#endif /* _UNISTD_HEADERS_H */ + +/****************************************************************************/ + +/* The following is not part of the ISO 'C' (1994) standard. */ + +/****************************************************************************/ + +unsigned int +__time_delay(unsigned long seconds,unsigned long microseconds) +{ + unsigned int result = 0; + + ENTER(); + + SHOWVALUE(seconds); + + if(__check_abort_enabled) + __check_abort(); + + if((seconds > 0 || microseconds > 0) && NOT __timer_busy) + { + struct Library * TimerBase = __TimerBase; + #if defined(__amigaos4__) + struct TimerIFace * ITimer = __ITimer; + #endif /* __amigaos4__ */ + + ULONG signals_to_wait_for; + ULONG seconds_then; + ULONG timer_signal; + struct timeval tv; + ULONG signals; + + __timer_busy = TRUE; + + __timer_request->tr_node.io_Command = TR_ADDREQUEST; + __timer_request->tr_time.tv_secs = seconds; + __timer_request->tr_time.tv_micro = microseconds; + + timer_signal = (1UL << __timer_port->mp_SigBit); + + signals_to_wait_for = timer_signal; + + SetSignal(0,signals_to_wait_for); + + if(__check_abort_enabled) + SET_FLAG(signals_to_wait_for,SIGBREAKF_CTRL_C); + + PROFILE_OFF(); + GetSysTime(&tv); + PROFILE_ON(); + + seconds_then = tv.tv_secs + seconds; + + SendIO((struct IORequest *)__timer_request); + + while(TRUE) + { + PROFILE_OFF(); + signals = Wait(signals_to_wait_for); + PROFILE_ON(); + + if(FLAG_IS_SET(signals,SIGBREAKF_CTRL_C)) + { + ULONG seconds_now; + + if(CheckIO((struct IORequest *)__timer_request)) + AbortIO((struct IORequest *)__timer_request); + + WaitIO((struct IORequest *)__timer_request); + + SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C); + __check_abort(); + + /* Now figure out how many seconds have elapsed and + how many would still remain. */ + PROFILE_OFF(); + GetSysTime(&tv); + PROFILE_ON(); + + seconds_now = tv.tv_secs; + if(seconds_now < seconds_then) + result = seconds_then - seconds_now; + + break; + } + + if(FLAG_IS_SET(signals,timer_signal)) + { + WaitIO((struct IORequest *)__timer_request); + break; + } + } + + __timer_busy = FALSE; + } + + RETURN(result); + return(result); +} diff --git a/library/unistd_usleep.c b/library/unistd_usleep.c new file mode 100644 index 0000000..8ff125c --- /dev/null +++ b/library/unistd_usleep.c @@ -0,0 +1,54 @@ +/* + * $Id: unistd_usleep.c,v 1.1 2004-09-29 12:10:29 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2004 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _UNISTD_HEADERS_H +#include "unistd_headers.h" +#endif /* _UNISTD_HEADERS_H */ + +/****************************************************************************/ + +/* The following is not part of the ISO 'C' (1994) standard. */ + +/****************************************************************************/ + +void +usleep(unsigned long microseconds) +{ + ENTER(); + + SHOWVALUE(microseconds); + + __time_delay(0,microseconds); + + LEAVE(); +}