PKUOS - Pintos
Pintos source browser for PKU Operating System course
grow-two-files.c
Go to the documentation of this file.
1/** Grows two files in parallel and checks that their contents are
2 correct. */
3
4#include <random.h>
5#include <syscall.h>
6#include "tests/lib.h"
7#include "tests/main.h"
8
9#define FILE_SIZE 8143
10static char buf_a[FILE_SIZE];
11static char buf_b[FILE_SIZE];
12
13static void
14write_some_bytes (const char *file_name, int fd, const char *buf, size_t *ofs)
15{
16 if (*ofs < FILE_SIZE)
17 {
18 size_t block_size = random_ulong () % (FILE_SIZE / 8) + 1;
19 size_t ret_val;
20 if (block_size > FILE_SIZE - *ofs)
21 block_size = FILE_SIZE - *ofs;
22
23 ret_val = write (fd, buf + *ofs, block_size);
24 if (ret_val != block_size)
25 fail ("write %zu bytes at offset %zu in \"%s\" returned %zu",
26 block_size, *ofs, file_name, ret_val);
27 *ofs += block_size;
28 }
29}
30
31void
32test_main (void)
33{
34 int fd_a, fd_b;
35 size_t ofs_a = 0, ofs_b = 0;
36
37 random_init (0);
38 random_bytes (buf_a, sizeof buf_a);
39 random_bytes (buf_b, sizeof buf_b);
40
41 CHECK (create ("a", 0), "create \"a\"");
42 CHECK (create ("b", 0), "create \"b\"");
43
44 CHECK ((fd_a = open ("a")) > 1, "open \"a\"");
45 CHECK ((fd_b = open ("b")) > 1, "open \"b\"");
46
47 msg ("write \"a\" and \"b\" alternately");
48 while (ofs_a < FILE_SIZE || ofs_b < FILE_SIZE)
49 {
50 write_some_bytes ("a", fd_a, buf_a, &ofs_a);
51 write_some_bytes ("b", fd_b, buf_b, &ofs_b);
52 }
53
54 msg ("close \"a\"");
55 close (fd_a);
56
57 msg ("close \"b\"");
58 close (fd_b);
59
62}
block_sector_t block_size(struct block *block)
Returns the number of sectors in BLOCK.
Definition: block.c:144
static char buf[BUF_SIZE]
static char buf_a[FILE_SIZE]
static char buf_b[FILE_SIZE]
void test_main(void)
tests/main.h
#define FILE_SIZE
Grows two files in parallel and checks that their contents are correct.
Definition: grow-two-files.c:9
static void write_some_bytes(const char *file_name, int fd, const char *buf, size_t *ofs)
bool create(const char *file, unsigned initial_size)
Definition: syscall.c:91
void close(int fd)
Definition: syscall.c:139
int open(const char *file)
Definition: syscall.c:103
int write(int fd, const void *buffer, unsigned size)
Definition: syscall.c:121
void fail(const char *format,...)
Definition: lib.c:40
void check_file(const char *file_name, const void *buf, size_t size)
Definition: lib.c:151
void msg(const char *format,...)
Definition: lib.c:28
#define CHECK(SUCCESS,...)
Takes an expression to test for SUCCESS and a message, which may include printf-style arguments.
Definition: lib.h:29
unsigned long random_ulong(void)
Returns a pseudo-random unsigned long.
Definition: random.c:78
void random_bytes(void *buf_, size_t size)
Writes SIZE random bytes into BUF.
Definition: random.c:54
void random_init(unsigned seed)
Initializes or reinitializes the PRNG with the given SEED.
Definition: random.c:34
static const char file_name[]
tests/filesys/base/syn-read.h
Definition: syn-read.h:5