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))