[d-kernel] kernel 2.4.32 .. 36 & pthreads проблема

gosha gosha на elins.ru
Пн Фев 4 22:03:11 MSK 2008


                          Добрый день.

   Существует плета на базе MIPS процессора.

   Плата поддерживается ядрами 2.6.18 и 2.4.36

   Для тестирования ядра используется один и тот же раздел HDD с одним и тем же glibc и пр.

Имеем тестовую программку:
/*==================================================*/
#include <pthread.h>
#include <stdio.h>
int check_me = 0;
void* func(void* data) 
{int i;
 printf("%s> check_me=0x%p==%d ...\r\n", __FUNCTION__, &check_me, check_me);
 getchar();
 check_me = 42; 
 fflush(stdout);
 return &check_me;
}
 int main()
 {pthread_t t;
   void *ret;
   printf("thread_create ...\r\n");
   fflush(stdout);
   pthread_create (&t, 0, func, 0);
   printf("pthread_join ...\r\n");
   fflush(stdout);
   fflush(stdout);
   thread_join (t, &ret);
   printf("%s> check_me=0x%p==%d ...\r\n", __FUNCTION__, &check_me, check_me);
   printf("return . . \r\n");
   fflush(stdout);
   return (check_me != 42 || ret != &check_me);
}
/*==================================================*/

   При пользовании ядра 2.6.18 - все ok,

   При пользовании ядра 2.4.32 .. 36 странным образом ломаются pthreads:
             - glibc собрано без поддержки nptl;
	     - после старта программы появляются 3 thread:
					1. родитель;
					2. __pthread_manager() из glibc;
					3. потомок;
	     - после нажатия кнопочки (см исходный текст тестового примера) срабатывает getchar() потомок завершается;
	     - при попытке забрать код завершения, __pthread_manager() получает SISSEGV в функции   
                                           int *__errno_location (void), 

             Но если запустить ту же тестовую программку под GDB- все проходит ok.

   Как бы (каким методом) можно было локализовать и исправить данную проблему?

  Спасибо.


Подробная информация о списке рассылки devel-kernel