| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 | #ifndef __main_header_h__
#define __main_header_h__
// all this is for the homework side of things
int do_trace = 0;
int do_timing = 0;
#define p0 do_pause(id, 1, 0, "p0"); 
#define p1 do_pause(id, 1, 1, "p1"); 
#define p2 do_pause(id, 1, 2, "p2"); 
#define p3 do_pause(id, 1, 3, "p3"); 
#define p4 do_pause(id, 1, 4, "p4"); 
#define p5 do_pause(id, 1, 5, "p5"); 
#define p6 do_pause(id, 1, 6, "p6"); 
#define c0 do_pause(id, 0, 0, "c0"); 
#define c1 do_pause(id, 0, 1, "c1"); 
#define c2 do_pause(id, 0, 2, "c2"); 
#define c3 do_pause(id, 0, 3, "c3"); 
#define c4 do_pause(id, 0, 4, "c4"); 
#define c5 do_pause(id, 0, 5, "c5"); 
#define c6 do_pause(id, 0, 6, "c6"); 
int producer_pause_times[MAX_THREADS][7];
int consumer_pause_times[MAX_THREADS][7];
// needed to avoid interleaving of print out from threads
pthread_mutex_t print_lock = PTHREAD_MUTEX_INITIALIZER;
void do_print_headers() {
    if (do_trace == 0) 
	return;
    int i;
    printf("%3s ", "NF");
    for (i = 0; i < max; i++) {
	printf(" %3s ", "   ");
    }
    printf("  ");
    for (i = 0; i < producers; i++) 
	printf("P%d ", i);
    for (i = 0; i < consumers; i++) 
	printf("C%d ", i);
    printf("\n");
}
void do_print_pointers(int index) {
    if (use_ptr == index && fill_ptr == index) {
	printf("*");
    } else if (use_ptr == index) {
	printf("u");
    } else if (fill_ptr == index) {
	printf("f");
    } else {
	printf(" ");
    }
}
void do_print_buffer() {
    int i;
    printf("%3d [", num_full);
    for (i = 0; i < max; i++) {
	do_print_pointers(i);
	if (buffer[i] == EMPTY) {
	    printf("%3s ", "---");
	} else if (buffer[i] == END_OF_STREAM) {
	    printf("%3s ", "EOS");
	} else {
	    printf("%3d ", buffer[i]);
	}
    }
    printf("] ");
}
void do_eos() {
    if (do_trace) {
	Mutex_lock(&print_lock);
	do_print_buffer();
	//printf("%3d [added end-of-stream marker]\n", num_full);
	printf("[main: added end-of-stream marker]\n");
	Mutex_unlock(&print_lock);
    }
}
void do_pause(int thread_id, int is_producer, int pause_slot, char *str) {
    int i;
    if (do_trace) {
	Mutex_lock(&print_lock);
	do_print_buffer();
	// skip over other thread's spots
	for (i = 0; i < thread_id; i++) {
	    printf("   ");
	}
	printf("%s\n", str);
	Mutex_unlock(&print_lock);
    }
    int local_id = thread_id;
    int pause_time;
    if (is_producer) {
	pause_time = producer_pause_times[local_id][pause_slot];
    } else {
	local_id = thread_id - producers;
	pause_time = consumer_pause_times[local_id][pause_slot];
    }
    // printf(" PAUSE %d\n", pause_time);
    sleep(pause_time);
}
void ensure(int expression, char *msg) {
    if (expression == 0) {
	fprintf(stderr, "%s\n", msg);
	exit(1);
    }
}
void parse_pause_string(char *str, char *name, int expected_pieces, 
			int pause_array[MAX_THREADS][7]) {
    // string looks like this (or should):
    //   1,2,0:2,3,4,5
    //   n-1 colons if there are n producers/consumers
    //   comma-separated for sleep amounts per producer or consumer
    int index = 0;
    char *copy_entire = strdup(str);
    char *outer_marker;
    int colon_count = 0;
    char *p = strtok_r(copy_entire, ":", &outer_marker);
    while (p) {
	// init array: default sleep is 0
	int i;
	for (i = 0; i < 7; i++)  
	    pause_array[index][i] = 0;
	// for each piece, comma separated
	char *inner_marker;
	char *copy_piece = strdup(p);
	char *c = strtok_r(copy_piece, ",", &inner_marker);
	int comma_count = 0;
	int inner_index = 0;
	while (c) {
	    int pause_amount = atoi(c);
	    ensure(inner_index < 7, "you specified a sleep string incorrectly... (too many comma-separated args)");
	    // printf("setting %s pause %d to %d\n", name, inner_index, pause_amount);
	    pause_array[index][inner_index] = pause_amount;
	    inner_index++;
	    c = strtok_r(NULL, ",", &inner_marker);	
	    comma_count++;
	}
	free(copy_piece);
	index++;
	// continue with colon separated list
	p = strtok_r(NULL, ":", &outer_marker);
	colon_count++;
    }
    free(copy_entire);
    if (expected_pieces != colon_count) {
	fprintf(stderr, "Error: expected %d %s in sleep specification, got %d\n", expected_pieces, name, colon_count);
	exit(1);
    }
}
#endif // __main_header_h__
 |