pthread_cond_wait & while
Salut a tous,
J'implemente une FIFO en c et j'ai un souci au niveau de la fonction enqueue qui est sensee ajouter un nouvel elemnt a la queue, je ne sais pas comment suspendre le thread appelant tant que la taille restante est insuffisante pour ajouter l'element a la file...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
struct queue {
pthread_mutex_t mutex;
pthread_cond_t cond;
size_t size_max;
size_t total_size;
struct list *list;
};
struct list {
void * elt;
size_t elt_size;
struct list* next;
};
int enqueue(struct queue *q,const void *buf,size_t size, int blocking) {
size_t taille;
struct list* tmp;
pthread_mutex_lock(&q->mutex);
taille=q->size_max-q->total_size;
if(blocking == 0){
if (taille == 0 || taille < size ){
errno = EAGAIN;
pthread_mutex_unlock(&q->mutex);
return -1;
}
}else {
pthread_cond_wait(&q->cond,&q->mutex); c'est la que je bloque,comment dire
que tant que taille (restante dans la file)< size(taille de l'element), il faut attendre ?
}
if (q->list->elt == NULL) {
q->list->elt = malloc(size);
memcpy(q->list->elt,buf,size);
q->list->elt_size = size;
q->list->next = NULL;
pthread_cond_signal(&q->cond);//Je signale que la file possede maintenant un element pour que dequeue puisse etre appelee
} else {
tmp=q->list;
while (tmp->next != NULL) {
tmp=tmp->next;
}
tmp->next = malloc(sizeof(struct list));
tmp->next->elt = malloc(size);
memcpy(tmp->next->elt,buf,size);
tmp->next->elt_size=size;
}
q->total_size+=size;
pthread_mutex_unlock(&q->mutex);
return 1;
}
int dequeue(struct queue *q,void *buf,size_t size, int blocking){
struct list* tmp;
pthread_mutex_lock(&q->mutex);
if(blocking==0){
if (q->total_size == 0){
errno = EAGAIN;
pthread_mutex_unlock(&q->mutex);
return -1;
}else if (size < q->list->elt_size){
errno=EMSGSIZE;
pthread_mutex_unlock(&q->mutex);
return -1;
}
}else{
pthread_cond_wait(&q->cond,&q->mutex);
}
memcpy(buf,q->list->elt,size);
tmp=q->list;
if(q->list->next != NULL){
q->list=q->list->next;
free(tmp->elt);
free(tmp);
}else{
free(q->list->elt);
free(q->list);
q->list=malloc(sizeof(struct list));
q->list->elt=NULL;
}
q->total_size-=size;
pthread_mutex_unlock(&q->mutex);
return size;
} |
merci davance :)