I tried valgrind to profile my application using apr (apache portable
runtime) for Linux. I have problems with the wait for condition
(apr_cond_wait) : with valgrind, the application does not wait for a
signal. I build a similar test using pthread conditions, it works fine.
I join to this email 2 pieces of code : a test using pthread, an other
one using APR. Both work fine without valgrind. Using the profiling
tool with the apr test, the assertion failed because of the wait
condition.
Tangui
------------------------------------------------------------------------
#include <pthread.h>
#include <stdio.h>
#include <assert.h>
int cpt;
int pointers[2];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
/**
* Function executed on a different thread
*/
void* fonct(void* f) {
pthread_mutex_lock(&mutex);
//cpt must be 0
assert(pointers[cpt] != 0);
//Signal to the main thread we read the good cpt value
pthread_cond_signal(&cond);
printf("Signaled\n");
pthread_mutex_unlock(&mutex);
}
int main(int argv, char* argc) {
// Creation and initialization
pthread_t thread;
cpt = 0;
pointers[0] = 2;
pointers[1] = 0;
pthread_mutex_lock(&mutex);
pthread_create(&thread, NULL, fonct, NULL);
//here we wait until the other thread send us a signal
pthread_cond_wait(&cond, &mutex);
//Change the cpt value to see if the other thread get confused
cpt++;
printf("Wait done\n");
pthread_mutex_unlock(&mutex);
sleep(2);
/**
* We should here desctruct everything
*/
}
------------------------------------------------------------------------
#include <apr_thread_cond.h>
#include <apr_thread_proc.h>
#include <apr_thread_mutex.h>
#include <apr_pools.h>
#include <stdio.h>
#include <assert.h>
int cpt;
int pointers[2];
apr_thread_mutex_t * mutex;
apr_thread_cond_t * cond;
/**
* Function executed on a different thread
*/
void* APR_THREAD_FUNC fonct(apr_thread_t* t, void* f) {
apr_thread_mutex_lock(mutex);
//cpt must be 0
assert(pointers[cpt] != 0);
//Signal to the main thread we read the good cpt value
apr_thread_cond_signal(cond);
printf("Signaled\n");
apr_thread_mutex_unlock(mutex);
}
int main(int argv, char* argc) {
// Creation and initialization
apr_thread_t * thread;
apr_pool_t * pool;
apr_pool_initialize();
apr_pool_create(&pool, NULL);
cpt = 0;
pointers[0] = 2;
pointers[1] = 0;
apr_thread_mutex_create (&mutex, APR_THREAD_MUTEX_DEFAULT, pool);
apr_thread_cond_create(&cond, pool);
apr_thread_mutex_lock(mutex);
apr_thread_create(&thread, NULL, fonct, NULL, pool);
//here we wait until the other thread send us a signal
apr_thread_cond_wait(cond, mutex);
//Change the cpt value to see if the other thread get confused
cpt++;
printf("Wait done\n");
apr_thread_mutex_unlock(mutex);
sleep(2);
/**
* We should here desctruct everything
*/
}
------------------------------------------------------------------------
APR=`apr-config --link-ld --includes`
All: apr_test pthread_test
apr_test: testAPRCondition.c
$(CC) $(APR) -o apr_test testAPRCondition.c
pthread_test: testPThreadCondition.c
$(CC) -pthread -o pthread_test testPThreadCondition.c