/* 
 * $Id: select.h,v 1.2 2001/07/13 18:10:16 ljb Exp $
 */

#ifndef _SELECT_H
#define _SELECT_H

#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif /* HAVE_SYS_SELECT_H */

#ifdef NT
#include <Winsock2.h>
#endif /* NT */

#include <linked_list.h>

#include <mrt_thread.h>

/* select type_mask */
#define SELECT_READ		1
#define SELECT_WRITE		2
#define SELECT_EXCEPTION	4

typedef struct _Descriptor_Struct {
   char *name;
   /* int marked_for_deletion; */
   int fd;
   u_long type_mask;	/* SELECT_READ | SELECT_WRITE | SELECT_EXCEPTION */
#ifdef notdef
   void (*call_fn)();
   void *arg;
#else
   event_t *event;
#endif
   schedule_t *schedule;
  time_t	timed;
} Descriptor_Struct;


typedef struct _Select_Struct {
  int		interrupt_fd[2];
  pthread_mutex_t     	mutex_lock;
  pthread_t		self;
  fd_set 	fdvar_read;
  fd_set 	fdvar_write;
  fd_set 	fdvar_except;
  LINKED_LIST 	*ll_descriptors;
  trace_t	*trace;
  LINKED_LIST *ll_close_fds;
} Select_Struct;

extern Select_Struct *SELECT_MASTER;

/* publich functions */
int select_shutdown (void);
int init_select (trace_t *trace);
int start_select (void);
int select_add_fd_event (char *name, int fd, u_long type_mask, int on,
                schedule_t *schedule, event_fn_t call_fn, int narg, ...);
int select_add_fd_event_timed (char *name, int fd, u_long type_mask, int on,
     time_t timed, schedule_t *schedule, event_fn_t call_fn, int narg, ...);
int select_add_fd (int fd, u_long type_mask, void (*call_fn)(), void *arg);
int select_delete_fd (int fd);
int select_delete_fd2 (int fd);
int mrt_select (void);
int mrt_select2 (int ms);
int select_enable_fd (int fd);
int select_enable_fd_mask (int fd, u_long mask);
int select_add_fd_off (int fd, u_long type_mask, void (*call_fn) (), void *arg);
void socket_set_nonblocking (int sockfd, int yes);

#define select_delete_fdx(fd) {if (select_delete_fd(fd) < 0) close(fd);}
#endif /* _SELECT_H */


syntax highlighted by Code2HTML, v. 0.9.1