00001 #ifndef _PROD_CONS_H_ 00002 #define _PROD_CONS_H_ 00003 00004 #include <pthread.h> 00005 #include <semaphore.h> 00006 00007 00008 typedef struct { 00009 int prod_pos; // posicao que o produtor vai inserir no buffer 00010 int cons_pos; // posicao que o consumidor vai retirar do buffer 00011 sem_t prod_sem; // impede o produtor de escrever em cima de posicoes ocupadas 00012 sem_t cons_sem; // impede o consumidor de consumir posicoes com lixo 00013 pthread_mutex_t prod_mutex; // so um produtor insere de cada vez 00014 pthread_mutex_t cons_mutex; // so um consumidor retira de cada vez 00015 int buf_size; 00016 void **buffer; 00017 } prod_cons_t; 00018 00019 /* 00020 static inline int __cas(volatile void *p, unsigned long oldval, unsigned long newval) 00021 { 00022 char ret; 00023 unsigned long readval; 00024 00025 __asm__ ("lock; cmpxchgl %3, %1; sete %0" 00026 : "=q" (ret), "=m" (*__xg(p)), "=a" (readval) 00027 : "r" (newval), "m" (*__xg(p)), "a" (oldval) : "memory"); 00028 return ret; 00029 } 00030 00031 #define compare_and_swap(p, oldval, newval) __cas(p, (unsigned long) oldval, (unsigned long) newval) 00032 */ 00033 00034 00035 prod_cons_t *create_prod_cons(int sz); 00036 void put(prod_cons_t *prod_cons, void *val); 00037 void *get(prod_cons_t *prod_cons); 00038 void destroy_prod_cons(prod_cons_t *prod_cons); 00039 00040 #endif 00041 00042
1.4.6