mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
iochannel: Avoid unnecessary wakeup after successful write
To save some CPU (in low latency scenarios), don't re-enable the "writable" event after it has succeeded. It is very likely the next write will succeed right away too. This means that we always need to handle EAGAIN/EWOULDBLOCK as a successful write of 0 bytes, so I also verified that all callers to pa_iochannel_write handled this correctly. Signed-off-by: David Henningsson <david.henningsson@canonical.com>
This commit is contained in:
parent
e2d1421f61
commit
9c4dcffca5
6 changed files with 17 additions and 21 deletions
|
|
@ -345,7 +345,7 @@ static int do_write(struct userdata *u) {
|
|||
if (u->write_data) {
|
||||
pa_assert(u->write_index < u->write_length);
|
||||
|
||||
if ((r = pa_iochannel_write(u->io, (uint8_t*) u->write_data + u->write_index, u->write_length - u->write_index)) <= 0) {
|
||||
if ((r = pa_iochannel_write(u->io, (uint8_t*) u->write_data + u->write_index, u->write_length - u->write_index)) < 0) {
|
||||
pa_log("write() failed: %s", pa_cstrerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -223,11 +223,22 @@ ssize_t pa_iochannel_write(pa_iochannel*io, const void*data, size_t l) {
|
|||
pa_assert(l);
|
||||
pa_assert(io->ofd >= 0);
|
||||
|
||||
if ((r = pa_write(io->ofd, data, l, &io->ofd_type)) >= 0) {
|
||||
io->writable = io->hungup = FALSE;
|
||||
enable_events(io);
|
||||
r = pa_write(io->ofd, data, l, &io->ofd_type);
|
||||
|
||||
if ((size_t) r == l)
|
||||
return r; /* Fast path - we almost always successfully write everything */
|
||||
|
||||
if (r < 0) {
|
||||
if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
|
||||
r = 0;
|
||||
else
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Partial write - let's get a notification when we can write more */
|
||||
io->writable = io->hungup = FALSE;
|
||||
enable_events(io);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -351,12 +351,9 @@ static int do_write(pa_ioline *l) {
|
|||
|
||||
while (l->io && !l->dead && pa_iochannel_is_writable(l->io) && l->wbuf_valid_length > 0) {
|
||||
|
||||
if ((r = pa_iochannel_write(l->io, l->wbuf+l->wbuf_index, l->wbuf_valid_length)) <= 0) {
|
||||
if ((r = pa_iochannel_write(l->io, l->wbuf+l->wbuf_index, l->wbuf_valid_length)) < 0) {
|
||||
|
||||
if (r < 0 && errno == EAGAIN)
|
||||
break;
|
||||
|
||||
if (r < 0 && errno != EPIPE)
|
||||
if (errno != EPIPE)
|
||||
pa_log("write(): %s", pa_cstrerror(errno));
|
||||
|
||||
failure(l, FALSE);
|
||||
|
|
|
|||
|
|
@ -1226,10 +1226,6 @@ static int do_write(connection *c) {
|
|||
pa_memblock_unref(chunk.memblock);
|
||||
|
||||
if (r < 0) {
|
||||
|
||||
if (r < 0 && (errno == EINTR || errno == EAGAIN))
|
||||
return 0;
|
||||
|
||||
pa_log("write(): %s", pa_cstrerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -162,10 +162,6 @@ static int do_write(struct connection *c) {
|
|||
pa_memblock_unref(chunk.memblock);
|
||||
|
||||
if (r < 0) {
|
||||
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
return 0;
|
||||
|
||||
pa_log("write(): %s", pa_cstrerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -229,10 +229,6 @@ static int do_write(connection *c) {
|
|||
pa_memblock_unref(chunk.memblock);
|
||||
|
||||
if (r < 0) {
|
||||
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
return 0;
|
||||
|
||||
pa_log("write(): %s", pa_cstrerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue