This is Unofficial EPICS BASE Doxygen Site
osdSpin.c File Reference
#include <stdlib.h>
#include <rtems.h>
#include "cantProceed.h"
#include "epicsSpin.h"
+ Include dependency graph for osdSpin.c:

Go to the source code of this file.

Classes

struct  epicsSpin
 

Macros

#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__   1
 

Typedefs

typedef struct epicsSpin epicsSpin
 

Functions

epicsSpinId epicsSpinCreate (void)
 
epicsSpinId epicsSpinMustCreate (void)
 
void epicsSpinDestroy (epicsSpinId spin)
 
void epicsSpinLock (epicsSpinId spin)
 
int epicsSpinTryLock (epicsSpinId spin)
 
void epicsSpinUnlock (epicsSpinId spin)
 

Macro Definition Documentation

#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__   1

Definition at line 29 of file osdSpin.c.

Typedef Documentation

typedef struct epicsSpin epicsSpin

Function Documentation

epicsSpinId epicsSpinCreate ( void  )

Definition at line 42 of file osdSpin.c.

42  {
43  return calloc(1, sizeof(epicsSpin));
44 }
void epicsSpinDestroy ( epicsSpinId  spin)

Definition at line 54 of file osdSpin.c.

54  {
55  free(spin);
56 }
void epicsSpinLock ( epicsSpinId  spin)

Definition at line 58 of file osdSpin.c.

58  {
59  rtems_interrupt_level level;
60 
61  rtems_interrupt_disable(level);
62  _Thread_Disable_dispatch();
63  if (spin->locked) {
64  rtems_interrupt_enable(level);
65  _Thread_Enable_dispatch();
66  if (!rtems_interrupt_is_in_progress()) {
67  printk("epicsSpinLock(%p): Deadlock.\n", spin);
68  cantProceed("Recursive lock, missed unlock or block when locked.");
69  }
70  else {
71  printk("epicsSpinLock(%p): Deadlock in ISR.\n"
72  "Recursive lock, missed unlock or block when locked.\n",
73  spin);
74  }
75  return;
76  }
77  spin->level = level;
78  spin->locked = 1;
79 }
rtems_interrupt_level level
Definition: osdSpin.c:38
unsigned int locked
Definition: osdSpin.c:39
LIBCOM_API void cantProceed(const char *msg,...)
Definition: cantProceed.c:54
epicsSpinId epicsSpinMustCreate ( void  )

Definition at line 46 of file osdSpin.c.

47 {
49  if (!ret)
50  cantProceed("epicsSpinMustCreate: epicsSpinCreate failed.");
51  return ret;
52 }
LIBCOM_API void cantProceed(const char *msg,...)
Definition: cantProceed.c:54
epicsSpinId epicsSpinCreate(void)
Definition: osdSpin.c:28
int epicsSpinTryLock ( epicsSpinId  spin)

Definition at line 81 of file osdSpin.c.

81  {
82  rtems_interrupt_level level;
83 
84  rtems_interrupt_disable(level);
85  _Thread_Disable_dispatch();
86  if (spin->locked) {
87  rtems_interrupt_enable(level);
88  _Thread_Enable_dispatch();
89  return 1;
90  }
91  spin->level = level;
92  spin->locked = 1;
93  return 0;
94 }
rtems_interrupt_level level
Definition: osdSpin.c:38
unsigned int locked
Definition: osdSpin.c:39
void epicsSpinUnlock ( epicsSpinId  spin)

Definition at line 96 of file osdSpin.c.

96  {
97  rtems_interrupt_level level = spin->level;
98 
99  if (!spin->locked) {
100  printk("epicsSpinUnlock(%p): not locked\n", spin);
101  return;
102  }
103  spin->level = spin->locked = 0;
104  rtems_interrupt_enable (level);
105  _Thread_Enable_dispatch();
106 }
rtems_interrupt_level level
Definition: osdSpin.c:38
unsigned int locked
Definition: osdSpin.c:39