| --- | |
| 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) | |
| ``` | |