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

Допустим, у меня есть 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);

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

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

0 ответов

Другие вопросы по тегам