CS318 - Pintos
Pintos source browser for JHU CS318 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
10 static char buf_a[FILE_SIZE];
11 static char buf_b[FILE_SIZE];
12 
13 static void
14 write_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 
31 void
32 test_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 
60  check_file ("a", buf_a, FILE_SIZE);
61  check_file ("b", buf_b, FILE_SIZE);
62 }
lib.h
buf_b
static char buf_b[FILE_SIZE]
Definition: grow-two-files.c:11
buf
static char buf[BUF_SIZE]
Definition: child-syn-read.c:16
write
int write(int fd, const void *buffer, unsigned size)
Definition: syscall.c:121
CHECK
#define CHECK(SUCCESS,...)
Takes an expression to test for SUCCESS and a message, which may include printf-style arguments.
Definition: lib.h:29
random_ulong
unsigned long random_ulong(void)
Returns a pseudo-random unsigned long.
Definition: random.c:78
FILE_SIZE
#define FILE_SIZE
Grows two files in parallel and checks that their contents are correct.
Definition: grow-two-files.c:9
random_bytes
void random_bytes(void *buf_, size_t size)
Writes SIZE random bytes into BUF.
Definition: random.c:54
random.h
write_some_bytes
static void write_some_bytes(const char *file_name, int fd, const char *buf, size_t *ofs)
Definition: grow-two-files.c:14
random_init
void random_init(unsigned seed)
Initializes or reinitializes the PRNG with the given SEED.
Definition: random.c:34
open
int open(const char *file)
Definition: syscall.c:103
buf_a
static char buf_a[FILE_SIZE]
Definition: grow-two-files.c:10
fail
void fail(const char *format,...)
Definition: lib.c:40
file_name
static const char file_name[]
tests/filesys/base/syn-read.h
Definition: syn-read.h:5
main.h
close
void close(int fd)
Definition: syscall.c:139
msg
void msg(const char *format,...)
Definition: lib.c:28
block_size
block_sector_t block_size(struct block *block)
Returns the number of sectors in BLOCK.
Definition: block.c:144
test_main
void test_main(void)
tests/main.h
Definition: grow-two-files.c:32
check_file
void check_file(const char *file_name, const void *buf, size_t size)
Definition: lib.c:151
create
bool create(const char *file, unsigned initial_size)
Definition: syscall.c:91