Question: Write a small report on what this code does Buffer.c #include buffer.h #include #include buffer.h #include #include #include #include #include #define BUFFER_SIZE 5 #define RAND_DIVISOR
Write a small report on what this code does
Buffer.c
#include "buffer.h"
#include
#include "buffer.h"
#include
#include
#include
#include
#include
#define BUFFER_SIZE 5
#define RAND_DIVISOR 100000000
#define TRUE 1
sem_t empty, full;
pthread_mutex_t mutex;
int in = 0;
int out = 0;
int insert_item(buffer_item item) {
if(sem_wait(&empty) != 0)
return -1;
if(pthread_mutex_lock(&mutex) != 0)
return -1;
buff[in % BUFFER_SIZE] = item;
printf("producer produced %d at %d ", item, in % BUFFER_SIZE);
in++;
if(pthread_mutex_unlock(&mutex) != 0)
return -1;
if(sem_post(&full) != 0)
return -1;
return 0;
}
int remove_item(buffer_item *item) {
if(sem_wait(&full) != 0)
return -1;
if(pthread_mutex_lock(&mutex) != 0)
return -1;
*item = buff[out % BUFFER_SIZE];
printf("consumer consumed %d at %d ", *item, out % BUFFER_SIZE);
out++;
if(pthread_mutex_unlock(&mutex) != 0)
return -1;
if(sem_post(&empty) != 0)
return -1;
return 0;
}
void init_buffer() {
int i = 0;
for(;i
buff[i] = 0;
sem_init(&full, 0, 0);
sem_init(&empty, 0, BUFFER_SIZE);
pthread_mutex_init(&mutex, NULL);
}
/* For testing only void print_buffer() {
int i = 0;
for(;i
printf("buff[%i] = %i ", i, buff[i]);
}
*/
void *producer(void *param) {
FILE * fp;
fp = fopen ("file.txt", "w+");
buffer_item item;
param = NULL;
while(1)
{
sleep(rand());
// fill item with a random value
item = rand_r(&junk);
if(insert_item(item) < 0)
fprintf(fp,"Report Error Condition ");
else
printf("producer produced %d ", item);
}
}
void *consumer(void *param) {
FILE * fp;
fp = fopen ("file.txt", "w+");
buffer_item item;
param = NULL;
while(1)
{
sleep(rand());
// fill item with a random value
item = rand_r(&junk);
if(insert_item(item) < 0)
fprintf(fp,"Report Error Condition ");
else
printf("producer produced %d ", item);
}
}
void *consumer(void *param) {
FILE * fp;
fp = fopen ("file.txt", "w+");
buffer_item item;
param = NULL;
while(1)
{
sleep(rand());
if(remove_item(&item) < 0)
fprintf(fp,"Report Error Condition ");
else
printf("consumer consumed %d ", item);
}
}
Main.c
#include
#include
#include
#include
#include "buffer.h"
void print_instr() {
printf("Please provide
1. How long to sleep before terminating.
2. The number of producer threads.
3. The number of consumer threads. ");
}
int main(int argc, char *argv[]) {
if(argc <= 3) { // To make sure the proper input is there, prompt the
user if not
print_instr();
exit(0);
}
int sleep_duration = atoi(argv[1]);
int num_producers = atoi(argv[2]);
int num_consumers = atoi(argv[3]);
init_buffer(); //print_buffer(buffer); For testing, currently commented out in buffer.h
int i = 0;
for(;i
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&tid, &attr, producer, NULL);
}
i = 0;
for(;i
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&tid, &attr, consumer, NULL);
}
sleep(sleep_duration);
//print_buffer(buffer);
return 0;
}
Buffer.h
#ifndef BUFFER_H
#define BUFFER_H
typedef int buffer_item;
#define BUFFER_SIZE 5
unsigned int junk;
buffer_item buff[BUFFER_SIZE];
int insert_item(buffer_item);
int remove_item(buffer_item *);
void init_buffer(); //void print_buffer(); for testing only
void *producer(void *param);
void *consumer(void *param);
#endif
Makefile
UNAME := $(SHELL uname)
CC=gcc
CFLAGS=-c -Wall -Wextra -Wno-parentheses -pedantic -std=gnu99
LDFLAGS=-pthread
SOURCES=main.c buffer.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=proj3
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.m.o:
$(CC) $(CFLAGS) $< -o $@
clean:
rm -rf *.o $(EXECUTABLE)
Step by Step Solution
There are 3 Steps involved in it
1 Expert Approved Answer
Step: 1 Unlock
Question Has Been Solved by an Expert!
Get step-by-step solutions from verified subject matter experts
Step: 2 Unlock
Step: 3 Unlock
