Newer
Older
// SPDX-License-Identifier: LGPL-3.0-or-later
// Copyright © 2020-2021 Florian Fischer
#include <sys/eventfd.h> // for eventfd, EFD_SEMAPHORE
#include <cassert> // for assert
#include <cerrno> // for ECANCELED, ETIME
#include <cstdint> // for uint64_t, int32_t
#include "Common.hpp" // for DIE_MSG_ERRNO
#include "io/Future.hpp" // for ReadFuture, WriteFuture
using emper::io::ReadFuture;
using emper::io::WriteFuture;
int efd;
uint64_t read_buf;
uint64_t write_buf = 42;
ReadFuture readFuture(efd, &read_buf, sizeof(read_buf), 0);
assert(readFuture.cancel() == -ENOENT);
void cancelSubmittedNotCompleted() {
ReadFuture readFuture(efd, &read_buf, sizeof(read_buf), 0);
readFuture.submit();
assert(readFuture.cancel() == -ECANCELED);
void cancelCompleted() {
ReadFuture readFuture(efd, &read_buf, sizeof(read_buf), 0);
readFuture.submit();
WriteFuture writeFuture(efd, &write_buf, sizeof(write_buf), 0);
assert(writeFuture.submitAndWait() == sizeof(write_buf));
assert(readFuture.cancel() == sizeof(write_buf) && read_buf == write_buf);
}
void cancelNotCompletedChain() {
ReadFuture readFuture(efd, &read_buf, sizeof(read_buf), 0);
ReadFuture readFuture2(efd, &read_buf, sizeof(read_buf), 0);
readFuture2.setDependency(readFuture);
readFuture2.submit();
assert(readFuture2.cancel() == -ECANCELED);
assert(readFuture.wait() == -ECANCELED);
}
void cancelPartialCompletedChain() {
ReadFuture readFuture(efd, &read_buf, sizeof(read_buf), 0);
ReadFuture readFuture2(efd, &read_buf, sizeof(read_buf), 0);
readFuture2.setDependency(readFuture);
readFuture2.submit();
assert(readFuture2.cancel() == -ECANCELED);
assert(readFuture.wait() == -ECANCELED);
void cancelNotCompletedFutureChain() {
ReadFuture readFuture(efd, &read_buf, sizeof(read_buf), 0);
WriteFuture writeFuture(efd, &write_buf, sizeof(write_buf), 0);
ReadFuture readFuture2(efd, &read_buf, sizeof(read_buf), 0);
readFuture2.setDependency(readFuture);
readFuture2.submit();
assert(writeFuture.submitAndWait() == sizeof(write_buf));
// TODO: investigate why this read is completed with -EINTR most of the time
int r = readFuture2.cancel();
assert(r == -EINTR || r == -ECANCELED);
assert(readFuture.wait() == sizeof(write_buf) && read_buf == write_buf);
}
void emperTest() {
efd = eventfd(0, 0);
if (efd == -1) {
DIE_MSG_ERRNO("eventfd failed");
}
cancelNotSubmitted();
cancelSubmittedNotCompleted();
cancelCompleted();
cancelNotCompletedChain();
cancelPartialCompletedChain();
}