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
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
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
00086 #define __xeno_trace_release(__name, __obj, __err)
00087 #endif
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