(file) Return to slist.c CVS log (file) (dir) Up to [OMI] / omi / pal

File: [OMI] / omi / pal / slist.c (download)
Revision: 1.1, Mon Apr 20 17:19:55 2015 UTC (9 years ago) by krisbash
Branch: MAIN
CVS Tags: OMI_1_0_8_2, OMI_1_0_8_1, HEAD
OMI 1.0.8-1

#include "slist.h"

#if !defined(_MSC_VER)

PAL_INLINE void Atomic_Lock(
    _Inout_ volatile ptrdiff_t* dest)
{
    while (Atomic_Swap(dest, 1) == 1)
        while (*dest)
            ;
}

PAL_INLINE void Atomic_Unlock(
    _Inout_ volatile ptrdiff_t* dest)
{
    Atomic_Swap(dest, 0);
}

SListEntry* SList_FlushAtomic(
    _Inout_ SListHead* head)
{
    Atomic_Lock(&head->__private.lock);
    SListEntry* p = head->__private.next;
    head->__private.next = NULL;
    Atomic_Unlock(&head->__private.lock);
    return p;
}

SListEntry* SList_PushAtomic(
    _Inout_ SListHead* head,
    _Inout_ SListEntry* entry)
{
    SListEntry* p;

    Atomic_Lock(&head->__private.lock);

    entry->__private.next = head->__private.next;
    p = head->__private.next;
    head->__private.next = entry;

    Atomic_Unlock(&head->__private.lock);

    return p;
}

SListEntry* SList_PopAtomic(
    _Inout_ SListHead* head)
{
    Atomic_Lock(&head->__private.lock);

    SListEntry* p = head->__private.next;

    if (p)
    {
        head->__private.next = p->__private.next;
    }

    Atomic_Unlock(&head->__private.lock);

    return p;
}

#endif /* !defined(_MSC_VER) */

ViewCVS 0.9.2