Вызов TDI_SET_EVENT_HANDLER и callback

Тема в разделе "WASM.NT.KERNEL", создана пользователем 100gold, 13 дек 2011.

  1. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Принимаю входящий пакет через TDI_SET_EVENT_HANDLER установкой события TDI_EVENT_RECEIVE_DATAGRAM.
    Для того чтобы снять callback передаю NULL в качестве адреса туда же. Возможна ли ситуация при которой снятие callback через TDI_SET_EVENT_HANDLER уже завершилось, но callback всё ещё выполняется?
    Код (Text):
    1. NTSTATUS
    2. SdTdiRecieveHandler(
    3.     IN void* tdi_event_context,
    4.     IN LONG source_address_length,
    5.     IN void* source_address,
    6.     IN LONG options_length,
    7.     IN void* options,
    8.     IN ULONG receive_datagram_flags,
    9.     IN ULONG bytes_indicated,
    10.     IN ULONG bytes_available,
    11.     IN ULONG *bytes_taken,
    12.     IN void* tsdu,
    13.     OUT PIRP *io_request_packet
    14.     )
    15. {
    16.     //Точка2
    17. }
    18. ...
    19.  
    20.  
    21. ...
    22. SetEventHandler(local_address_object,
    23.     TDI_EVENT_RECEIVE_DATAGRAM,
    24.     NULL,
    25.     NULL);
    26. //Точка1
    Если например на одном процессоре выполняется callback, т.е. процессор выполняет инструкции на "Точка2", возможно ли такое, что на другом процессоре будет выполнятся код на "Точка1"
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Легко!
    А в чём проблема-то?
     
  3. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Проблема в контексте передаваемом в callback, после закрытия соединения хочется удалить контекст(указатель tdi_event_context) из памяти, а для этого нужно чтобы callback больше не вызывался.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Проблема решается элементарно передачей ID контекста вместо непосредственно его адреса с последующим поиском в ассоциативном списке как при удалении контекста, так и при вызове колбека (карта ID - адрес структуры). Разумеется, не забываем про подсчёт ссылок на контекст: при создании контекста кол-во ссылок = 1, при захвате контекста в колбеке +1, при освобождении контекста -1, и при удалении также -1.
     
  5. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Спасибо, кажется все проблемы синхронизации получится решить с помощью этой идеи