summaryrefslogtreecommitdiffstats
path: root/c/src/libchip/shmdr/poll.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2008-09-05 14:48:37 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2008-09-05 14:48:37 +0000
commit5c980d0f993bcb2b59ba4faf25cf9d887faf83f3 (patch)
tree8b5c9a48b4aa6603f6afa2c45819bde10f266242 /c/src/libchip/shmdr/poll.c
parent2008-09-05 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-5c980d0f993bcb2b59ba4faf25cf9d887faf83f3.tar.bz2
2008-09-05 Joel Sherrill <joel.sherrill@oarcorp.com>
* libchip/Makefile.am, libchip/shmdr/init.c, libchip/shmdr/mpisr.c, libchip/shmdr/poll.c, libchip/shmdr/shm_driver.h: Update shared memory driver to not use the clock ioctl to install a method to poll for input. It now uses a Class API Timer which means we can eliminate this special IOCTL from all clock drivers. * libchip/shmdr/setckvec.c: Removed.
Diffstat (limited to 'c/src/libchip/shmdr/poll.c')
-rw-r--r--c/src/libchip/shmdr/poll.c60
1 files changed, 32 insertions, 28 deletions
diff --git a/c/src/libchip/shmdr/poll.c b/c/src/libchip/shmdr/poll.c
index 411f740fb0..1190a53854 100644
--- a/c/src/libchip/shmdr/poll.c
+++ b/c/src/libchip/shmdr/poll.c
@@ -1,14 +1,8 @@
-/* void Shm_Poll()
- *
+/*
* This routine polls to see if a packet has arrived. If one
- * has it informs the executive. It is typically called from
- * the clock tick interrupt service routine.
- *
- * Input parameters: NONE
- *
- * Output parameters: NONE
+ * has it informs the executive. It uses a Classic API Timer
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2008.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -22,31 +16,41 @@
#include <rtems/score/sysstate.h>
#include <rtems/libio.h>
+#include <assert.h>
+
#include "shm_driver.h"
-void Shm_Poll()
+rtems_timer_service_routine Shm_Poll_TSR(
+ rtems_id id,
+ void *ignored_address
+)
{
- uint32_t tmpfront;
- rtems_libio_ioctl_args_t args;
-
- /* invoke clock isr */
- args.iop = 0;
- args.command = rtems_build_name('I', 'S', 'R', ' ');
- (void) rtems_io_control(rtems_clock_major, rtems_clock_minor, &args);
+ uint32_t tmpfront;
/*
- * Check for msgs only if we are "up"
- * This avoids a race condition where we may get a clock
- * interrupt before MPCI has completed its init
+ * This should NEVER happen but just in case.
*/
+ if (!_System_state_Is_up(_System_state_Get()))
+ return;
- if (_System_state_Is_up(_System_state_Get()))
- {
- tmpfront = Shm_Local_receive_queue->front;
- if ( Shm_Convert(tmpfront) != Shm_Locked_queue_End_of_list )
- {
- rtems_multiprocessing_announce();
- Shm_Interrupt_count++;
- }
+ tmpfront = Shm_Local_receive_queue->front;
+ if ( Shm_Convert(tmpfront) != Shm_Locked_queue_End_of_list ) {
+ rtems_multiprocessing_announce();
+ Shm_Interrupt_count++;
}
+
+ (void) rtems_timer_reset( id );
}
+
+void Shm_install_timer(void)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ status = rtems_timer_create( rtems_build_name( 'S', 'H', 'P', 'L' ), &id );
+ assert( !status );
+
+ status = rtems_timer_fire_after( id, 1, Shm_Poll_TSR, NULL );
+ assert( !status );
+}
+