This module allows high-level and efficient I/O multiplexing.
Supported OS primitives: epoll, kqueue, poll and Windows select.
To use threadsafe version of this module, it needs to be compiled with both -d:threadsafe and --threads:on options.
Supported features: files, sockets, pipes, timers, processes, signals and user events.
Fully supported OS: MacOSX, FreeBSD, OpenBSD, NetBSD, Linux (except for Android).
Partially supported OS: Windows (only sockets and user events), Solaris (files, sockets, handles and user events). Android (files, sockets, handles and user events).
TODO: /dev/poll, event ports and filesystem events.
Selector[T] = ref object
Event {...}{.pure.} = enum
Read, ## Descriptor is available for read
Write, ## Descriptor is available for write
Timer, ## Timer descriptor is completed
Signal, ## Signal is raised
Process, ## Process is finished
Vnode, ## BSD specific file change
User, ## User event is raised
Error, ## Error occurred while waiting for descriptor
VnodeWrite, ## NOTE_WRITE (BSD specific, write to file occurred)
VnodeDelete, ## NOTE_DELETE (BSD specific, unlink of file occurred)
VnodeExtend, ## NOTE_EXTEND (BSD specific, file extended)
VnodeAttrib, ## NOTE_ATTRIB (BSD specific, file attributes changed)
VnodeLink, ## NOTE_LINK (BSD specific, file link count changed)
VnodeRename, ## NOTE_RENAME (BSD specific, file renamed)
VnodeRevoke ## NOTE_REVOKE (BSD specific, file revoke occurred)ReadyKey = object
fd*: int ## file/socket descriptor
events*: set[Event] ## set of events
errorCode*: OSErrorCode ## additional error code information for
## Error eventsSelectEvent = object
ioselSupportedPlatform = false
ioselectors module. proc newSelector[T](): Selector[T]
proc close[T](s: Selector[T])
proc registerHandle[T](s: Selector[T]; fd: int | SocketHandle; events: set[Event];
data: T)fd to selector s with events set in events. The data is application-defined data, which will be passed when an event is triggered. proc updateHandle[T](s: Selector[T]; fd: int | SocketHandle; events: set[Event])
fd, registered in selector s with new events set event. proc registerTimer[T](s: Selector[T]; timeout: int; oneshot: bool; data: T): int {...}{.
discardable.}Registers timer notification with timeout (in milliseconds) to selector s.
If oneshot is true, timer will be notified only once.
Set oneshot to false if you want periodic notifications.
The data is application-defined data, which will be passed, when the timer is triggered.
Returns the file descriptor for the registered timer.
proc registerSignal[T](s: Selector[T]; signal: int; data: T): int {...}{.discardable.}Registers Unix signal notification with signal to selector s.
The data is application-defined data, which will be passed when signal raises.
Returns the file descriptor for the registered signal.
Note: This function is not supported on Windows.
proc registerProcess[T](s: Selector[T]; pid: int; data: T): int {...}{.discardable.}Registers a process id (pid) notification (when process has exited) in selector s.
The data is application-defined data, which will be passed when process with pid has exited.
Returns the file descriptor for the registered signal.
proc registerEvent[T](s: Selector[T]; ev: SelectEvent; data: T)
Registers selector event ev in selector s.
The data is application-defined data, which will be passed when ev happens.
proc registerVnode[T](s: Selector[T]; fd: cint; events: set[Event]; data: T)
Registers selector BSD/MacOSX specific vnode events for file descriptor fd and events events. data application-defined data, which to be passed, when vnode event happens.
Note: This function is supported only by BSD and MacOSX.
proc newSelectEvent(): SelectEvent {...}{.raises: [], tags: [].}proc trigger(ev: SelectEvent) {...}{.raises: [], tags: [].}ev. proc close(ev: SelectEvent) {...}{.raises: [], tags: [].}ev. proc unregister[T](s: Selector[T]; ev: SelectEvent)
ev from selector s. proc unregister[T](s: Selector[T]; fd: int | SocketHandle | cint)
fd from selector s. proc selectInto[T](s: Selector[T]; timeout: int; results: var openArray[ReadyKey]): int
Waits for events registered in selector s.
The timeout argument specifies the maximum number of milliseconds the function will be blocked for if no events are ready. Specifying a timeout of -1 causes the function to block indefinitely. All available events will be stored in results array.
Returns number of triggered events.
proc select[T](s: Selector[T]; timeout: int): seq[ReadyKey]
Waits for events registered in selector s.
The timeout argument specifies the maximum number of milliseconds the function will be blocked for if no events are ready. Specifying a timeout of -1 causes the function to block indefinitely.
Returns a list of triggered events.
proc getData[T](s: Selector[T]; fd: SocketHandle | int): var T
data associated with descriptor fd. If specified descriptor fd is not registered, empty/default value will be returned. proc setData[T](s: Selector[T]; fd: SocketHandle | int; data: var T): bool
Associate application-defined data with descriptor fd.
Returns true, if data was succesfully updated, false otherwise.
proc contains[T](s: Selector[T]; fd: SocketHandle | int): bool {...}{.inline.}proc getFd[T](s: Selector[T]): int
Retrieves the underlying selector's file descriptor.
For poll and select selectors -1 is returned.
proc register[T](s: Selector[T]; fd: int | SocketHandle; events: set[Event]; data: T) {...}{.
deprecated: "use registerHandle instead".}registerHandle instead. proc setEvent(ev: SelectEvent) {...}{.deprecated: "use trigger instead", raises: [],
tags: [].}Trigger event ev.
Deprecated since v0.18.0: Use trigger instead.
proc update[T](s: Selector[T]; fd: int | SocketHandle; events: set[Event]) {...}{.
deprecated: "use updateHandle instead".}Update file/socket descriptor fd, registered in selector s with new events set event.
Deprecated since v0.18.0: Use updateHandle instead.
template isEmpty[T](s: Selector[T]): bool
true, if there are no registered events or descriptors in selector. template withData[T; ](s: Selector[T]; fd: SocketHandle | int; value, body: untyped)
fd to value. This value can be modified in the scope of the withData call.s.withData(fd, value) do: # block is executed only if ``fd`` registered in selector ``s`` value.uid = 1000
template withData[T; ](s: Selector[T]; fd: SocketHandle | int;
value, body1, body2: untyped)fd to value. This value can be modified in the scope of the withData call.s.withData(fd, value) do: # block is executed only if ``fd`` registered in selector ``s``. value.uid = 1000 do: # block is executed if ``fd`` not registered in selector ``s``. raise
© 2006–2018 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/selectors.html