Принимаю входящий пакет через TDI_SET_EVENT_HANDLER установкой события TDI_EVENT_RECEIVE_DATAGRAM. Для того чтобы снять callback передаю NULL в качестве адреса туда же. Возможна ли ситуация при которой снятие callback через TDI_SET_EVENT_HANDLER уже завершилось, но callback всё ещё выполняется? Код (Text): NTSTATUS SdTdiRecieveHandler( IN void* tdi_event_context, IN LONG source_address_length, IN void* source_address, IN LONG options_length, IN void* options, IN ULONG receive_datagram_flags, IN ULONG bytes_indicated, IN ULONG bytes_available, IN ULONG *bytes_taken, IN void* tsdu, OUT PIRP *io_request_packet ) { //Точка2 } ... ... SetEventHandler(local_address_object, TDI_EVENT_RECEIVE_DATAGRAM, NULL, NULL); //Точка1 Если например на одном процессоре выполняется callback, т.е. процессор выполняет инструкции на "Точка2", возможно ли такое, что на другом процессоре будет выполнятся код на "Точка1"
Проблема в контексте передаваемом в callback, после закрытия соединения хочется удалить контекст(указатель tdi_event_context) из памяти, а для этого нужно чтобы callback больше не вызывался.
Проблема решается элементарно передачей ID контекста вместо непосредственно его адреса с последующим поиском в ассоциативном списке как при удалении контекста, так и при вызове колбека (карта ID - адрес структуры). Разумеется, не забываем про подсчёт ссылок на контекст: при создании контекста кол-во ссылок = 1, при захвате контекста в колбеке +1, при освобождении контекста -1, и при удалении также -1.