mirror of https://github.com/t1meshift/os_labs.git
90 lines
1.8 KiB
Plaintext
90 lines
1.8 KiB
Plaintext
#pragma once
|
|
#include <unistd.h>
|
|
|
|
void queue_test() {
|
|
int i;
|
|
int item;
|
|
int length = 128;
|
|
|
|
Queue *queue = make_queue(length);
|
|
assert(queue_empty(queue));
|
|
for (i = 0; i < length - 1; i++) {
|
|
queue_push(queue, i);
|
|
}
|
|
assert(queue_full(queue));
|
|
for (i = 0; i < 10; i++) {
|
|
item = queue_pop(queue);
|
|
assert(i == item);
|
|
}
|
|
assert(!queue_empty(queue));
|
|
assert(!queue_full(queue));
|
|
for (i = 0; i < 10; i++) {
|
|
queue_push(queue, i);
|
|
}
|
|
assert(queue_full(queue));
|
|
for (i = 0; i < 10; i++) {
|
|
item = queue_pop(queue);
|
|
}
|
|
assert(item == 19);
|
|
}
|
|
|
|
void empty_queue_test() {
|
|
int i;
|
|
pthread_t child[NUM_CHILDREN];
|
|
|
|
Shared *shared = make_shared();
|
|
|
|
child[1] = make_thread(consumer_entry, shared);
|
|
sleep(1);
|
|
child[0] = make_thread(producer_entry, shared);
|
|
|
|
for (i = 0; i < NUM_CHILDREN; i++) {
|
|
join_thread(child[i]);
|
|
}
|
|
}
|
|
|
|
void *producer_positive(void *arg)
|
|
{
|
|
int i;
|
|
Shared *shared = (Shared *)arg;
|
|
for (i = 0; i < (QUEUE_LENGTH - 1) / 2; i++) {
|
|
queue_push(shared->queue, 1);
|
|
}
|
|
pthread_exit(NULL);
|
|
}
|
|
|
|
void *producer_negative(void *arg)
|
|
{
|
|
int i;
|
|
int item;
|
|
Shared *shared = (Shared *)arg;
|
|
|
|
for (i = 0; i < (QUEUE_LENGTH - 1) - ((QUEUE_LENGTH - 1) / 2); i++) {
|
|
queue_push(shared->queue, -1);
|
|
}
|
|
pthread_exit(NULL);
|
|
}
|
|
|
|
void thread_safe_test() {
|
|
int i;
|
|
pthread_t child[NUM_CHILDREN];
|
|
|
|
Shared *shared = make_shared();
|
|
|
|
for (unsigned int k = 0; k < QUEUE_LENGTH; k++) {
|
|
shared->queue->array[k] = 0;
|
|
}
|
|
|
|
child[0] = make_thread(producer_positive, shared);
|
|
child[1] = make_thread(producer_negative, shared);
|
|
|
|
for (i=0; i<NUM_CHILDREN; i++) {
|
|
join_thread(child[i]);
|
|
}
|
|
|
|
int was_zero = 0;
|
|
for (unsigned int k = 0; k < QUEUE_LENGTH; k++) {
|
|
assert(!(was_zero && shared->queue->array[k]));
|
|
was_zero = was_zero || !shared->queue->array[k];
|
|
}
|
|
} |