У меня есть определенная функция (обработчик сигнала), для которой я хотел бы обнаружить рекурсию, т.е. выяснить, вызвана ли функция прямо или косвенно называемой самой. Сложный бит в том, что функция вызывает некоторый код, который не находится под его контролем в какой-то момент, и этот код мог что-то сделать.
Обычно я просто пишу что-то вроде
void foo() {
static int recursed = 0;
if(recursed) {
...
}
recursed = 1;
othercode();
recursed = 0;
}
но в этом случае я обеспокоен тем, что othercode
может использовать longjmp
или аналогичный для разрыва, в результате чего recursed
остается в 1. В случае, если моя функция выскочила из этого, Я хочу убедиться, что он не считает себя рекурсивным, если он вызван позже (тот факт, что это longjmp
'd out, не является проблемой в противном случае).
Примечание. Я считаю longjmp
вероятным. othercode
является цепным сигнальным обработчиком из какого-либо другого кода в-диком, и существуют, например, обработчики, например. SIGSEGV
, которые используют longjmp
для восстановления контекста (например, как обработчики исключений "защита от ошибок" ). Обратите внимание, что использование longjmp
в синхронном обработчике сигналов, как правило, безопасно. В любом случае, я не особо забочусь о том, безопасен ли другой код вообще, потому что это не то, что под моим контролем.