/* -*-c-*-
*
- * $Id: sel.h,v 1.5 1999/08/19 18:30:26 mdw Exp $
+ * $Id: sel.h,v 1.7 1999/12/10 23:42:04 mdw Exp $
*
* I/O multiplexing support
*
/*----- Revision history --------------------------------------------------*
*
* $Log: sel.h,v $
+ * Revision 1.7 1999/12/10 23:42:04 mdw
+ * Change header file guard names.
+ *
+ * Revision 1.6 1999/08/31 17:42:22 mdw
+ * New function `sel_force' to force a descriptor to be `selected'.
+ *
* Revision 1.5 1999/08/19 18:30:26 mdw
* Implement hooks for foreign select-using systems (currently not well
* tested).
*
*/
-#ifndef SEL_H
-#define SEL_H
+#ifndef MLIB_SEL_H
+#define MLIB_SEL_H
#ifdef __cplusplus
extern "C" {
*/
enum {
- SEL_READ,
- SEL_WRITE,
- SEL_EXC,
- SEL_MODES
+ SEL_READ, /* File is ready to read */
+ SEL_WRITE, /* File is ready to write */
+ SEL_EXC, /* Something odd has happened */
+ SEL_MODES /* Number of modes available */
};
typedef struct sel_state {
- struct sel_file *files;
- struct sel_timer *timers;
- struct sel_hook *hooks;
- fd_set fd[SEL_MODES];
- struct timeval tv;
+ struct sel_file *files[SEL_MODES]; /* Lists of interesting files */
+ struct sel_timer *timers; /* List of timers */
+ struct sel_hook *hooks; /* List of hook functions applied */
+ fd_set fd[SEL_MODES]; /* Quick reference table for files */
+ struct sel_args *args; /* Pointer to arguments */
} sel_state;
/* --- Listening for a file --- */
typedef struct sel_file {
- struct sel_file *next;
- struct sel_file *prev;
- struct sel_state *s;
- int fd;
- unsigned mode;
- void (*func)(int /*fd*/, unsigned /*mode*/, void */*p*/);
- void *p;
+ struct sel_file *next; /* Next file in the list */
+ struct sel_file *prev; /* Previous file in the list */
+ struct sel_state *s; /* Pointer to select multiplexor */
+ int fd; /* File descriptor */
+ unsigned mode; /* Interesting event for file */
+ void (*func)(int /*fd*/, unsigned /*mode*/, void */*p*/); /* Handler */
+ void *p; /* Argument for the handler */
} sel_file;
/* --- Waiting for a timeout --- */
typedef struct sel_timer {
- struct sel_timer *next;
- struct sel_timer *prev;
- struct timeval tv;
- void (*func)(struct timeval */*tv*/, void */*p*/);
- void *p;
+ struct sel_timer *next; /* Next timer in the list */
+ struct sel_timer *prev; /* Previous timer in the list */
+ struct timeval tv; /* Real time when timer should go */
+ void (*func)(struct timeval */*tv*/, void */*p*/); /* Handler function */
+ void *p; /* Argument for the handler */
} sel_timer;
/* --- A select argument block --- */
typedef struct sel_args {
- int maxfd;
- fd_set fd[SEL_MODES];
- struct timeval tv, *tvp;
- struct timeval now;
+ int maxfd; /* Highest-numbered file */
+ fd_set fd[SEL_MODES]; /* Bit flags for all the files */
+ struct timeval tv, *tvp; /* Time to return */
+ struct timeval now; /* Current time */
} sel_args;
/* --- A selector hook --- *
void */*p*/);
typedef struct sel_hook {
- struct sel_hook *next;
- struct sel_hook *prev;
- sel_hookfn before, after;
- void *p;
+ struct sel_hook *next; /* Next hook in the list */
+ struct sel_hook *prev; /* Previous hook in the list */
+ sel_hookfn before, after; /* Hook functions */
+ void *p; /* Argument for the hook functions */
} sel_hook;
/*----- Functions provided ------------------------------------------------*/
extern void sel_rmfile(sel_file */*f*/);
+/* --- @sel_force@ --- *
+ *
+ * Arguments: @sel_file *f@ = pointer to file selector
+ *
+ * Returns: ---
+ *
+ * Use: Forces a file selector to be considered ready. This is only
+ * useful during a call to @sel_select@. Of particular use is
+ * forcing a write selector when there's something interesting
+ * ready for it.
+ */
+
+extern void sel_force(sel_file */*f*/);
+
/* --- @sel_addtimer@ --- *
*
* Arguments: @sel_state *s@ = pointer to a state block