include/native/ppd.h

Go to the documentation of this file.
00001 
00022 #ifndef _XENO_PPD_H
00023 #define _XENO_PPD_H
00024 
00025 #include <nucleus/pod.h>
00026 #include <nucleus/ppd.h>
00027 #include <nucleus/heap.h>
00028 
00029 typedef struct xeno_resource_holder {
00030 
00031         xnshadow_ppd_t ppd;
00032 
00033 #define ppd2rholder(a)  container_of(a, struct xeno_resource_holder, ppd)
00034 
00035         xnqueue_t alarmq;
00036         xnqueue_t condq;
00037         xnqueue_t eventq;
00038         xnqueue_t heapq;
00039         xnqueue_t intrq;
00040         xnqueue_t mutexq;
00041         xnqueue_t pipeq;
00042         xnqueue_t queueq;
00043         xnqueue_t semq;
00044         xnqueue_t ioregionq;
00045 
00046 } xeno_rholder_t;
00047 
00048 extern xeno_rholder_t __native_global_rholder;
00049 
00050 #ifdef CONFIG_XENO_OPT_PERVASIVE
00051 
00052 extern int __native_muxid;
00053 
00054 static inline xeno_rholder_t *xeno_get_rholder(void)
00055 {
00056         xnshadow_ppd_t *ppd = xnshadow_ppd_get(__native_muxid);
00057 
00058         if (ppd == NULL)
00059                 return &__native_global_rholder;
00060 
00061         return ppd2rholder(ppd);
00062 }
00063 
00064 #define __xeno_release_obj(obj)         \
00065         do {                                    \
00066                 if ((obj)->cpid)                \
00067                         xnfree(obj);            \
00068         } while(0)
00069 
00070 #else /* !CONFIG_XENO_OPT_PERVASIVE */
00071 
00072 static inline xeno_rholder_t *xeno_get_rholder(void)
00073 {
00074         return &__native_global_rholder;
00075 }
00076 
00077 #define __xeno_release_obj(obj)
00078 
00079 #endif /* !CONFIG_XENO_OPT_PERVASIVE */
00080 
00081 #if XENO_DEBUG(NATIVE)
00082 #define __xeno_trace_release(__name, __obj, __err)              \
00083         xnprintf("native: cleaning up %s \"%s\" (ret=%d).\n",   \
00084                  __name, (__obj)->name, __err)
00085 #else /* !XENO_DEBUG(NATIVE) */
00086 #define __xeno_trace_release(__name, __obj, __err)
00087 #endif /* !XENO_DEBUG(NATIVE) */
00088 
00089 #define xeno_flush_rq(__type, __rq, __name)                             \
00090         do {                                                            \
00091                 int rt_##__name##_delete(__type *);                     \
00092                 xnholder_t *holder, *nholder;                           \
00093                 __type *obj;                                            \
00094                 int err;                                                \
00095                 spl_t s;                                                \
00096                 xnlock_get_irqsave(&nklock, s);                         \
00097                 nholder = getheadq(__rq);                               \
00098                 while ((holder = nholder) != NULL) {                    \
00099                         nholder = nextq((__rq), holder);                \
00100                         xnlock_put_irqrestore(&nklock, s);              \
00101                         obj = rlink2##__name(holder);                   \
00102                         err = rt_##__name##_delete(obj);                \
00103                         __xeno_trace_release(#__name, obj, err);        \
00104                         if (unlikely(err)) {                            \
00105                                 if ((__rq) != &__native_global_rholder.__name##q) { \
00106                                         xnlock_get_irqsave(&nklock, s); \
00107                                         nholder = popq((rq), holder);   \
00108                                         appendq(&__native_global_rholder.__name##q, holder); \
00109                                         obj->rqueue = &__native_global_rholder.__name##q; \
00110                                 }                                       \
00111                         } else {                                        \
00112                                 __xeno_release_obj(obj);                \
00113                                 xnlock_get_irqsave(&nklock, s);         \
00114                         }                                               \
00115                 }                                                       \
00116                 xnlock_put_irqrestore(&nklock, s);                      \
00117         } while(0)
00118 
00119 #endif /* !_XENO_PPD_H */

Generated on Mon Mar 24 18:02:40 2008 for Xenomai API by  doxygen 1.5.3