портирую gcc atomics в вижуалстудию
http://trac.mcs.anl.gov/projects/openpa/
смотрим src/primitives/opa_gcc_intrinsics.h
и смотрим в src/primitives/opa_nt_intrinsics.h
ну оно же разное возвращает! или нет?
есть занятная либа openpa смотрим src/primitives/opa_gcc_intrinsics.h
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv)
{
return __sync_val_compare_and_swap(&ptr->v, oldv, newv, /* protected variables: */ &ptr->v);
}
и смотрим в src/primitives/opa_nt_intrinsics.h
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv)
{
return _InterlockedCompareExchangelong *)&(ptr->v newv, oldv);
}
ну оно же разное возвращает! или нет?
Даже не читая документацию я тебе могу сказать, что это с 99% вероятностью одно и то же и просто является оберткой над lock cmpxchg.
ну оно же разное возвращает! или нет?С чего вдруг?
The “val” version returns the contents of *ptr before the operation.
The function returns the initial value of the Destination parameter.
глаз замылился
для __sync_add_and_fetch есть InterlockedExchangeAdd
а для __sync_and_and_fetch самому писать, да?
ох винда такая винда...
и что-то мне подсказывает, что штатными инринсинками я это не сделаю. ох придётся-таки ассемблер расчехлить
портирую gcc atomics в вижуалстудидокатились
use std/boost :: atomics, Luke!
обёртки делать, ня?
буст тащить, в ядро?! чур меня
посмотрим, справится ли крокодил из _ATOMIC_THREAD_FENCE
посмотрим, справится ли крокодил из _ATOMIC_THREAD_FENCEа как ты это проверять собираешься?
нагрузочным тестированием, не?
буст тащить, в ядро?! чур меняну ты как-то неясно изначально описал задачу
ссылки такие уж приводил бы: http://msdn.microsoft.com/en-us/library/windows/hardware/ff5...
а в бусте\стд можно хотя бы подглядеть реализацию и ничего самому не выдумывать
какие у тебя вообще ограничения на код в драйвере? там же не все функции доступны даже из Си
посмотрим, справится ли крокодил из _ATOMIC_THREAD_FENCEНепонятно, что за конструкция имеется в виду, но на барьерах и неатомарных операциях пытаться строить атомарные не стоит. Когда есть работающий compare-and-swap, операции типа __sync_OP_and_fetch делаются через цикл с cas-ом. Посмотри какой ассемблер тот же gcc генерирует на x86 для __sync_and_and_fetch, например.
Посмотри какой ассемблер тот же gcc генерирует на x86 для __sync_and_and_fetch, например.
lock andq
Вот и весь код.
а, да. если поюзать возвращаемое значение (которое _and_fetch будет cas-retry цикл
Оставить комментарий
yolki
вот рассмотрим __sync_bool_compare_and_swaphttp://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins...
http://pic.dhe.ibm.com/infocenter/compbg/v121v141/topic/com....
Вроде ей соответствует InterlockedCompareExchange
http://msdn.microsoft.com/en-us/library/windows/desktop/ms68...
только параметры местами поменять
либо это совсем не то и надо как-то изворачиваться и писать своё, либо я что-то недопонимаю