1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; indent-tabs-mode: nil -*-
3 ;;; fd-entry.lisp --- FD event structure.
5 ;;; Copyright (C) 2003 Zach Beane <xach@xach.com>
7 ;;; Permission is hereby granted, free of charge, to any person obtaining
8 ;;; a copy of this software and associated documentation files (the
9 ;;; "Software"), to deal in the Software without restriction, including
10 ;;; without limitation the rights to use, copy, modify, merge,publish,
11 ;;; distribute, sublicense, and/or sell copies of the Software, and to
12 ;;; permit persons to whom the Software is furnished to do so, subject to
13 ;;; the following conditions:
15 ;;; The above copyright notice and this permission notice shall be
16 ;;; included in all copies or substantial portions of the Software.
18 ;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 ;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 ;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 ;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22 ;;; LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 ;;; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 ;;; WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 (in-package :io.multiplex
)
30 (deftype fd-event-type
()
31 '(member :read
:write
:error
))
33 (defstruct (fd-event (:constructor make-event
(fd type handler one-shot-p
))
35 (fd nil
:type unsigned-byte
)
36 (type nil
:type fd-event-type
)
37 (handler nil
:type function
)
38 (timer nil
:type
(or null timer
))
39 ;; if an event is not persistent it is removed
40 ;; after it is triggered or if it times out
41 (one-shot-p nil
:type boolean
))
45 (defstruct (fd-entry (:constructor make-fd-entry
(fd))
47 (fd 0 :type unsigned-byte
)
48 (read-event nil
:type
(or null fd-event
))
49 (write-event nil
:type
(or null fd-event
))
50 (error-event nil
:type
(or null fd-event
)))
52 (defun fd-entry-event (fd-entry event-type
)
53 (check-type fd-entry fd-entry
)
54 (check-type event-type fd-event-type
)
56 (:read
(fd-entry-read-event fd-entry
))
57 (:write
(fd-entry-write-event fd-entry
))
58 (:error
(fd-entry-error-event fd-entry
))))
60 (defun (setf fd-entry-event
) (event fd-entry event-type
)
61 (check-type fd-entry fd-entry
)
62 (check-type event-type fd-event-type
)
64 (:read
(setf (fd-entry-read-event fd-entry
) event
))
65 (:write
(setf (fd-entry-write-event fd-entry
) event
))
66 (:error
(setf (fd-entry-error-event fd-entry
) event
))))
68 (defun fd-entry-empty-p (fd-entry)
69 (not (or (fd-entry-read-event fd-entry
)
70 (fd-entry-write-event fd-entry
)
71 (fd-entry-error-event fd-entry
))))
73 (defun fd-entry-all-events (fd-entry)
75 (list (fd-entry-read-event fd-entry
)
76 (fd-entry-write-event fd-entry
)
77 (fd-entry-error-event fd-entry
))))