You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by Tangui Morlier <Ta...@lri.fr> on 2005/02/24 15:41:44 UTC

Valgrind/APR compatibility

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

Re: Valgrind/APR compatibility

Posted by Tangui Morlier <Ta...@lri.fr>.
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
>