ОС: FreeBSD 6.2
Есть такая задача:
Узнать ID потока (не процеса PID а имено потока TreadID) в модуле ядра. Тоесть в функциях open, read, write, ioct и т.д.Вот пример:
Есть две потока каждый вызивает к примеру ioct моего модуля там же я вывожу TreadID. Беру его я из структуры struct thread *td, которая передаеться параметром в мою функцию обработчика системного вызова ioctl. Вместо нее можно исполльзовать глобальну переменную curthread что есть еквиваленьным.
test.c
///Test thread
int h;
void *routine(void *arg)
{
char buf[127];
ioctl(h, STATUS, &buf);
return NULL;
}
///Test main function
int main()
{
pthread_t threadID1;
pthread_t threadID2;
h = open("/dev/mydev", O_RDWR);
if (h < 0)
return -1;
pthread_create(&threadID1, NULL, &routine, NULL);
pthread_create(&threadID2, NULL, &routine, NULL);
sleep(10);
close(h);
return 0;
}
driver.c
///Device driver
int can_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *td)
{
....
printf("ThreadID=%d\n", td->td_tid);
// or printf("ThreadID=%d\n", curthread->td_tid);
....
}
Но td/curthread имееют одинаковые адреса, сотвествено и значения поля td_tid (как вияснл експеремнтальным путем оно соответсвует ID главного (main()) потока процес).! Почему?
Причем если делать какие небуть действия (доступ к апаратуре и.т.д) в iotcl. Тогда эты значение начинають отличаться :(
Потоки уже и порождал с задержкой друг от друга, и засускал в разное время, ничегон е меняеться. Уже замахался исходжники ядра парсать :) что узнать причниу или хотябы как формируеться параметр struct thread *td. Пытался синхронизировать и спин мютексом и Giant. Без результатно.
Кто небуть обяснить может в чем причина?