Skip to content
Snippets Groups Projects
CancelFutureTest.cpp 2.47 KiB
Newer Older
  • Learn to ignore specific revisions
  • // 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;
    
    void cancelNotSubmitted() {
    
    	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();
    }