The Pedigree Project 0.1
pipe-transfer-contract-test/contract.h
1#ifndef PIPE_TRANSFER_CONTRACT_H
2#define PIPE_TRANSFER_CONTRACT_H
3#include <errno.h>
4#include <fcntl.h>
5#include <pthread.h>
6#include <stdint.h>
7#include <stdio.h>
8
9#include <sys/types.h>
10#include <sys/uio.h>
11
12#define CHECK(condition) \
13 do { \
14 if (!(condition)) { \
15 fprintf(stderr, "%s:%d: %s (errno=%d)\n", __FILE__, __LINE__, #condition, errno); \
16 failed = 1; \
17 goto out; \
18 } \
19 } while (0)
20enum { PT_SPLICE, PT_TEE, PT_VMSPLICE, PT_CAPACITY = 4096, PT_FILLER = -1 };
21struct pt_call {
22 int kind, input, output;
23 off_t *input_offset, *output_offset;
24 size_t count;
25 unsigned flags;
26 struct iovec* vectors;
27 size_t vector_count;
28 volatile int ready, gate, entered, done;
29 ssize_t result;
30 int error;
31};
32int64_t pt_now(void);
33void pt_pause(int milliseconds);
34int pt_wait(volatile int* flag, int milliseconds);
35int pt_reap(pid_t child, int milliseconds);
36int pt_ready(int fd, short events, int milliseconds);
37int pt_wait_readiness(int fd, short events, int expected);
38unsigned char pt_pattern(size_t offset, int seed);
39int pt_fill(int fd, size_t count, int seed);
40int pt_read(int fd, size_t count, size_t source_offset, int seed);
41int pt_file(size_t count, int seed);
42int pt_verify(int fd, off_t offset, size_t count, size_t source_offset, int seed);
43ssize_t pt_socket_full(int fd);
44int pt_send_fd(int socket, int fd);
45int pt_receive_fd(int socket);
46void* pt_worker(void* argument);
47int pt_join(pthread_t worker, struct pt_call* call);
48void pt_diagnostic(const struct pt_call* call);
49int pipe_transfer_splice(void);
50int pipe_transfer_tee(void);
51int pipe_transfer_vmsplice(void);
52int pipe_transfer_lifetime(void);
53int pipe_transfer_readiness(void);
54int pipe_transfer_concurrency(void);
55#endif