futex priority based wakeup
Benedict, Michael
MBenedict at twacs.com
Sat Sep 8 03:24:54 EST 2007
Thank you for the help!
Same result with fflush :(.
Are you maybe wrong because you have tested 2.5 and it doesn't work? Or
just uncertain?
The only thing I have read that mentions glibc version is the work Ingo
did against 2.4 glibc and in the 2.6.16-mm1 patches...
http://people.redhat.com/mingo/PI-futex-patches/. I can not detrmine
how this relates to the 2.6.22 priority based futex wakeup commit.
I am currently fighting crosstool-0.43 to build a newer glibc and I will
share results if/when I get that to work.
-Michael
Ilya Lipovsky wrote:
> ...Or maybe I am wrong :). Could you put fflush(stdout) after
> each printf,
> just to be completely certain that it misbehaves?
>
> -----Original Message-----
> From: linuxppc-embedded-bounces+lipovsky=cs.bu.edu at ozlabs.org
> [mailto:linuxppc-embedded-bounces+lipovsky=cs.bu.edu at ozlabs.or g] On
> Behalf Of Ilya Lipovsky Sent: Friday, September 07, 2007 12:41 PM
> To: 'Benedict, Michael'; linuxppc-embedded at ozlabs.org
> Subject: RE: futex priority based wakeup
>
> Looks like it is a libc issue. Apparently, GNU libc supports priority
> futexes only in version 2.5 and higher.
>
> -----Original Message-----
> From: linuxppc-embedded-bounces+lipovsky=cs.bu.edu at ozlabs.org
> [mailto:linuxppc-embedded-bounces+lipovsky=cs.bu.edu at ozlabs.or g] On
> Behalf Of Benedict, Michael Sent: Friday, September 07, 2007 11:02 AM
> To: linuxppc-embedded at ozlabs.org
> Subject: futex priority based wakeup
>
> I recently upgraded to 2.6.22 to get the priority based futex wakeup
> behavior. However, when I run a simple program (see below), based on
> either a pthread_mutex_t or a sem_t, it seems that threads
> are woken up
> in FIFO order. I am using glibc 2.3.6 with NPTL and TLS, based off
> crossdev-0.43. Could someone help me get priority-based
> wakeup or point
> me to a better place to get this question answered? Thank you,
> Michael
>
> Code:
>
> pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
>
> void *important(void *ign)
> {
> sleep(1);
> printf("important waiting for mutex\n");
> if(pthread_mutex_lock(&mymutex)) {
> perror("sem_wait");
> exit(1);
> } else {
> printf("important got mutex!\n");
> pthread_mutex_unlock(&mymutex);
> }
>
> return NULL;
> }
>
>
> void *unimportant(void *ign)
> {
> printf("unimportant waiting for mutex\n");
> if(pthread_mutex_lock(&mymutex)) {
> perror("sem_wait");
> exit(1);
> } else {
> printf("unimportant got mutex!\n");
> pthread_mutex_unlock(&mymutex);
> }
>
> return NULL;
> }
>
> int main()
> {
> struct sched_param p;
> pthread_attr_t attr;
> pthread_t i, u;
>
> pthread_mutex_lock(&mymutex);
>
> p.__sched_priority = sched_get_priority_min(SCHED_FIFO);
> if(-1 == p.__sched_priority) {
> perror("sched_get_priority_min");
> return 1;
> }
> pthread_attr_init(&attr);
> pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
> pthread_attr_setschedparam(&attr, &p);
> pthread_create(&u, &attr, unimportant, NULL);
>
> p.__sched_priority = sched_get_priority_max(SCHED_FIFO);
> pthread_attr_setschedparam(&attr, &p);
> pthread_create(&i, &attr, important, NULL);
>
> sleep(5);
> printf("main unlocking mutex\n");
> pthread_mutex_unlock(&mymutex);
>
> pthread_join(u, NULL);
> pthread_join(i, NULL);
>
> return 0;
> }
>
> Which produces:
> unimportant waiting for mutex
> important waiting for mutex
> main unlocking mutex
> unimportant got mutex!
> important got mutex!
>
> _______________________________________________
> Linuxppc-embedded mailing list
> Linuxppc-embedded at ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-embedded
>
> _______________________________________________
> Linuxppc-embedded mailing list
> Linuxppc-embedded at ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-embedded
More information about the Linuxppc-embedded
mailing list