apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Wong James" <jameswang0...@hotmail.com>
Subject HELP: apr_thread_cond_timedwait can not work on Linux
Date Mon, 15 Sep 2003 07:50:54 GMT
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  


Mime
View raw message