Branch: Tag:

1998-09-12

1998-09-12 12:53:14 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Added timeout support.

Rev: lib/modules/Protocols.pmod/Line.pmod:1.2

1:   /* -  * $Id: Line.pmod,v 1.1 1998/05/27 20:56:39 grubba Exp $ +  * $Id: Line.pmod,v 1.2 1998/09/12 12:53:14 grubba Exp $    *    * Line-buffered protocol handling.    *
13:    function handle_data;    void handle_command(string data);    +  static int timeout; // Idle time before timeout. +  static int timeout_time; // Time at which next timeout will occur. +  +  static void do_timeout() +  { +  if (con) { +  catch { +  con->close(); +  }; +  catch { +  destruct(con); +  }; +  } +  } +  +  static void _timeout_cb() +  { +  if (timeout > 0) { +  // Timeouts are enabled. +  +  int t = time(); +  +  if (t >= timeout_time) { +  // Time out +  do_timeout(); +  } else { +  // Not yet. +  call_out(_timeout_cb, timeout_time - t); +  } +  } +  } +  +  void touch_time() +  { +  if (timeout > 0) { +  timeout_time = time() + timeout; +  } +  } +     static string multi_line_buffer = "";    static void _handle_command(string line)    {
34:    static string read_buffer = "";    static void read_callback(mixed ignored, string data)    { +  touch_time(); +     read_buffer += data;       while(1) {
56:    static string write_buffer = "";    static void write_callback(mixed ignored)    { +  touch_time(); +     while (!sizeof(write_buffer)) {    if (send_q->is_empty()) {    con->set_write_callback(0);
116:    con = 0;    }    -  void create(object con_) +  void create(object con_, int|void timeout_)    {    con = con_; -  +  timeout = timeout_; +  +  // Start the timeout handler. +  touch_time(); +  _timeout_cb(); +     con->set_nonblocking(read_callback, 0, close_callback);    }   };