summaryrefslogtreecommitdiffstats
path: root/src/pulsecore/asyncmsgq.h
blob: 367ccac29185160b8d77655946ba737c688b9d7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#ifndef foopulseasyncmsgqhfoo
#define foopulseasyncmsgqhfoo

/***
  This file is part of PulseAudio.

  Copyright 2004-2006 Lennart Poettering

  PulseAudio is free software; you can redistribute it and/or modify
  it under the terms of the GNU Lesser General Public License as
  published by the Free Software Foundation; either version 2.1 of the
  License, or (at your option) any later version.

  PulseAudio is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
***/

#include <sys/types.h>

#include <pulsecore/asyncq.h>
#include <pulsecore/memchunk.h>
#include <pulsecore/msgobject.h>

/* A simple asynchronous message queue, based on pa_asyncq. In
 * contrast to pa_asyncq this one is multiple-writer safe, though
 * still not multiple-reader safe. This queue is intended to be used
 * for controlling real-time threads from normal-priority
 * threads. Multiple-writer-safety is accomplished by using a mutex on
 * the writer side. This queue is thus not useful for communication
 * between several real-time threads.
 *
 * The queue takes messages consisting of:
 *    "Object" for which this messages is intended (may be NULL)
 *    A numeric message code
 *    Arbitrary userdata pointer (may be NULL)
 *    A memchunk (may be NULL)
 *
 * There are two functions for submitting messages: _post and
 * _send. The former just enqueues the message asynchronously, the
 * latter waits for completion, synchronously. */

enum {
    PA_MESSAGE_SHUTDOWN = -1/* A generic message to inform the handler of this queue to quit */
};

typedef struct pa_asyncmsgq pa_asyncmsgq;

pa_asyncmsgq* pa_asyncmsgq_new(unsigned size);
pa_asyncmsgq* pa_asyncmsgq_ref(pa_asyncmsgq *q);

void pa_asyncmsgq_unref(pa_asyncmsgq* q);

void pa_asyncmsgq_post(pa_asyncmsgq *q, pa_msgobject *object, int code, const void *userdata, int64_t offset, const pa_memchunk *memchunk, pa_free_cb_t userdata_free_cb);
int pa_asyncmsgq_send(pa_asyncmsgq *q, pa_msgobject *object, int code, const void *userdata, int64_t offset, const pa_memchunk *memchunk);

int pa_asyncmsgq_get(pa_asyncmsgq *q, pa_msgobject **object, int *code, void **userdata, int64_t *offset, pa_memchunk *memchunk, bool wait);
int pa_asyncmsgq_dispatch(pa_msgobject *object, int code, void *userdata, int64_t offset, pa_memchunk *memchunk);
void pa_asyncmsgq_done(pa_asyncmsgq *q, int ret);
int pa_asyncmsgq_wait_for(pa_asyncmsgq *a, int code);
int pa_asyncmsgq_process_one(pa_asyncmsgq *a);

void pa_asyncmsgq_flush(pa_asyncmsgq *a, bool run);

/* For the reading side */
int pa_asyncmsgq_read_fd(pa_asyncmsgq *q);
int pa_asyncmsgq_read_before_poll(pa_asyncmsgq *a);
void pa_asyncmsgq_read_after_poll(pa_asyncmsgq *a);

/* For the write side */
int pa_asyncmsgq_write_fd(pa_asyncmsgq *q);
void pa_asyncmsgq_write_before_poll(pa_asyncmsgq *a);
void pa_asyncmsgq_write_after_poll(pa_asyncmsgq *a);

bool pa_asyncmsgq_dispatching(pa_asyncmsgq *a);

#endif