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
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <unistd.h>
#include <sys/uio.h>
#include <pthread.h>
#include <sched.h>
#include "queue.h"
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 dequeue(struct queue *q,void *buf,size_t size, int blocking){
struct list* tmp;
pthread_mutex_lock(&q->mutex);
if (q->list == NULL){
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;
}
buf=malloc(size);
memcpy(buf,q->list->elt,size); // C'est ici que je copie le contenue de l'element a virer dans le buffer de sauvegarde passé en parametre de la fonction[
printf("Buffer de dequeue : %s\n",(char *)buf);// Je teste sur un char *, sa s'affiche correctement, mais des que j'essaie d'afficher dans le main, sa foire...
if(q->list->next != NULL){
tmp=q->list;
q->list=q->list->next;
free(tmp);
}else{
free(q->list);
q->list= NULL;
}
q->total_size-=size;
pthread_mutex_unlock(&q->mutex);
return size;
}
int main() {
struct queue *exemple = queue_new(100);
const char *buf = "bonjour";
const char *buf2 = "comment";
void * cpy=NULL;// LE BUFFER DANS LEQUEL JE MET LA VALEUR RETIRÉE DE LA FILE AVEC DEQUEUE
enqueue(exemple,buf,7,0);// Enqueue fonctionne tres bien
enqueue(exemple,buf2,7,0);
dequeue(exemple,cpy,7,0);// Appel a la fonction qui nous interesse
printf("BUFFER : %s\n", (char * )cpy);// SA FOIRE ICI
if(exemple->list!= NULL){
printf("TETE %s\n",(char *)exemple->list->elt);
}
return 0;
} |