
/**********************************************
* Prepared by:  200771008 Sina CETINER
				200771017 Ali Evren KUT
*
* Subject: Ceng505 10th week incomplete sample
*
*************************************************/

#include <pthread.h>
#include <stdio.h>

void *find_min(void *list_ptr);

pthread_mutex_t minimum_value_lock;

#define sizearr 10
#define thread_count  10

int global_array[sizearr];
int minimum_value, partial_list_size = sizearr / thread_count;

void fillme();

void fillme()
{
	srand(time(0));
	int i = 0;	
	for (i=0; i<sizearr; ++i)
	{
		global_array[i] = rand()%10000;
	}
}

int main() 
{
	/* declare and initialize data structures and list */
	minimum_value = 10000;
	
	pthread_mutex_init(&minimum_value_lock, NULL);
	
	pthread_t thread[thread_count];

	fillme();

	int i=0;

	for(i=0;i<thread_count;i++) /*create threads*/
	{         
		if(pthread_create(&thread[i],NULL,find_min,( &global_array[ (sizearr/thread_count)*i ] ) ) !=0) 
		{
			perror("Pthread_create fails");
		}
	}
 
	for(i=0;i<thread_count;i++)         /*join threads*/
	{
		if(pthread_join(thread[i],NULL)!=0) 
		{
			perror("Pthread_join fails");
		}
	}

	fprintf( stderr, "result: %d\n", minimum_value );
}

void *find_min(void *list_ptr) {
	
	int *partial_list_pointer, my_min, i;
	my_min = 10000;
	partial_list_pointer = (int *) list_ptr;

	fprintf( stderr, "Start of array: %p \n", list_ptr );

	for (i = 0; i < partial_list_size; i++)
	{
		if (partial_list_pointer[i] < my_min)
		{
			my_min = partial_list_pointer[i];
		}
	}

	/* lock the mutex associated with minimum_value and
	update the variable as required */
	pthread_mutex_lock(&minimum_value_lock);

	if (my_min < minimum_value)
	{
		minimum_value = my_min;
	}

	/* and unlock the mutex */
	pthread_mutex_unlock(&minimum_value_lock);

	pthread_exit(0);

}

