I have the following problem with this segment of code. Can some one please help?
Note: QueueItem is being created on a different thread.
WorkItem * Dequeue(Queue ** Q)
{
if(QueueIsEmpty(*Q)) return NULL;
QueueItem * tmp = (*Q)->Head;
(*Q)->Head = ((*Q)->Head)->NextItem;
WorkItem * retval = tmp->workItem;
free(tmp); //Generates glibc detected *** free(): invalid pointer
return retval;
}
edit This function is protected on access when multiple threads are running.
WorkItem * DequeueSynchronous(Queue ** Q)
{
WorkItem * retval;
pthread_mutex_lock((*Q)->QueMutex);
retval = Dequeue (Q);
pthread_mutex_unlock((*Q)->QueMutex);
return retval;
}
(*Q)->Head; is allocated my malloc.
Queue * Queue_Init(pthread_mutex_t * mutex)
{
Queue * retval = (Queue *)malloc(sizeof(Queue *));
retval->Head = retval->Tail =NULL;
retval->QueMutex = mutex;
return retval;
}
void Enqueue (Queue * Q, WorkItem * WI)
{
if(!Q)return;
QueueItem * QI = (QueueItem *) malloc(sizeof(QueueItem *));
QI->workItem = WI;
QI->NextItem = NULL;
if(QueueIsEmpty(Q))
{
Q->Head = Q->Tail = QI;
return;
}
Q->Tail->NextItem = QI;
Q->Tail = QI;
}
void EnqueueSynchronous (Queue * Q, WorkItem * WI)
{
pthread_mutex_lock(Q->QueMutex);
Enqueue (Q, WI);
pthread_mutex_unlock(Q->QueMutex);
}
Also thanks for the input, I will look at valgrind.
EDIT 2
typedef struct {
char ** FileNames;
int ** Results;
int NumOfItems;
}WorkItem;
typedef struct QI{
WorkItem * workItem;
struct QI * NextItem;
}QueueItem;
typedef struct {
QueueItem * Head, * Tail;
pthread_mutex_t * QueMutex;
}Queue;
Dequeue is called -Dequeue(&WorkQue)
All threads that call Dequeue
were given &WorkQue
as part of their args;
typedef struct{
int ThreadID;
WorkItem * workItem;
char ** keywordsArray;
int nKeywords;
Queue ** WorkQueue, ** WorkCompletedQ;
}ThreadArgs;
pthread_t threads[NTHREADS];
ThreadArgs threadArgs[NTHREADS];
for(i=0;i<NTHREADS;i++)
{
threadArgs[i].ThreadID=i;
threadArgs[i].workItem = Dequeue(&WorkQue);
threadArgs[i].WorkQueue = &WorkQue;
threadArgs[i].WorkCompletedQ = &WorkCompletedQ;
threadArgs[i].nKeywords=_kwlist->length;
threadArgs[i].keywordsArray = ListToArray(*_kwlist);
}
for(i=0;i<NTHREADS;i++)
{
pthread_create(&threads[i], NULL, WorkerThread,(void *)&(threadArgs[i]));
}
each thread calls dequeue using myWork = DequeueSynchronous(myThreadArgs->WorkQueue);