mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-06 13:29:56 -05:00
modernize pa_iochannel a bit, add pa_iochannel_get_send_fd()
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1957 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
c4d9a2bf85
commit
55e4a3e221
3 changed files with 52 additions and 46 deletions
|
|
@ -58,11 +58,11 @@ struct pa_iochannel {
|
|||
pa_iochannel_cb_t callback;
|
||||
void*userdata;
|
||||
|
||||
int readable;
|
||||
int writable;
|
||||
int hungup;
|
||||
pa_bool_t readable;
|
||||
pa_bool_t writable;
|
||||
pa_bool_t hungup;
|
||||
|
||||
int no_close;
|
||||
pa_bool_t no_close;
|
||||
|
||||
pa_io_event* input_event, *output_event;
|
||||
};
|
||||
|
|
@ -90,7 +90,7 @@ static void enable_mainloop_sources(pa_iochannel *io) {
|
|||
|
||||
static void callback(pa_mainloop_api* m, pa_io_event *e, int fd, pa_io_event_flags_t f, void *userdata) {
|
||||
pa_iochannel *io = userdata;
|
||||
int changed = 0;
|
||||
pa_bool_t changed = FALSE;
|
||||
|
||||
pa_assert(m);
|
||||
pa_assert(e);
|
||||
|
|
@ -98,19 +98,19 @@ static void callback(pa_mainloop_api* m, pa_io_event *e, int fd, pa_io_event_fla
|
|||
pa_assert(userdata);
|
||||
|
||||
if ((f & (PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR)) && !io->hungup) {
|
||||
io->hungup = 1;
|
||||
changed = 1;
|
||||
io->hungup = TRUE;
|
||||
changed = TRUE;
|
||||
}
|
||||
|
||||
if ((f & PA_IO_EVENT_INPUT) && !io->readable) {
|
||||
io->readable = 1;
|
||||
changed = 1;
|
||||
io->readable = TRUE;
|
||||
changed = TRUE;
|
||||
pa_assert(e == io->input_event);
|
||||
}
|
||||
|
||||
if ((f & PA_IO_EVENT_OUTPUT) && !io->writable) {
|
||||
io->writable = 1;
|
||||
changed = 1;
|
||||
io->writable = TRUE;
|
||||
changed = TRUE;
|
||||
pa_assert(e == io->output_event);
|
||||
}
|
||||
|
||||
|
|
@ -136,10 +136,10 @@ pa_iochannel* pa_iochannel_new(pa_mainloop_api*m, int ifd, int ofd) {
|
|||
|
||||
io->userdata = NULL;
|
||||
io->callback = NULL;
|
||||
io->readable = 0;
|
||||
io->writable = 0;
|
||||
io->hungup = 0;
|
||||
io->no_close = 0;
|
||||
io->readable = FALSE;
|
||||
io->writable = FALSE;
|
||||
io->hungup = FALSE;
|
||||
io->no_close = FALSE;
|
||||
|
||||
io->input_event = io->output_event = NULL;
|
||||
|
||||
|
|
@ -182,19 +182,19 @@ void pa_iochannel_free(pa_iochannel*io) {
|
|||
pa_xfree(io);
|
||||
}
|
||||
|
||||
int pa_iochannel_is_readable(pa_iochannel*io) {
|
||||
pa_bool_t pa_iochannel_is_readable(pa_iochannel*io) {
|
||||
pa_assert(io);
|
||||
|
||||
return io->readable || io->hungup;
|
||||
}
|
||||
|
||||
int pa_iochannel_is_writable(pa_iochannel*io) {
|
||||
pa_bool_t pa_iochannel_is_writable(pa_iochannel*io) {
|
||||
pa_assert(io);
|
||||
|
||||
return io->writable && !io->hungup;
|
||||
}
|
||||
|
||||
int pa_iochannel_is_hungup(pa_iochannel*io) {
|
||||
pa_bool_t pa_iochannel_is_hungup(pa_iochannel*io) {
|
||||
pa_assert(io);
|
||||
|
||||
return io->hungup;
|
||||
|
|
@ -208,9 +208,8 @@ ssize_t pa_iochannel_write(pa_iochannel*io, const void*data, size_t l) {
|
|||
pa_assert(l);
|
||||
pa_assert(io->ofd >= 0);
|
||||
|
||||
r = pa_write(io->ofd, data, l, &io->ofd_type);
|
||||
if (r >= 0) {
|
||||
io->writable = 0;
|
||||
if ((r = pa_write(io->ofd, data, l, &io->ofd_type)) >= 0) {
|
||||
io->writable = FALSE;
|
||||
enable_mainloop_sources(io);
|
||||
}
|
||||
|
||||
|
|
@ -224,9 +223,8 @@ ssize_t pa_iochannel_read(pa_iochannel*io, void*data, size_t l) {
|
|||
pa_assert(data);
|
||||
pa_assert(io->ifd >= 0);
|
||||
|
||||
r = pa_read(io->ifd, data, l, &io->ifd_type);
|
||||
if (r >= 0) {
|
||||
io->readable = 0;
|
||||
if ((r = pa_read(io->ifd, data, l, &io->ifd_type)) >= 0) {
|
||||
io->readable = FALSE;
|
||||
enable_mainloop_sources(io);
|
||||
}
|
||||
|
||||
|
|
@ -235,7 +233,7 @@ ssize_t pa_iochannel_read(pa_iochannel*io, void*data, size_t l) {
|
|||
|
||||
#ifdef HAVE_CREDS
|
||||
|
||||
int pa_iochannel_creds_supported(pa_iochannel *io) {
|
||||
pa_bool_t pa_iochannel_creds_supported(pa_iochannel *io) {
|
||||
struct sockaddr_un sa;
|
||||
socklen_t l;
|
||||
|
||||
|
|
@ -309,14 +307,14 @@ ssize_t pa_iochannel_write_with_creds(pa_iochannel*io, const void*data, size_t l
|
|||
mh.msg_flags = 0;
|
||||
|
||||
if ((r = sendmsg(io->ofd, &mh, MSG_NOSIGNAL)) >= 0) {
|
||||
io->writable = 0;
|
||||
io->writable = FALSE;
|
||||
enable_mainloop_sources(io);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
ssize_t pa_iochannel_read_with_creds(pa_iochannel*io, void*data, size_t l, pa_creds *creds, int *creds_valid) {
|
||||
ssize_t pa_iochannel_read_with_creds(pa_iochannel*io, void*data, size_t l, pa_creds *creds, pa_bool_t *creds_valid) {
|
||||
ssize_t r;
|
||||
struct msghdr mh;
|
||||
struct iovec iov;
|
||||
|
|
@ -358,12 +356,12 @@ ssize_t pa_iochannel_read_with_creds(pa_iochannel*io, void*data, size_t l, pa_cr
|
|||
|
||||
creds->gid = u.gid;
|
||||
creds->uid = u.uid;
|
||||
*creds_valid = 1;
|
||||
*creds_valid = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
io->readable = 0;
|
||||
io->readable = FALSE;
|
||||
enable_mainloop_sources(io);
|
||||
}
|
||||
|
||||
|
|
@ -379,10 +377,10 @@ void pa_iochannel_set_callback(pa_iochannel*io, pa_iochannel_cb_t _callback, voi
|
|||
io->userdata = userdata;
|
||||
}
|
||||
|
||||
void pa_iochannel_set_noclose(pa_iochannel*io, int b) {
|
||||
void pa_iochannel_set_noclose(pa_iochannel*io, pa_bool_t b) {
|
||||
pa_assert(io);
|
||||
|
||||
io->no_close = b;
|
||||
io->no_close = !!b;
|
||||
}
|
||||
|
||||
void pa_iochannel_socket_peer_to_string(pa_iochannel*io, char*s, size_t l) {
|
||||
|
|
@ -416,3 +414,9 @@ int pa_iochannel_get_recv_fd(pa_iochannel *io) {
|
|||
|
||||
return io->ifd;
|
||||
}
|
||||
|
||||
int pa_iochannel_get_send_fd(pa_iochannel *io) {
|
||||
pa_assert(io);
|
||||
|
||||
return io->ofd;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
|
||||
#include <pulse/mainloop-api.h>
|
||||
#include <pulsecore/creds.h>
|
||||
#include <pulsecore/macro.h>
|
||||
|
||||
/* A wrapper around UNIX file descriptors for attaching them to the a
|
||||
main event loop. Everytime new data may be read or be written to
|
||||
|
|
@ -58,20 +59,20 @@ ssize_t pa_iochannel_write(pa_iochannel*io, const void*data, size_t l);
|
|||
ssize_t pa_iochannel_read(pa_iochannel*io, void*data, size_t l);
|
||||
|
||||
#ifdef HAVE_CREDS
|
||||
int pa_iochannel_creds_supported(pa_iochannel *io);
|
||||
pa_bool_t pa_iochannel_creds_supported(pa_iochannel *io);
|
||||
int pa_iochannel_creds_enable(pa_iochannel *io);
|
||||
|
||||
ssize_t pa_iochannel_write_with_creds(pa_iochannel*io, const void*data, size_t l, const pa_creds *ucred);
|
||||
ssize_t pa_iochannel_read_with_creds(pa_iochannel*io, void*data, size_t l, pa_creds *ucred, int *creds_valid);
|
||||
ssize_t pa_iochannel_read_with_creds(pa_iochannel*io, void*data, size_t l, pa_creds *ucred, pa_bool_t *creds_valid);
|
||||
#endif
|
||||
|
||||
int pa_iochannel_is_readable(pa_iochannel*io);
|
||||
int pa_iochannel_is_writable(pa_iochannel*io);
|
||||
int pa_iochannel_is_hungup(pa_iochannel*io);
|
||||
pa_bool_t pa_iochannel_is_readable(pa_iochannel*io);
|
||||
pa_bool_t pa_iochannel_is_writable(pa_iochannel*io);
|
||||
pa_bool_t pa_iochannel_is_hungup(pa_iochannel*io);
|
||||
|
||||
/* Don't close the file descirptors when the io channel is freed. By
|
||||
* default the file descriptors are closed. */
|
||||
void pa_iochannel_set_noclose(pa_iochannel*io, int b);
|
||||
void pa_iochannel_set_noclose(pa_iochannel*io, pa_bool_t b);
|
||||
|
||||
/* Set the callback function that is called whenever data becomes available for read or write */
|
||||
typedef void (*pa_iochannel_cb_t)(pa_iochannel*io, void *userdata);
|
||||
|
|
@ -87,5 +88,6 @@ int pa_iochannel_socket_set_sndbuf(pa_iochannel*io, size_t l);
|
|||
pa_mainloop_api* pa_iochannel_get_mainloop_api(pa_iochannel *io);
|
||||
|
||||
int pa_iochannel_get_recv_fd(pa_iochannel *io);
|
||||
int pa_iochannel_get_send_fd(pa_iochannel *io);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -217,12 +217,12 @@ static void io_callback(pa_iochannel*io, void *userdata) {
|
|||
|
||||
static void defer_callback(pa_mainloop_api *m, pa_defer_event *e, void*userdata) {
|
||||
pa_pstream *p = userdata;
|
||||
|
||||
|
||||
pa_assert(p);
|
||||
pa_assert(PA_REFCNT_VALUE(p) > 0);
|
||||
pa_assert(p->defer_event == e);
|
||||
pa_assert(p->mainloop == m);
|
||||
|
||||
|
||||
do_something(p);
|
||||
}
|
||||
|
||||
|
|
@ -244,7 +244,7 @@ pa_pstream *pa_pstream_new(pa_mainloop_api *m, pa_iochannel *io, pa_mempool *poo
|
|||
p->mainloop = m;
|
||||
p->defer_event = m->defer_new(m, defer_callback, p);
|
||||
m->defer_enable(p->defer_event, 0);
|
||||
|
||||
|
||||
p->send_queue = pa_queue_new();
|
||||
|
||||
p->write.current = NULL;
|
||||
|
|
@ -266,7 +266,7 @@ pa_pstream *pa_pstream_new(pa_mainloop_api *m, pa_iochannel *io, pa_mempool *poo
|
|||
p->revoke_callback_userdata = NULL;
|
||||
p->release_callback = NULL;
|
||||
p->release_callback_userdata = NULL;
|
||||
|
||||
|
||||
p->mempool = pool;
|
||||
|
||||
p->use_shm = 0;
|
||||
|
|
@ -335,7 +335,7 @@ void pa_pstream_send_packet(pa_pstream*p, pa_packet *packet, const pa_creds *cre
|
|||
|
||||
if (!(i = pa_flist_pop(PA_STATIC_FLIST_GET(items))))
|
||||
i = pa_xnew(struct item_info, 1);
|
||||
|
||||
|
||||
i->type = PA_PSTREAM_ITEM_PACKET;
|
||||
i->packet = pa_packet_ref(packet);
|
||||
|
||||
|
|
@ -365,7 +365,7 @@ void pa_pstream_send_memblock(pa_pstream*p, uint32_t channel, int64_t offset, pa
|
|||
length = chunk->length;
|
||||
|
||||
bsm = pa_mempool_block_size_max(p->mempool);
|
||||
|
||||
|
||||
while (length > 0) {
|
||||
struct item_info *i;
|
||||
size_t n;
|
||||
|
|
@ -662,7 +662,7 @@ static int do_read(pa_pstream *p) {
|
|||
|
||||
#ifdef HAVE_CREDS
|
||||
{
|
||||
int b = 0;
|
||||
pa_bool_t b = 0;
|
||||
|
||||
if ((r = pa_iochannel_read_with_creds(p->io, d, l, &p->read_creds, &b)) <= 0)
|
||||
goto fail;
|
||||
|
|
@ -970,7 +970,7 @@ void pa_pstream_unlink(pa_pstream *p) {
|
|||
|
||||
if (p->dead)
|
||||
return;
|
||||
|
||||
|
||||
p->dead = 1;
|
||||
|
||||
if (p->import) {
|
||||
|
|
@ -991,7 +991,7 @@ void pa_pstream_unlink(pa_pstream *p) {
|
|||
if (p->defer_event) {
|
||||
p->mainloop->defer_free(p->defer_event);
|
||||
p->defer_event = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
p->die_callback = NULL;
|
||||
p->drain_callback = NULL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue