У меня есть конкретная функция (обработчик сигналов), для которой я хотел бы обнаружить рекурсию, т.е. выяснить, вызывала ли функция прямо или косвенно себя. Хитрость заключается в том, что функция в какой-то момент вызывает некоторый код, не находящийся под ее контролем, и этот код может делать что угодно.
Обычно я бы просто написал что-то вроде
void foo() {
static int recursed = 0;
if(recursed) {
...
}
recursed = 1;
othercode();
recursed = 0;
}
но в этом случае я обеспокоен тем, что othercode
может использовать longjmp
или что-то подобное для выхода, в результате чего recursed
останется равным 1. В случае, если моя функция выскочит таким образом, я хочу убедиться, что она не видеть себя рекурсивным, если вызывается позже (тот факт, что он longjmp
не является проблемой в противном случае).
Примечание. Я считаю longjmp
вероятным. othercode
— это цепочный обработчик сигналов из какого-то другого кода в дикой природе, и существуют обработчики, например, для. SIGSEGV
, которые используют longjmp
для восстановления контекста (например, в качестве обработчиков исключений «защиты от сбоев»). Обратите внимание, что использование longjmp
в синхронном обработчике сигнала, как правило, безопасно. В любом случае, меня не особенно волнует, безопасен ли вообще другой код, потому что я не могу его контролировать.
longjmp
вероятно, или просто о том, что это возможно? - person Patashu   schedule 05.06.2013jongjmp
, вы можете поместить туда код, чтобы очистить индикацию рекурсии. - person ugoren   schedule 05.06.2013