Имам конкретна функция (манипулатор на сигнали), за която бих искал да открия рекурсия, т.е. да разбера дали функцията се е самоизвикала пряко или непряко. Трудното е, че функцията извиква код, който не е под нейния контрол в един момент и този код може да направи всичко.
Обикновено бих написал нещо подобно
void foo() {
static int recursed = 0;
if(recursed) {
...
}
recursed = 1;
othercode();
recursed = 0;
}
но в този случай съм загрижен, че othercode
може да използва longjmp
или подобно, за да излезе, в резултат на което recursed
да остане на 1. В случай, че функцията ми бъде прескочена по този начин, искам да се уверя, че няма вижда себе си като рекурсивно, ако се извика по-късно (фактът, че е longjmp
излязъл от не е проблем в противен случай).
Забележка: Считам longjmp
за вероятно. othercode
е манипулатор на верижен сигнал от някакъв друг in-the-wild код и съществуват манипулатори за напр. SIGSEGV
, които използват longjmp
за възстановяване на контекст (напр. като манипулатори на изключения за "защита от грешки"). Имайте предвид, че използването на longjmp
в синхронен манипулатор на сигнали обикновено е безопасно. Във всеки случай не ме интересува особено дали другият код изобщо е безопасен, защото не е нещо под мой контрол.
longjmp
е вероятно или просто това е възможност? - person Patashu   schedule 05.06.2013jongjmp
, можете да поставите код там, за да изчистите индикацията за рекурсия. - person ugoren   schedule 05.06.2013