async: first synchronous write may succeed partially

When trying to write (to e.g. the slave, or to a clipboard receiver),
we first try to send the data synchronously, and only if that fails do
we switch to asynchronous mode.

However, the first synchronous may (in fact, is likely to) succeed
partially.
This commit is contained in:
Daniel Eklöf 2019-11-28 19:20:25 +01:00
parent c5602fde96
commit 903581b7eb
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 9 additions and 6 deletions

View file

@ -384,13 +384,14 @@ send(void *data, struct wl_data_source *wl_data_source, const char *mime_type,
return;
}
switch (async_write(fd, selection, len, &(size_t){0})) {
size_t async_idx = 0;
switch (async_write(fd, selection, len, &async_idx)) {
case ASYNC_WRITE_REMAIN: {
struct clipboard_send *ctx = malloc(sizeof(*ctx));
*ctx = (struct clipboard_send) {
.data = strdup(selection),
.len = len,
.idx = 0,
.idx = async_idx,
};
if (fdm_add(wayl->fdm, fd, EPOLLOUT, &fdm_send, ctx))
@ -475,13 +476,14 @@ primary_send(void *data,
return;
}
switch (async_write(fd, selection, len, &(size_t){0})) {
size_t async_idx = 0;
switch (async_write(fd, selection, len, &async_idx)) {
case ASYNC_WRITE_REMAIN: {
struct clipboard_send *ctx = malloc(sizeof(*ctx));
*ctx = (struct clipboard_send) {
.data = strdup(selection),
.len = len,
.idx = 0,
.idx = async_idx,
};
if (fdm_add(wayl->fdm, fd, EPOLLOUT, &fdm_send, ctx))

View file

@ -32,6 +32,7 @@
bool
term_to_slave(struct terminal *term, const void *_data, size_t len)
{
size_t async_idx = 0;
if (tll_length(term->ptmx_buffer) > 0) {
/* With a non-empty queue, EPOLLOUT has already been enabled */
goto enqueue_data;
@ -42,7 +43,7 @@ term_to_slave(struct terminal *term, const void *_data, size_t len)
* switch to asynchronous.
*/
switch (async_write(term->ptmx, _data, len, &(size_t){0})) {
switch (async_write(term->ptmx, _data, len, &async_idx)) {
case ASYNC_WRITE_REMAIN:
/* Switch to asynchronous mode; let FDM write the remaining data */
if (!fdm_event_add(term->fdm, term->ptmx, EPOLLOUT))
@ -73,7 +74,7 @@ enqueue_data:
struct ptmx_buffer queued = {
.data = copy,
.len = len,
.idx = 0,
.idx = async_idx,
};
tll_push_back(term->ptmx_buffer, queued);
}