X-Git-Url: https://git.distorted.org.uk/~mdw/mLib/blobdiff_plain/1226c514d496f4552b43682c8ca3dde7d87f952a..78b1464e4a78dc364ecc8aebcfd5ec13b3f6bb07:/sel.h diff --git a/sel.h b/sel.h index c2aa57f..338ea20 100644 --- a/sel.h +++ b/sel.h @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: sel.h,v 1.5 1999/08/19 18:30:26 mdw Exp $ + * $Id: sel.h,v 1.8 2001/06/22 19:35:58 mdw Exp $ * * I/O multiplexing support * @@ -30,6 +30,15 @@ /*----- Revision history --------------------------------------------------* * * $Log: sel.h,v $ + * Revision 1.8 2001/06/22 19:35:58 mdw + * Fix a large number of bugs. + * + * 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). @@ -49,8 +58,8 @@ * */ -#ifndef SEL_H -#define SEL_H +#ifndef MLIB_SEL_H +#define MLIB_SEL_H #ifdef __cplusplus extern "C" { @@ -107,49 +116,51 @@ */ 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 */ + struct sel_pendfile *pend; /* Pending file information */ } 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 */ + struct sel_pendtimer *pend; /* Pending timer information */ } 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 --- * @@ -162,10 +173,10 @@ typedef void (*sel_hookfn)(sel_state */*s*/, 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 ------------------------------------------------*/ @@ -226,6 +237,20 @@ extern void sel_addfile(sel_file */*f*/); 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