# SyncQueue

<a id="syncqueue"></a>

# SyncQueue

```cpp
#include <icy/queue.h>

template<class T>
class SyncQueue
```

[Defined in src/base/include/icy/queue.h:285](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L285)

> **Inherits:** [`RunnableQueue< T >`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue)
> **Subclassed by:** [`SyncPacketQueue< T >`](https://auscaster.com/icey/docs/api-reference/icy-SyncPacketQueue.md#syncpacketqueue)

[SyncQueue](#syncqueue) extends [Synchronizer](https://auscaster.com/icey/docs/api-reference/icy-Synchronizer.md#synchronizer) to implement a synchronized FIFO queue which receives T objects from any thread and synchronizes them for safe consumption by the associated event loop.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`SyncQueue`](#syncqueue-1) | `function` | Declared here |
| [`~SyncQueue`](#syncqueue-2) | `function` | Declared here |
| [`push`](#push-3) | `function` | Declared here |
| [`cancel`](#cancel-4) | `function` | Declared here |
| [`sync`](#sync) | `function` | Declared here |
| [`_sync`](#_sync) | `variable` | Declared here |
| [`Queue`](#queue-5) | `typedef` | Declared here |
| [`ondispatch`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#ondispatch) | `variable` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue-1) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`~RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue-2) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`push`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#push-2) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`flush`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#flush-1) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`clear`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#clear-4) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`run`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#run-4) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`runTimeout`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runtimeout) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`dispatch`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#dispatch-1) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`timeout`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#timeout) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`setTimeout`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#settimeout) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`dropped`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#dropped) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`_limit`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#_limit-2) | `variable` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`_timeout`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#_timeout) | `variable` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`_dropped`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#_dropped) | `variable` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue-3) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#operator-79) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue-4) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#operator-80) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`popNext`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#popnext) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`dispatchNext`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#dispatchnext) | `function` | Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue) |
| [`push`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#push) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`push`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#push-1) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`empty`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#empty-3) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`front`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#front) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`back`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#back) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`pop`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#pop) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`sort`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#sort) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`size`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#size-6) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-3) | `function` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`_queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#_queue) | `variable` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`_mutex`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#_mutex-4) | `variable` | Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2) |
| [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-1) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`~Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-2) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`run`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`cancel`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`cancelled`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancelled-3) | `function` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |
| [`exit`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#exit) | `variable` | Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable) |

## Inherited from [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue)

| Kind | Name | Description |
|------|------|-------------|
| `variable` | [`ondispatch`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#ondispatch)  | The default dispatch function. Must be set before the queue is running. |
| `function` | [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue-1) `inline` |  |
| `function` | [`~RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue-2) `virtual` `inline` |  |
| `function` | [`push`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#push-2) `virtual` `inline` | Push an item onto the queue. The queue takes ownership of the item pointer. |
| `function` | [`flush`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#flush-1) `virtual` `inline` | Flush all outgoing items. |
| `function` | [`clear`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#clear-4) `inline` |  |
| `function` | [`run`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#run-4) `virtual` `inline` `override` | Called asynchronously to dispatch queued items. If not timeout is set this method blocks until [cancel()](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7) is called, otherwise [runTimeout()](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runtimeout) will be called. |
| `function` | [`runTimeout`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runtimeout) `virtual` `inline` | Called asynchronously to dispatch queued items until the queue is empty or the timeout expires. Pseudo protected for std::bind compatability. |
| `function` | [`dispatch`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#dispatch-1) `virtual` `inline` | Dispatch a single item to listeners. |
| `function` | [`timeout`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#timeout) `inline` |  |
| `function` | [`setTimeout`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#settimeout) `inline` | Sets the dispatch timeout. Must only be called when the queue is empty. |
| `function` | [`dropped`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#dropped) `const` `inline` |  |
| `variable` | [`_limit`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#_limit-2)  |  |
| `variable` | [`_timeout`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#_timeout)  |  |
| `variable` | [`_dropped`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#_dropped)  |  |
| `function` | [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue-3)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#operator-79)  | Deleted assignment operator. |
| `function` | [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue-4)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#operator-80)  | Deleted assignment operator. |
| `function` | [`popNext`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#popnext) `virtual` `inline` | Pops the next waiting item. |
| `function` | [`dispatchNext`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#dispatchnext) `virtual` `inline` | Pops and dispatches the next waiting item. |

## Inherited from [`Queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-2)

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`push`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#push) `inline` | Appends an item to the back of the queue (thread-safe). |
| `function` | [`push`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#push-1) `inline` | Appends an item to the back of the queue by move (thread-safe). |
| `function` | [`empty`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#empty-3) `const` `inline` |  |
| `function` | [`front`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#front) `const` `inline` |  |
| `function` | [`back`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#back) `const` `inline` |  |
| `function` | [`pop`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#pop) `inline` | Removes the front item from the queue (thread-safe). |
| `function` | [`sort`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#sort) `inline` | Sorts all queued items using the given comparator (thread-safe). |
| `function` | [`size`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#size-6) `const` `inline` |  |
| `function` | [`queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#queue-3) `const` `inline` |  |
| `variable` | [`_queue`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#_queue)  |  |
| `variable` | [`_mutex`](https://auscaster.com/icey/docs/api-reference/icy-Queue.md#_mutex-4)  |  |

## Inherited from [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable)

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-1) `inline` |  |
| `function` | [`~Runnable`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#runnable-2) `virtual` | Defaulted destructor. |
| `function` | [`run`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11) `virtual` | The run method will be called by the asynchronous context. |
| `function` | [`cancel`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7) `virtual` `inline` | Cancel the current task. The [run()](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#run-11) method should return ASAP. |
| `function` | [`cancelled`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancelled-3) `virtual` `const` `inline` | Returns true when the task has been cancelled. |
| `variable` | [`exit`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#exit)  |  |

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`SyncQueue`](#syncqueue-1) `inline` |  |
|  | [`~SyncQueue`](#syncqueue-2) `virtual` `inline` | Destruction is deferred to allow enough time for all callbacks to return. |
| `void` | [`push`](#push-3) `virtual` `inline` `override` | Pushes an item onto the queue and wakes the event loop for dispatch. Ownership of `item` is transferred to the queue. |
| `void` | [`cancel`](#cancel-4) `virtual` `inline` `override` | Cancels the queue and its underlying synchronizer. |
| [`Synchronizer`](https://auscaster.com/icey/docs/api-reference/icy-Synchronizer.md#synchronizer) & | [`sync`](#sync) `inline` |  |

---

<a id="syncqueue-1"></a>

### SyncQueue

`inline`

```cpp
inline SyncQueue(uv::Loop * loop, int limit = 2048, int timeout = 20)
```

[Defined in src/base/include/icy/queue.h:293](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L293)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `loop` | [`uv::Loop`](https://auscaster.com/icey/docs/api-reference/uv.md#loop-1) * | Event loop used by the internal [`Synchronizer`](https://auscaster.com/icey/docs/api-reference/icy-Synchronizer.md#synchronizer). |
| `limit` | `int` | Maximum queued items; oldest are dropped when exceeded. |
| `timeout` | `int` | Dispatch timeout in milliseconds passed to [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue). |

---

<a id="syncqueue-2"></a>

### ~SyncQueue

`virtual` `inline`

```cpp
virtual inline ~SyncQueue()
```

[Defined in src/base/include/icy/queue.h:301](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L301)

Destruction is deferred to allow enough time for all callbacks to return.

---

<a id="push-3"></a>

### push

`virtual` `inline` `override`

```cpp
virtual inline void push(T * item) override
```

[Defined in src/base/include/icy/queue.h:308](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L308)

Pushes an item onto the queue and wakes the event loop for dispatch. Ownership of `item` is transferred to the queue.

#### Reimplements

- [`RunnableQueue::push`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#push-2)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `item` | `T *` | Heap-allocated item to enqueue; the queue takes ownership. |

---

<a id="cancel-4"></a>

### cancel

`virtual` `inline` `override`

```cpp
virtual inline void cancel(bool flag = true) override
```

[Defined in src/base/include/icy/queue.h:316](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L316)

Cancels the queue and its underlying synchronizer.

#### Reimplements

- [`Runnable::cancel`](https://auscaster.com/icey/docs/api-reference/icy-basic-Runnable.md#cancel-7)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `flag` | `bool` | True to cancel, false to un-cancel. |

---

<a id="sync"></a>

### sync

`inline`

```cpp
inline Synchronizer & sync()
```

[Defined in src/base/include/icy/queue.h:328](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L328)

#### Returns
Reference to the underlying [`Synchronizer`](https://auscaster.com/icey/docs/api-reference/icy-Synchronizer.md#synchronizer) handle.

## Protected Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`Synchronizer`](https://auscaster.com/icey/docs/api-reference/icy-Synchronizer.md#synchronizer) | [`_sync`](#_sync)  |  |

---

<a id="_sync"></a>

### _sync

```cpp
Synchronizer _sync
```

Type: [`Synchronizer`](https://auscaster.com/icey/docs/api-reference/icy-Synchronizer.md#synchronizer)

[Defined in src/base/include/icy/queue.h:331](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L331)

## Public Types

| Name | Description |
|------|-------------|
| [`Queue`](#queue-5)  |  |

---

<a id="queue-5"></a>

### Queue

```cpp
using Queue = RunnableQueue< T >
```

Type: [`RunnableQueue`](https://auscaster.com/icey/docs/api-reference/icy-RunnableQueue.md#runnablequeue)< T >

[Defined in src/base/include/icy/queue.h:288](https://github.com/auscaster/icey/blob/main/src/base/include/icy/queue.h#L288)
