I solved my problem. Using the valgrind cvs version (> 2.2.0), apr_cond_wait is working just fine.

Tangui

Tangui Morlier wrote:

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


begin:vcard
fn:Tangui Morlier
n:Morlier;Tangui
org:INRIA Futurs;Grand Large Project
email;internet:[EMAIL PROTECTED]
title:Associate Engineer
tel;work:+33 (0)1 69 15 42 32
url:http://www.lri.fr/~tmorlier/?signature
version:2.1
end:vcard

Reply via email to