The Pedigree Project 0.1
transfer-contract-test/contract.h
1#ifndef TRANSFER_CONTRACT_H
2#define 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
11#define CHECK(condition) \
12 do { \
13 if (!(condition)) { \
14 fprintf(stderr, "%s:%d: %s (errno=%d)\n", __FILE__, __LINE__, #condition, errno); \
15 failed = 1; \
16 goto out; \
17 } \
18 } while (0)
19enum { TF_SENDFILE, TF_COPY_RANGE, TF_CHUNK = 65536, TF_FILLER = -1 };
20struct tf_file {
21 int fd;
22 char path[128];
23};
25 int kind, input, output;
26 off_t *input_offset, *output_offset;
27 size_t count;
28 volatile int ready, gate, done;
29 ssize_t result;
30 int error;
31 int64_t started, finished;
32};
33int64_t tf_now(void);
34void tf_pause(int milliseconds);
35int tf_wait(volatile int* flag, int milliseconds);
36int tf_reap(pid_t child, int milliseconds);
37unsigned char tf_pattern(size_t offset, int seed);
38int tf_create(struct tf_file* file, const char* directory, size_t bytes, int seed);
39void tf_destroy(struct tf_file* file);
40int tf_verify(int fd, off_t offset, size_t length, size_t source_offset, int seed);
41int tf_socket_read(int fd, size_t length, size_t source_offset, int seed);
42ssize_t tf_saturate(int fd);
43ssize_t tf_copy(int kind, int input, off_t* input_offset, int output, off_t* output_offset,
44 size_t count);
45void* tf_worker(void* argument);
46void tf_diagnostic(const struct tf_transfer* transfer);
47int tf_join(pthread_t thread, struct tf_transfer* transfer);
48int transfer_file_copy(void);
49int transfer_offsets(void);
50int transfer_stream(void);
51int transfer_lifetime(void);
52int transfer_races(void);
53#endif