ksrc/skins/posix/registry.h

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 /* A pse51_node_t is the holder to be added to each object which needs to be put
00012    in the registry. */
00013 typedef struct pse51_node {
00014     unsigned magic;
00015     unsigned flags;             /* PSE51_NODE_PARTIAL_INIT. */
00016     unsigned refcount;
00017     xnsynch_t *completion_synch;
00018     /* pse51_unlink_t *dest_hook; */
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 /* Get an existing node: oflags are POSIX open style flags.
00030    If 0 is returned and (*nodep) is NULL, then a new node should be added
00031    with node_add*. */
00032 int pse51_node_get(pse51_node_t **nodep,
00033                    const char *name,
00034                    unsigned long magic,
00035                    long oflags);
00036 
00037 /* bind a node : use node_add for simple objects (eg. sem_open), node_add_start
00038    and node_add_finished for objects which need to be initialized outside of any
00039    critical sections (eg. mq_open). */
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 /* Any successful call to node_get or node_add need to be paired with a call
00050    node_put before a node may be unlinked. */
00051 int pse51_node_put(pse51_node_t *node);
00052 
00053 /* Remove the binding of a node to its name, if the node is still referenced,
00054    real destruction is deferred until the last call to node_put. */
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 /* A pse51_desc_t is the structure associated with a descriptor.  */
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 /* Associative lists, used for association of user-space to kernel-space
00089    objects. */
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 /* __KERNEL__ && CONFIG_XENO_OPT_PERVASIVE */    
00132 
00133 #endif /* PSE51_REGISTRY_H */

Generated on Mon Dec 25 13:57:10 2006 for Xenomai API by  doxygen 1.4.6