blob: 409169f9ae29add0b3982aed0466fe1bf936381c [file] [view]
---
layout: doc
title: "Starboard Module Reference: socket_waiter.h"
---
Allows a thread to wait on many sockets at once. The standard usage pattern
would be for a single I/O thread to:
1. Create its own SbSocketWaiter.
1. Wait on the SbSocketWaiter, indefinitely if no scheduled tasks, or timed if
there are scheduled future tasks.
1. While waiting, the SbSocketWaiter will call back to service ready SbSockets.
1. Wake up, if signaled to do so.
1. If ready to exit, go to 7.
1. Add and remove SbSockets to and from the SbSocketWaiter, and go to 2.
1. Destroy its SbSocketWaiter and exit.
If another thread wants to queue immediate or schedule future work on the I/O
thread, it needs to call SbSocketWaiterWakeUp() on the SbSocketWaiter after
queuing the work item, or the SbSocketWaiter is not otherwise guaranteed to wake
up.
## Macros ##
### kSbSocketWaiterInvalid ###
Well-defined value for an invalid socket watcher handle.
## Enums ##
### SbSocketWaiterInterest ###
All the interests that a socket may register for on a waiter.
#### Values ####
* `kSbSocketWaiterInterestNone`
No interests whatsoever.
* `kSbSocketWaiterInterestRead`
An interest in or readiness to read from a socket without blocking.
* `kSbSocketWaiterInterestWrite`
An interest in or readiness to write to a socket without blocking.
### SbSocketWaiterResult ###
Possible reasons why a call to SbSocketWaiterWaitTimed returned.
#### Values ####
* `kSbSocketWaiterResultInvalid`
The wait didn't block because the waiter was invalid.
* `kSbSocketWaiterResultTimedOut`
The wait stopped because the timeout expired.
* `kSbSocketWaiterResultWokenUp`
The wait stopped because a call to SbSocketWaiterWakeUp was consumed.
## Typedefs ##
### SbSocketWaiter ###
A handle to a socket waiter.
#### Definition ####
```
typedef SbSocketWaiterPrivate* SbSocketWaiter
```
### SbSocketWaiterCallback ###
Function pointer for socket waiter callbacks.
#### Definition ####
```
typedef void(* SbSocketWaiterCallback) (SbSocketWaiter waiter, SbSocket socket, void *context, int ready_interests)
```
## Functions ##
### SbSocketWaiterAdd ###
Adds a new socket to be waited on by the `waiter` with a bitfield of
`interests`. This function should only be called on the thread that waits on
this waiter.
If `socket` is already registered with this or another waiter, the function does
nothing and returns `false`. The client must remove the socket and then add it
back with the new `interests`.
If `socket` is already ready for one or more of the operations set in the
`interests` mask, then the callback will be called on the next call to either
SbSocketWaiterWait() or SbSocketWaiterWaitTimed().
`waiter`: An SbSocketWaiter that waits on the socket for the specified set of
operations (`interests`). `socket`: The SbSocket on which the waiter waits.
`context`: `callback`: The function that is called when the event fires. The
`waiter`, `socket`, `context` are all passed to the callback, along with a
bitfield of `interests` that the socket is actually ready for. `interests`: A
bitfield that identifies operations for which the socket is waiting.
`persistent`: Identifies the procedure that will be followed for removing the
socket:
* If `persistent` is `true`, then `socket` stays registered with `waiter`
until SbSocketWaiterRemove() is called with `waiter` and `socket`.
* If `persistent` is `false`, then `socket` is removed after the next call to
`callback`, even if not all registered `interests` became ready.
#### Declaration ####
```
bool SbSocketWaiterAdd(SbSocketWaiter waiter, SbSocket socket, void *context, SbSocketWaiterCallback callback, int interests, bool persistent)
```
### SbSocketWaiterCreate ###
The results of two threads waiting on the same waiter is undefined and will not
work. Except for the SbSocketWaiterWakeUp() function, SbSocketWaiters are not
thread-safe and don't expect to be modified concurrently.
#### Declaration ####
```
SbSocketWaiter SbSocketWaiterCreate()
```
### SbSocketWaiterDestroy ###
Destroys `waiter` and removes all sockets still registered by way of
SbSocketWaiterAdd. This function may be called on any thread as long as there is
no risk of concurrent access to the waiter.
`waiter`: The SbSocketWaiter to be destroyed.
#### Declaration ####
```
bool SbSocketWaiterDestroy(SbSocketWaiter waiter)
```
### SbSocketWaiterIsValid ###
Returns whether the given socket handle is valid.
#### Declaration ####
```
static bool SbSocketWaiterIsValid(SbSocketWaiter watcher)
```
### SbSocketWaiterRemove ###
Removes a socket, previously added with SbSocketWaiterAdd(), from a waiter. This
function should only be called on the thread that waits on this waiter.
The return value indicates whether the waiter still waits on the socket. If
`socket` wasn't registered with `waiter`, then the function is a no-op and
returns `true`.
`waiter`: The waiter from which the socket is removed. `socket`: The socket to
remove from the waiter.
#### Declaration ####
```
bool SbSocketWaiterRemove(SbSocketWaiter waiter, SbSocket socket)
```
### SbSocketWaiterWait ###
Waits on all registered sockets, calling the registered callbacks if and when
the corresponding sockets become ready for an interested operation. This version
exits only after SbSocketWaiterWakeUp() is called. This function should only be
called on the thread that waits on this waiter.
#### Declaration ####
```
void SbSocketWaiterWait(SbSocketWaiter waiter)
```
### SbSocketWaiterWaitTimed ###
Behaves similarly to SbSocketWaiterWait(), but this function also causes
`waiter` to exit on its own after at least `duration` has passed if
SbSocketWaiterWakeUp() it not called by that time.
The return value indicates the reason that the socket waiter exited. This
function should only be called on the thread that waits on this waiter.
`duration`: The minimum amount of time after which the socket waiter should exit
if it is not woken up before then. As with SbThreadSleep() (see thread.h), this
function may wait longer than `duration`, such as if the timeout expires while a
callback is being fired.
#### Declaration ####
```
SbSocketWaiterResult SbSocketWaiterWaitTimed(SbSocketWaiter waiter, SbTime duration)
```
### SbSocketWaiterWakeUp ###
Wakes up `waiter` once. This is the only thread-safe waiter function. It can can
be called from a SbSocketWaiterCallback to wake up its own waiter, and it can
also be called from another thread at any time. In either case, the waiter will
exit the next wait gracefully, first completing any in-progress callback.
Each time this function is called, it causes the waiter to wake up once,
regardless of whether the waiter is currently waiting. If the waiter is not
waiting, the function takes effect immediately the next time the waiter waits.
The number of wake-ups accumulates, and the queue is only consumed as the waiter
waits and then is subsequently woken up again. For example, if you call this
function 7 times, then SbSocketWaiterWait() and WaitTimed() will not block the
next 7 times they are called.
`waiter`: The socket waiter to be woken up.
#### Declaration ####
```
void SbSocketWaiterWakeUp(SbSocketWaiter waiter)
```