// test driver for readers/writers problem
// There can be multiple readers, or a single writer, active at any time.
// This solution gives priority to writers: active readers are allowed to
// finish, but no new readers can start if there is a waiting writer.
import java.util.Random;
import java.util.Arrays;
public class testReadWrite{
public static int clock;
public static void main(String[] args){
final int trial_len = 200;
final int num_readers = 10;
final int num_writers = 10;
final int max_read_time = 10;
final int max_write_time = 4;
Random randnum = new Random();
ReaderCounter rc = new ReaderCounter();
WriterCounter wc = new WriterCounter();
BinarySemaphore writing = new BinarySemaphore();
ReaderThread r;
WriterThread w;
// int clock; // used to count iterations of the while loop (below)
clock = 0;
String s = new String();
int[] read_arrive = new int[num_readers];
int[] read_len = new int [num_readers];
int[] write_arrive = new int [num_writers];
int[] write_len = new int [num_writers];
for (int i = 0; i < num_readers; i++){
read_arrive[i] = randnum.nextInt(100);
read_len[i] = randnum.nextInt(30) + 5; // don't want any 0 durations
}
for (int i = 0; i < num_writers; i++){
write_arrive[i] = randnum.nextInt(100);
write_len[i] = randnum.nextInt(5) + 5; // don't want any 0 durations
}
Arrays.sort(read_arrive);
Arrays.sort(write_arrive);
// next 10 lines are just for evaluating the results
for (int i = 0; i<num_readers; i++){
System.out.print("reader" + String.valueOf(i) + " ");
System.out.println("arr: " + String.valueOf(read_arrive[i]) + " len: "
+ String.valueOf(read_len[i]));
}
for (int i = 0; i<num_writers; i++){
System.out.print("writer" + String.valueOf(i) + " ");
System.out.println("arr: " + String.valueOf(write_arrive[i]) + " len: "
+ String.valueOf(write_len[i]));
}
while (clock<trial_len){
System.out.println("clock = " + String.valueOf(clock));
for (int i = 0; i < num_readers; i++){
if (read_arrive[i]==clock){
// form name of new reader
s = "reader";
s = s.concat(String.valueOf(i));
// create new reader, specifying its read duration
r = new ReaderThread(s,read_len[i],rc,wc,clock);
r.start();
}
}
for (int i = 0; i < num_writers; i++){
if (write_arrive[i]==clock){
// form name of new writer
s = "writer";
s = s.concat(String.valueOf(i));
// create new reader, specifying its read duration
w = new WriterThread(s,write_len[i],rc,wc,writing,clock);
w.start();
}
}
try{
Thread.sleep(0,50);
} catch(InterruptedException e){
}
clock++;
}
}
}