(* $Id$ *)

open Unixqueue_util

class type sb_event_system =
object
  (* Public interface *)
  method new_group : unit -> group
  method new_wait_id : unit -> wait_id
  method exists_resource : operation -> bool
  method add_resource : group -> (operation * float) -> unit
  method add_weak_resource : group -> (operation * float) -> unit
  method add_close_action : group -> (Unix.file_descr * (Unix.file_descr -> unit)) -> unit
  method add_abort_action : group -> (group -> exn -> unit) -> unit
  method remove_resource : group -> operation -> unit
  method add_handler : group -> (Unixqueue.event_system -> event Equeue.t -> event -> unit) -> unit
  method add_event : event -> unit
  method clear : group -> unit
  method run : unit -> unit
  method is_running : bool
  method when_blocking : (unit -> unit) -> unit
  (* Protected interface *)
  method private setup : unit -> (Unix.file_descr list * Unix.file_descr list * Unix.file_descr list * float)
  method private queue_events : (Unix.file_descr list * Unix.file_descr list * Unix.file_descr list) -> bool
  method private source : event Equeue.t -> unit
end


class select_based_event_system : unit -> sb_event_system
  (** This the old [Unix.select]-based imeplementation of event systems
      which was the default one until Ocamlnet-2.2.

      Please avoid in new code. This module merely exists to allow
      comparisons between the old implementation and the new one.

      Note that this class definition also includes some private
      methods. These are required in some other Unixqueue implementations
      inheriting from this class.
   *)

val select_based_event_system : unit -> Unixqueue.event_system
  (** Create a new [Unix.select]-based event system *)
