summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2003-08-14 13:08:58 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2003-08-14 13:08:58 +0000
commitb56c1a3ab7c3215b5ca7d3e2a2a5473c35e16529 (patch)
treed0a4873c62a6e1bc417eb2e671d53543a4d81262 /cpukit
parent2003-08-14 Ralf Corsepius <corsepiu@faw.uni-ulm.de> (diff)
downloadrtems-b56c1a3ab7c3215b5ca7d3e2a2a5473c35e16529.tar.bz2
2003-08-14 Joel Sherrill <joel@OARcorp.com>
PR 92/rtems * Makefile.am, src/alarm.c, src/psignal.c: Added ualarm() and usleep(). * src/ualarm.c, src/usleep.c: New files.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/posix/ChangeLog6
-rw-r--r--cpukit/posix/Makefile.am4
-rw-r--r--cpukit/posix/src/alarm.c59
-rw-r--r--cpukit/posix/src/psignal.c32
-rw-r--r--cpukit/posix/src/ualarm.c95
-rw-r--r--cpukit/posix/src/usleep.c34
6 files changed, 181 insertions, 49 deletions
diff --git a/cpukit/posix/ChangeLog b/cpukit/posix/ChangeLog
index 6d2ae36807..062dc3e254 100644
--- a/cpukit/posix/ChangeLog
+++ b/cpukit/posix/ChangeLog
@@ -1,3 +1,9 @@
+2003-08-14 Joel Sherrill <joel@OARcorp.com>
+
+ PR 92/rtems
+ * Makefile.am, src/alarm.c, src/psignal.c: Added ualarm() and usleep().
+ * src/ualarm.c, src/usleep.c: New files.
+
2003-07-08 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
* configure.ac: Remove (Merged-in into ../configure.ac)
diff --git a/cpukit/posix/Makefile.am b/cpukit/posix/Makefile.am
index 3493b06180..18715a7798 100644
--- a/cpukit/posix/Makefile.am
+++ b/cpukit/posix/Makefile.am
@@ -142,7 +142,7 @@ PSIGNAL_C_FILES = src/psignal.c src/alarm.c src/kill.c src/killinfo.c src/pause.
src/pthreadkill.c src/pthreadsigmask.c src/sigaction.c src/sigaddset.c src/sigdelset.c \
src/sigemptyset.c src/sigfillset.c src/sigismember.c src/sigpending.c src/sigprocmask.c \
src/sigqueue.c src/sigsuspend.c src/sigtimedwait.c src/sigwait.c src/sigwaitinfo.c \
- src/signal_2.c
+ src/signal_2.c src/ualarm.c
SEMAPHORE_C_FILES = src/semaphore.c src/semaphorecreatesupp.c src/semaphoredeletesupp.c \
src/semaphoremp.c src/semaphorenametoid.c src/semaphorewaitsupp.c src/semclose.c \
@@ -152,7 +152,7 @@ SEMAPHORE_C_FILES = src/semaphore.c src/semaphorecreatesupp.c src/semaphoredelet
TIME_C_FILES = src/adjtime.c src/time.c src/posixtimespecsubtract.c \
src/posixtimespectointerval.c src/posixintervaltotimespec.c src/clockgetcpuclockid.c \
src/clockgetenableattr.c src/clockgetres.c src/clockgettime.c src/clocksetenableattr.c \
- src/clocksettime.c src/nanosleep.c src/sleep.c
+ src/clocksettime.c src/nanosleep.c src/sleep.c src/usleep.c
# the timer manager needs to be split further but only after its
# dependence on the Classic API Timer Manager is removed.
diff --git a/cpukit/posix/src/alarm.c b/cpukit/posix/src/alarm.c
index 13c4c40202..dacd06adf0 100644
--- a/cpukit/posix/src/alarm.c
+++ b/cpukit/posix/src/alarm.c
@@ -22,6 +22,24 @@
#include <rtems/posix/pthread.h>
#include <rtems/posix/psignal.h>
+Watchdog_Control _POSIX_signals_Alarm_timer;
+
+/*PAGE
+ *
+ * _POSIX_signals_Alarm_TSR
+ */
+
+void _POSIX_signals_Alarm_TSR(
+ Objects_Id id,
+ void *argument
+)
+{
+ int status;
+
+ status = kill( getpid(), SIGALRM );
+ /* XXX can't print from an ISR, should this be fatal? */
+}
+
unsigned int alarm(
unsigned int seconds
)
@@ -31,22 +49,31 @@ unsigned int alarm(
the_timer = &_POSIX_signals_Alarm_timer;
- switch ( _Watchdog_Remove( the_timer ) ) {
- case WATCHDOG_INACTIVE:
- case WATCHDOG_BEING_INSERTED:
- break;
-
- case WATCHDOG_ACTIVE:
- case WATCHDOG_REMOVE_IT:
- /*
- * The stop_time and start_time fields are snapshots of ticks since
- * boot. Since alarm() is dealing in seconds, we must account for
- * this.
- */
-
- remaining = the_timer->initial -
- ((the_timer->stop_time - the_timer->start_time) / _TOD_Ticks_per_second);
- break;
+ /*
+ * Initialize the timer used to implement alarm().
+ */
+
+ if ( !the_timer->routine ) {
+ _Watchdog_Initialize( the_timer, _POSIX_signals_Alarm_TSR, 0, NULL );
+ } else {
+ switch ( _Watchdog_Remove( the_timer ) ) {
+ case WATCHDOG_INACTIVE:
+ case WATCHDOG_BEING_INSERTED:
+ break;
+
+ case WATCHDOG_ACTIVE:
+ case WATCHDOG_REMOVE_IT:
+ /*
+ * The stop_time and start_time fields are snapshots of ticks since
+ * boot. Since alarm() is dealing in seconds, we must account for
+ * this.
+ */
+
+ remaining = the_timer->initial -
+ ((the_timer->stop_time - the_timer->start_time) /
+ _TOD_Ticks_per_second);
+ break;
+ }
}
_Watchdog_Insert_seconds( the_timer, seconds );
diff --git a/cpukit/posix/src/psignal.c b/cpukit/posix/src/psignal.c
index 5a70711242..63345ef7dc 100644
--- a/cpukit/posix/src/psignal.c
+++ b/cpukit/posix/src/psignal.c
@@ -73,8 +73,6 @@ struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ] = {
struct sigaction _POSIX_signals_Vectors[ SIG_ARRAY_MAX ];
-Watchdog_Control _POSIX_signals_Alarm_timer;
-
Thread_queue_Control _POSIX_signals_Wait_queue;
Chain_Control _POSIX_signals_Inactive_siginfo;
@@ -148,23 +146,6 @@ restart:
/*PAGE
*
- * _POSIX_signals_Alarm_TSR
- */
-
-void _POSIX_signals_Alarm_TSR(
- Objects_Id id,
- void *argument
-)
-{
- int status;
-
- status = kill( getpid(), SIGALRM );
- /* XXX can't print from an ISR, should this be fatal? */
- assert( !status );
-}
-
-/*PAGE
- *
* _POSIX_signals_Manager_Initialization
*/
@@ -175,7 +156,7 @@ void _POSIX_signals_Manager_Initialization(
unsigned32 signo;
/*
- * Insure we have the same number of vectors and default vector entries
+ * Ensure we have the same number of vectors and default vector entries
*/
assert(
@@ -195,17 +176,6 @@ void _POSIX_signals_Manager_Initialization(
sigemptyset( &_POSIX_signals_Pending );
/*
- * Initialize the timer used to implement alarm().
- */
-
- _Watchdog_Initialize(
- &_POSIX_signals_Alarm_timer,
- _POSIX_signals_Alarm_TSR,
- 0,
- NULL
- );
-
- /*
* Initialize the queue we use to block for signals
*/
diff --git a/cpukit/posix/src/ualarm.c b/cpukit/posix/src/ualarm.c
new file mode 100644
index 0000000000..5e8bec94d1
--- /dev/null
+++ b/cpukit/posix/src/ualarm.c
@@ -0,0 +1,95 @@
+/*
+ * XXX 3.4.1 Schedule Alarm, P1003.1b-1993, p. 79
+ *
+ * COPYRIGHT (c) 1989-2003.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <pthread.h>
+/* #include <errno.h> */
+
+#include <rtems/system.h>
+#include <rtems/posix/pthread.h>
+#include <rtems/posix/psignal.h>
+#include <rtems/posix/time.h>
+
+Watchdog_Control _POSIX_signals_Ualarm_timer;
+
+/*PAGE
+ *
+ * _POSIX_signals_Ualarm_TSR
+ */
+
+void _POSIX_signals_Ualarm_TSR(
+ Objects_Id id,
+ void *argument
+)
+{
+ int status;
+
+ status = kill( getpid(), SIGALRM );
+ /* XXX can't print from an ISR, should this be fatal? */
+}
+
+useconds_t ualarm(
+ useconds_t useconds,
+ useconds_t interval
+)
+{
+ useconds_t remaining = 0;
+ Watchdog_Control *the_timer;
+ Watchdog_Interval ticks;
+ struct timespec tp;
+
+ the_timer = &_POSIX_signals_Ualarm_timer;
+
+ /*
+ * Initialize the timer used to implement alarm().
+ */
+
+ if ( !the_timer->routine ) {
+ _Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
+ } else {
+ switch ( _Watchdog_Remove( the_timer ) ) {
+ case WATCHDOG_INACTIVE:
+ case WATCHDOG_BEING_INSERTED:
+ break;
+
+ case WATCHDOG_ACTIVE:
+ case WATCHDOG_REMOVE_IT:
+ /*
+ * The stop_time and start_time fields are snapshots of ticks since
+ * boot. Since alarm() is dealing in seconds, we must account for
+ * this.
+ */
+
+
+ ticks = the_timer->initial -
+ ((the_timer->stop_time - the_timer->start_time) /
+ _TOD_Ticks_per_second);
+
+ _POSIX_Interval_to_timespec( ticks, &tp );
+ remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
+ remaining += tp.tv_nsec / 1000;
+ break;
+ }
+ }
+
+ tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
+ tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
+ ticks = _POSIX_Timespec_to_interval( &tp );
+ _Watchdog_Insert_ticks( the_timer, ticks );
+
+ return remaining;
+}
+
diff --git a/cpukit/posix/src/usleep.c b/cpukit/posix/src/usleep.c
new file mode 100644
index 0000000000..6753cfe713
--- /dev/null
+++ b/cpukit/posix/src/usleep.c
@@ -0,0 +1,34 @@
+/*
+ * XXX 3.4.3 Delay Process Execution, P1003.1b-1993, p. 81
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <time.h>
+#include <unistd.h>
+
+#include <rtems/system.h>
+#include <rtems/score/tod.h>
+
+
+unsigned usleep(
+ unsigned int useconds
+)
+{
+ struct timespec tp;
+ struct timespec tm;
+ unsigned remaining;
+
+ tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
+ tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
+
+ nanosleep( &tp, &tm );
+
+ remaining = tm.tv_sec * TOD_MICROSECONDS_PER_SECOND;
+ remaining += tm.tv_nsec / 1000;
+ return remaining; /* seconds remaining */
+}