summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/posix/src')
-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
4 files changed, 173 insertions, 47 deletions
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 */
+}