Предотвращение повторного входа и обеспечение согласованного состояния

#api #sdk #consistency #reentrancy

#API #sdk #согласованность #повторный вход

Вопрос:

Итак, допустим, у меня есть C API, который выглядит следующим образом:

 // configure various parameters
int set_option(const char* name, const char* value);

// callback invoked during long running operation
typedef int (*callback_t)(void* whatever);

// start a long running operation
int some_long_operation(callback_t callback);
  

Эти функции документированы как не являющиеся реентерабельными. Должен ли я попытаться обеспечить это (например, установив где-нибудь флаг и вернув соответствующий код ошибки) или я должен просто записать if off как неопределенное поведение? Большая часть кода, который я видел, не пытается этого сделать; Мне просто интересно, является ли это сознательным решением или это просто прагматизм (или, возможно, лень). Мне кажется, что если вы хотите написать действительно надежный код, вы могли бы попробовать что-то вроде этого; с другой стороны, если вы не следуете документации, то, возможно, все ставки следует отменить.

Как член команды, ответственной за поддержку SDK, мой опыт временами был пугающим. Конечно, наша документация не очень хороша, но я видел некоторые довольно странные вещи в запросах поддержки OEM. Большое количество из них связано с вызовом функций в контексте обратного вызова, вызываемого другой функцией. Большинство из них документированы как не поддерживаемые, но у нас нет никакого кода для предотвращения этого; фактически, большинство примеров этого, по-видимому, работают, но некоторые могут фактически разрушить наше внутреннее состояние. Просто иногда кажется, что было бы проще обеспечить надлежащее использование API, чем полагаться на то, что люди читают документацию.

Комментарии:

1. Когда вы говорите о повторном входе, вы также включаете потокобезопасность (т. Е. эта функция не является потокобезопасной) в этом или это отдельная проблема поверх повторного входа?

2. Для целей этого вопроса меня интересует только повторный вход, хотя я полагаю, что безопасность потоков могла бы быть обработана аналогичным образом.