hi-
  I can't get apr_thread_timedwait work on Redhat 9.0.

Envoriment: Redhat 9.0, glibc 2.3.2, apr source from 0.93 to the lastest snapshot of 9/14.

  My source:
  I inserted the following code into apr/test/testlock.c
/*sourc begin -----------------------------------------------------------*/
apr_thread_mutex_t *mymutex;
apr_thread_cond_t  *mycond;

static void *APR_THREAD_FUNC mythd(apr_thread_t *thd, void *data)
{
        
        apr_sleep(apr_time_from_sec(2));
        apr_thread_mutex_lock(mymutex);
        apr_thread_cond_signal(mycond);
        apr_thread_mutex_unlock(mymutex);
        return NULL;
}

void mytest(void)
{
        apr_status_t rv;
        apr_thread_t *thd;
        apr_status_t s0;

        rv = apr_thread_mutex_create(&mymutex, APR_THREAD_MUTEX_UNNESTED, p);
        rv = apr_thread_cond_create(&mycond, p);

        s0 = apr_thread_create(&thd, NULL, mythd, NULL, p);
        apr_thread_mutex_lock(mymutex);
        printf("Enter waiting...\n");
        rv = apr_thread_cond_timedwait(mycond, mymutex, apr_time_from_sec(5));
        //rv = apr_thread_cond_wait(mycond, mymutex);// This function works
        if (rv == APR_SUCCESS)
        printf("Waiting successfully!\n");
        else
                printf("Waiting timeout!\n");
        apr_thread_mutex_unlock(mymutex);

}
/*sourc end -------------------------------------------------------*/
The above code was blocked at apr_thread_cond_timedwait.

Then I change all apr_thread_* to pthread_* just like the following:
/*sourc begin -----------------------------------------------------------*/
pthread_mutex_t mypmutex;
pthread_cond_t mypcond;

static void *APR_THREAD_FUNC mypthd(apr_thread_t *thd, void *data)
{
        apr_sleep(apr_time_from_sec(2));
        pthread_mutex_lock(&mypmutex);
        pthread_cond_signal(&mypcond);
        pthread_mutex_unlock(&mypmutex);
        return NULL;
}
void myptest(void)
{
        apr_thread_t *thd;
        struct timespec abstime;

        apr_time_t then;

        pthread_mutexattr_t mattr;
        apr_status_t rv;

        then = apr_time_now() + apr_time_from_sec(5);

        abstime.tv_sec = apr_time_sec(then);

        abstime.tv_nsec = apr_time_usec(then) * 1000; /* nanoseconds */
        
        pthread_mutexattr_init(&mattr);
        pthread_mutex_init(&mypmutex, &mattr);
        pthread_mutexattr_destroy(&mattr);
        pthread_cond_init(&mypcond, NULL);
        apr_thread_create(&thd, NULL, mypthd, NULL, p);

        pthread_mutex_lock(&mypmutex);
        printf("Enter waiting...\n");
        rv = pthread_cond_timedwait(&mypcond, &mypmutex, &abstime);
        //rv = apr_thread_cond_wait(mycond, mymutex);
        if (rv == APR_SUCCESS)
        printf("Waiting successfully!\n");
        else
                printf("Waiting timeout!\n");
        pthread_mutex_unlock(&mypmutex);
        
}
/*sourc end -------------------------------------------------------*/
It worked! Can anyone tell me the reason? Thank you very much!

best regards,

James

_________________________________________________________________
与联机的朋友进行交流,请使用 MSN Messenger: http://messenger.msn.com/cn




Reply via email to