Îïèñàíèå îøèáêè îò 19.12.2005. Èíòåðâàëüíûé òàéìåð íåïðàâèëüíî íà ñèñòåìàõ ñ NPTL
Ñôîðìèðîâàëîñü ïîäîçðåíèå íà áàãó â ðàáîòå èíòåðâàëüíîãî òàéìåðà è ñèãíàëîâ â NPTL íà ÿäðàõ >= 2.6.12.
Ïðîáëåìà â ñëåäóþùåì:
- èìååòñÿ çàäà÷à â êîòîðîé ñîçäà¸òñÿ ìíîæåñòâî ïîòîêîâ;
- êàæäûé ïîòîê ñîçäà¸ò ñîáñòâåííûé èíòåðâàëüíûé òàéìåð ñ èíäèâèäóàëüíûì ïåðèîäîì ñ ïîìîùüþ ôóíêöèé: setitimer() èëè timer_create();
- îáðàáîò÷èê ñèãíàëîâ äëÿ âñåõ ýòî ôóíêöèÿ ïóñòûøêà óêàçàííàÿ ñ ïîìîùüþ: signal();
- êàæäûé ïîòîê öèêëè÷åñêè âûïîëíÿåò ñâîé êîä ñ îæèäàíèåì ñèãíàëà ïîñëå ýòîãî ñ ïîìîùüþ ôóíêöèé: sigwait() èëè pause();
- íà ñèñòåìàõ áåç NPTL è íà ñèñòåìàõ ñ NPTL íà ÿäðàõ 2.4 (ALTLinux2.4, ASPLinux9) ñèãíàëû øëþòñÿ ïîòîêàì è îíè ïåðèîäè÷åñêè âûïîëíÿþò ñâîé êîä;
- íà ñèñòåìàõ ñ NPTL è ÿäðàìè >= 2.6.12 (SuSE10_64, Mandriva2006, FedoreCore4_64) ñèãíàëû øëþòñÿ ïðîöåññó, íî íå ïîòîêàì, â ðåçóëüòàòå ÷åãî ïîòîêè ñòîÿò íà îæèäàíèè ñèãíàëà;
Äëÿ ïðèìåðà íàïèñàíà òåñòîâàÿ ïðîãðàììà êîòîðàÿ âîñïðîèçâîäèò ýòó ïðîáëåìó. Íà ñèñòåìàõ áåç NPTL è íà ñèñòåìàõ ñ NPTL íà ÿäðàõ 2.4 (ALTLinux2.4, ASPLinux9) ðåçóëüòàòû å¸ ðàáîòû òàêèå:
ALTLinux2.4
//
Íà ñèñòåìàõ ñ NPTL è ÿäðàìè >= 2.6.12 (SuSE10_64, Mandriva2006, FedoreCore4_64) ðåçóëüòàòû å¸ ðàáîòû òàêèå:
SuSE 10 (64)
Èç ïðîòîêîëà âûïîëíåíèÿ ïðîãðàììû íà SuSE10 âèäíî ÷òî:
- öèêë ïîòîêà îäèí ðàç âûïîëíÿåòñÿ è ñòîïîðèòñÿ íà îæèäàíèè ñèãíàëà ôóíêöèåé sigwait(&set, &sig);
- ïðè ýòîì ñèãíàëû èäóò, íî íà ïðîöåññ, ÷òî âèäíî ïî ñîîáùåíèÿì "Exit from programm!" âîçíèêàþùèõ ïîñëå ôóíêöèè sleep(30) ñ ÷àñòîòîé 1 ñåê ïóò¸ì ïðåðûâàíèÿ ôóíêöèè sleep(30) ñèãíàëîì.
Ïðîáëåìó âûÿâëåíî íà äèñòðèáóòèâàé:
- SuSE 10 (64)
- Mandriva 2006
- FedoreCore4 (64)
Íà âñåõ ýòèõ äèñòðèáóòèâàõ èñïîëüçóåòñÿ: kernel >=2.6.12, glibc 2.3.5, gcc 4.0, NPTL
Íå âûÿâëåíî íà äèñòðèáóòèâàõ:
Ïîõîæå íà ïðîáëåìó â îñîáåííîñòè ðåàëèçàöèè èíòåðâàëüíîãî òàéìåðà íà NPTL.  ñâÿçè ñ êîòîðîé ñòàíîâèòñÿ íåâîçìîæíûì ïîëó÷èòü èíòåðâàëû â ïîòîêàõ äëÿ çàäà÷ òàêîãî òèïà.  ñâÿçè ñ ýòèì, äëÿ äàííûõ çàäà÷, ðàññìàòðèâàåòñÿ âàðèàíò èñïîëüçîâàíèÿ âîçìîæíîñòè òàéìåðà ñîçäàâàòü ïîòîê ïî èñòå÷åíèþ âðåìåíè.
Èñõîäíèêè òåñòîâîé ïðîãðàììû