Here is the new proposed API for file descriptors:
struct xnfd_ops {
int (*destroy)(struct xnfd *fd);
int (*select_bind)(struct xnfd *fd, struct xnselector *selector,
unsigned type, unsigned index);
};
struct xnfd {
unsigned magic;
struct mm_struct *mm;
int ufd;
struct xnfd_ops *ops;
unsigned refs;
struct hlist_node hlink; /* Link in global hash */
struct list_head link; /* Link in per-process queue */
};
int xnfd_enter(struct xnfd *xnfd, unsigned magic, int ufd,
struct mm_struct *mm, struct xnfd_ops *ops);
struct xnfd *xnfd_get(int ufd, struct mm_struct *mm, unsigned magic);
int xnfd_put(struct xnfd *xnfd);
int xnfd_close(struct xnfd *xnfd);
The xnfd structure has to be put inside larger structure, and
container_of used to access the larger structure. The magic is there to
cope with the fact that different file descriptors users will have
different structures, so the actual type has to be found before using
container_of.
refs is incrementer on get, decremented on put, when it reaches 0, the
"destroy" callback is called, this in order to avoid destroying a file
descriptor under another file descriptor user's feet.
xnfd_close negates the magic in order to render the file descriptor invalid.
the select_bind callbacks is needed to implement select uniformly.
If nobody disagrees with this API, I will start implementing ASAP, and
rebase the message queues code upon this.
--
Gilles.
_______________________________________________
Xenomai mailing list
[email protected]
http://www.xenomai.org/mailman/listinfo/xenomai