I can't see how this code isn't getting the output which should be:
buffer elem = -378931907
buffer elem = 1991142473
buffer elem = -2051466334
buffer elem = -1945167320
buffer elem = 1080018178
Rather than:
buffer elem = 1343403155
buffer elem = 225005971
buffer elem = 1270463783
buffer elem = -1162132598
buffer elem = 636863738
The thread is suppose to be suspended given: if((b->in+1)%b->max_buffer_size == b->out) then await it's signal from get_buffer to add more to the buffer. The maximum buffer size has been initialised to 5.
What is the source of this problem?
from put buffer = -378931907
from put buffer = 1991142473
from put buffer = -2051466334
from put buffer = -1945167320
from put buffer = 1080018178
from put buffer = 1343403155
from put buffer = 225005971
from put buffer = 1270463783
from put buffer = -1162132598
from put buffer = 636863738
Code:
void init_buffer(bufferQueue *b, semaphore s, int min, int max)
{
b->buffer_array = malloc(max*sizeof(int));
b->in = 0;
b->out = 0;
b->min_buffer_size = min;
b->max_buffer_size = max;
b->sem = s;
}
Code:
void put_buffer(bufferQueue *b, int v)
{
if((b->in+1)%b->max_buffer_size == b->out)
{
semWait(&(b->sem));
}
b->buffer_array[b->in] = v;
printf("from put buffer = %d\n", b->buffer_array[b->in]);
b->in = (b->in+1)%b->max_buffer_size;
semSignal(&(b->sem));
}
Code:
void *producer(void* cb)
{
printf("testing\n");
bufferQueue *cbuffer = (bufferQueue *)cb;
int i;
for(i = 0; i < 10; i++)
{
put_buffer(cbuffer, randomNum());
}
for(i = 0; i < 5; i++)
{
printf("buffer elem = %d\n", cbuffer->buffer_array[i]);
}
destroy_buffer(cbuffer);
return cb;
}
int main(void)
{
semaphore sem;
bufferQueue cbuffer;
pthread_t thread;
init_sem(&sem);
init_buffer(&cbuffer, sem, 0, 5);
pthread_create(&thread, NULL, producer, (void*)(&cbuffer));