портирую gcc atomics в вижуалстудию

yolki

вот рассмотрим __sync_bool_compare_and_swap
http://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...
только параметры местами поменять
Return value
The function returns the initial value of the Destination parameter.
либо это совсем не то и надо как-то изворачиваться и писать своё, либо я что-то недопонимаю

yolki

есть занятная либа openpa http://trac.mcs.anl.gov/projects/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);
}

ну оно же разное возвращает! или нет?

salamander

Даже не читая документацию я тебе могу сказать, что это с 99% вероятностью одно и то же и просто является оберткой над lock cmpxchg.

salamander

ну оно же разное возвращает! или нет?
С чего вдруг?
The “val” version returns the contents of *ptr before the operation.

The function returns the initial value of the Destination parameter.

yolki

а, ок.
глаз замылился ;)

yolki

так, ерунда какя-то.
для __sync_add_and_fetch есть InterlockedExchangeAdd
а для __sync_and_and_fetch самому писать, да?
ох винда такая винда...

yolki

и что-то мне подсказывает, что штатными инринсинками я это не сделаю. ох придётся-таки ассемблер расчехлить :crazy:

Maurog

портирую gcc atomics в вижуалстуди
докатились
use std/boost :: atomics, Luke!

yolki

да, но у меня си :crazy:
обёртки делать, ня?
буст тащить, в ядро?! чур меня
посмотрим, справится ли крокодил из _ATOMIC_THREAD_FENCE

zya369

посмотрим, справится ли крокодил из _ATOMIC_THREAD_FENCE
а как ты это проверять собираешься?

yolki

нагрузочным тестированием, не?

Maurog

буст тащить, в ядро?! чур меня
ну ты как-то неясно изначально описал задачу
ссылки такие уж приводил бы: http://msdn.microsoft.com/en-us/library/windows/hardware/ff5...
а в бусте\стд можно хотя бы подглядеть реализацию и ничего самому не выдумывать
какие у тебя вообще ограничения на код в драйвере? там же не все функции доступны даже из Си

procenkotanya

посмотрим, справится ли крокодил из _ATOMIC_THREAD_FENCE
Непонятно, что за конструкция имеется в виду, но на барьерах и неатомарных операциях пытаться строить атомарные не стоит. Когда есть работающий compare-and-swap, операции типа __sync_OP_and_fetch делаются через цикл с cas-ом. Посмотри какой ассемблер тот же gcc генерирует на x86 для __sync_and_and_fetch, например.

salamander

Посмотри какой ассемблер тот же gcc генерирует на x86 для __sync_and_and_fetch, например.
lock andq

Вот и весь код.

procenkotanya

а, да. если поюзать возвращаемое значение (которое _and_fetch будет cas-retry цикл
Оставить комментарий
Имя или ник:
Комментарий: