This is Unofficial EPICS BASE Doxygen Site
osdInterrupt.c File Reference
#include <syslog.h>
#include <rtems.h>
#include <rtems/error.h>
#include "errlog.h"
#include "epicsInterrupt.h"
#include "epicsThread.h"
+ Include dependency graph for osdInterrupt.c:

Go to the source code of this file.

Macros

#define INTERRUPT_CONTEXT_MESSAGE_QUEUE_COUNT   100
 

Functions

int epicsInterruptLock (void)
 
void epicsInterruptUnlock (int key)
 
int epicsInterruptIsInterruptContext (void)
 
void epicsInterruptContextMessage (const char *message)
 
void InterruptContextMessageDaemon (void *unused)
 

Macro Definition Documentation

#define INTERRUPT_CONTEXT_MESSAGE_QUEUE_COUNT   100

Definition at line 21 of file osdInterrupt.c.

Function Documentation

void epicsInterruptContextMessage ( const char *  message)

Definition at line 55 of file osdInterrupt.c.

56 {
57  rtems_message_queue_send (interruptContextMessageQueue, &message, sizeof message);
58 }
int epicsInterruptIsInterruptContext ( void  )

Definition at line 43 of file osdInterrupt.c.

44 {
45  return rtems_interrupt_is_in_progress ();
46 }
int epicsInterruptLock ( void  )

Definition at line 26 of file osdInterrupt.c.

27 {
28  rtems_interrupt_level level;
29 
30  rtems_interrupt_disable (level);
31  return level;
32 }
void epicsInterruptUnlock ( int  key)

Definition at line 35 of file osdInterrupt.c.

36 {
37  rtems_interrupt_level level = key;
38 
39  rtems_interrupt_enable (level);
40 }
void InterruptContextMessageDaemon ( void *  unused)

Definition at line 64 of file osdInterrupt.c.

65 {
66  const char *message;
67  size_t size;
68  rtems_status_code sc;
69 
70  sc = rtems_message_queue_create (rtems_build_name ('I', 'C', 'M', 'Q'),
72  sizeof message,
73  RTEMS_FIFO | RTEMS_LOCAL,
74  &interruptContextMessageQueue);
75  if (sc != RTEMS_SUCCESSFUL) {
76  errlogPrintf ("Can't create interrupt context message queue: %s\n", rtems_status_text (sc));
78  }
79  for (;;) {
80  sc = rtems_message_queue_receive (interruptContextMessageQueue,
81  &message,
82  &size,
83  RTEMS_WAIT,
84  RTEMS_NO_TIMEOUT);
85  if (sc != RTEMS_SUCCESSFUL) {
86  errlogPrintf ("Can't receive message from interrupt context: %s\n", rtems_status_text (sc));
88  }
89  if (size == sizeof message)
90  syslog (LOG_ERR, "%s", message);
91  else
92  errlogPrintf ("Received %u-byte message from interrupt context", (unsigned int)size);
93  }
94 }
LIBCOM_API void epicsStdCall epicsThreadSuspendSelf(void)
Definition: osdThread.c:664
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
#define INTERRUPT_CONTEXT_MESSAGE_QUEUE_COUNT
Definition: osdInterrupt.c:21