Реализация rundown protection в Windows XP SP2. Почему именно так ?

Тема в разделе "WASM.NT.KERNEL", создана пользователем Sheph, 24 фев 2008.

  1. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Вот сейчас разбираю реализацию rundown protection в WinXP и меня очень удивила реализация захвата rundown protection блока, исходный код здесь привести не могу, так что поясню на словах. Они там хотят инкрементировать переменную на 2 и вместо того чтобы сделать тупо InterlockedIncrement они делают InterlockedCompareExchangePointer в цикле до тех пор, пока им не удастся увелечить переменную на 2 (таким образом гарантируют атомарность операции). Вобщем, это всё даже не важно, вопрос у меня такой, а что быстрее работает InterlockedIncrement или InterlockedCompareExchangePointer ?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Increment быстрее конечно, это если идет увеличение на 1, однако там же неизвестно насколько нужно увеличить.
    Код (Text):
    1. NewValue = Value + EX_RUNDOWN_COUNT_INC * Count;
    тем более это же не просто инкремент, а идет еще атомарное сравнение со старым значением, не изменилось ли оно.
    имхо все понятно.
     
  3. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    n0name, ага, я как этот пост написал через некоторое время допёт что там не просто инкремент, нужно ещё проверять не начался ли rundown в промежуток времени от присвоения Value значения счётчика и до Interlocked*. Вопрос закрыт.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
  5. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    IceStudent, почему бы и нет, она довольно-таки оригинальна и эффективна, как мне показалось