00001 #ifndef PSE51_REGISTRY_H
00002 #define PSE51_REGISTRY_H
00003
00004 #include <stdarg.h>
00005 #include <nucleus/queue.h>
00006 #include <nucleus/synch.h>
00007 #include <posix/posix.h>
00008
00009 #define PSE51_MAXNAME 64
00010
00011
00012
00013 typedef struct pse51_node {
00014 unsigned magic;
00015 unsigned flags;
00016 unsigned refcount;
00017 xnsynch_t *completion_synch;
00018
00019
00020 struct pse51_node *next;
00021 struct pse51_node **prev;
00022 char name[PSE51_MAXNAME];
00023 } pse51_node_t;
00024
00025 int pse51_reg_pkg_init(unsigned objects_count, unsigned maxfds);
00026
00027 void pse51_reg_pkg_cleanup(void);
00028
00029
00030
00031
00032 int pse51_node_get(pse51_node_t **nodep,
00033 const char *name,
00034 unsigned long magic,
00035 long oflags);
00036
00037
00038
00039
00040 int pse51_node_add(pse51_node_t *node, const char *name, unsigned magic);
00041
00042 int pse51_node_add_start(pse51_node_t *node,
00043 const char *name,
00044 unsigned magic,
00045 xnsynch_t *competion_synch);
00046
00047 void pse51_node_add_finished(pse51_node_t *node, int error);
00048
00049
00050
00051 int pse51_node_put(pse51_node_t *node);
00052
00053
00054
00055 int pse51_node_remove(pse51_node_t **nodep, const char *name, unsigned magic);
00056
00057 #define PSE51_NODE_REMOVED 2
00058
00059 #define pse51_node_ref_p(node) ((node)->refcount)
00060
00061 #define pse51_node_removed_p(node) \
00062 ((node)->flags & PSE51_NODE_REMOVED && !pse51_node_ref_p(node))
00063
00064
00065 typedef struct pse51_desc {
00066 pse51_node_t *node;
00067 long flags;
00068 int fd;
00069 } pse51_desc_t;
00070
00071 int pse51_desc_create(pse51_desc_t **descp, pse51_node_t *node);
00072
00073 int pse51_desc_get(pse51_desc_t **descp, int fd, unsigned magic);
00074
00075 int pse51_desc_destroy(pse51_desc_t *desc);
00076
00077 #define pse51_desc_setflags(desc, fl) ((desc)->flags = (fl))
00078
00079 #define pse51_desc_getflags(desc) ((desc)->flags)
00080
00081 #define pse51_desc_node(desc) ((desc)->node)
00082
00083 #define pse51_desc_fd(desc) ((desc)->fd)
00084
00085 #define PSE51_PERMS_MASK (O_RDONLY | O_WRONLY | O_RDWR)
00086
00087
00088
00089
00090 #if defined(__KERNEL__) && defined(CONFIG_XENO_OPT_PERVASIVE)
00091 struct mm_struct;
00092
00093 #ifdef CONFIG_SMP
00094 extern xnlock_t pse51_assoc_lock;
00095 #endif
00096
00097 typedef xnqueue_t pse51_assocq_t;
00098
00099 typedef struct {
00100 u_long key;
00101 xnholder_t link;
00102
00103 #define link2assoc(laddr) \
00104 ((pse51_assoc_t *)((unsigned long)(laddr) - offsetof(pse51_assoc_t, link)))
00105
00106 } pse51_assoc_t;
00107
00108 typedef struct {
00109 unsigned long kfd;
00110 pse51_assoc_t assoc;
00111
00112 #define assoc2ufd(laddr) \
00113 ((pse51_ufd_t *)((unsigned long) (laddr) - offsetof(pse51_ufd_t, assoc)))
00114 } pse51_ufd_t;
00115
00116 #define pse51_assocq_init(q) (initq(q))
00117
00118 #define pse51_assoc_key(assoc) ((assoc)->key)
00119
00120 void pse51_assocq_destroy(pse51_assocq_t *q, void (*destroy)(pse51_assoc_t *));
00121
00122 int pse51_assoc_insert(pse51_assocq_t *q,
00123 pse51_assoc_t *assoc,
00124 u_long key);
00125
00126 pse51_assoc_t *pse51_assoc_lookup(pse51_assocq_t *q,
00127 u_long key);
00128
00129 pse51_assoc_t *pse51_assoc_remove(pse51_assocq_t *q,
00130 u_long key);
00131 #endif
00132
00133 #endif