#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <pthread.h>

pthread_mutex_t mutex;
pthread_cond_t control;
void producer(unsigned int *arg);
void consumer(unsigned int *arg);
unsigned int count, data, consumed, produced;

int main(int argc, char *argv[]) {
	unsigned int n = ((argc == 2) ? atoi(argv[1]) : 1);
	pthread_t t1, t2;

	count = data = consumed = produced = 0;

	if (pthread_mutex_init(&mutex, NULL)) {
		perror("pthread_mutex_init");
		exit(1);
	}
	if (pthread_cond_init(&control, NULL)) {
		perror("pthread_cond_init");
		exit(1);
	}
	if (pthread_create(
		&t1,
		(pthread_attr_t *)NULL,
		(void * (*)(void *))producer,
		(void *)&n)
	) {
		perror("pthread_create");
		exit(1);
	}
	if (pthread_create(
		&t2,
		(pthread_attr_t *)NULL,
		(void * (*)(void *))consumer,
		(void *)&n)
	) {
		perror("pthread_create");
		exit(1);
	}

	pthread_join(t1, NULL);
	pthread_join(t2, NULL);
	fprintf(stdout, "%d %d\n", produced, consumed);
	return 0;
}


void producer(unsigned int *arg) {
	unsigned int i, n = *arg;
	for (i=1; i<=n; i++) {
		pthread_mutex_lock(&mutex);
		while (count == 1) {
			pthread_cond_wait(&control, &mutex);
		}
		data = i;
		count = 1;
		printf("Se produjo %u\n", data);
		pthread_cond_signal(&control);
		pthread_mutex_unlock(&mutex);
		produced++;
	}
}


void consumer(unsigned int *arg) {
	unsigned int i = 0, n = *arg;
	for (;;) {
		pthread_mutex_lock(&mutex);
		while (count == 0) {
			pthread_cond_wait(&control, &mutex);
		}
		i = data;
		count = 0;
		printf("Se consumió %u\n", data);
		pthread_cond_signal(&control);
		pthread_mutex_unlock(&mutex);
		consumed++;
		if (i == n)
			return;
	}
}