Fork of LCD-Window which works with Enhanced TextLCD from Wim

Fork of LcdWindow by Hendrik Lipka

semaphore.cpp

Committer:
charly
Date:
2016-01-13
Revision:
13:99b500b05716
Parent:
10:d40c70908bf0

File content as of revision 13:99b500b05716:

/**
 * code from Igor Skochinsky
 * taken from http://mbed.org/forum/mbed/post/799/
*/

#include "semaphore.h"

Semaphore::Semaphore(): s(SemFree) {};
bool Semaphore::_abort=false;

bool Semaphore::take(bool block) {
    if (_abort)
        block=false;
    int oldval;
/*    
#if defined(TARGET_LPC1768) // on Cortex-M3 we can use ldrex/strex
    do {
        // read the semaphore value
        oldval = __ldrex(&s);
        // loop again if it is locked and we are blocking
        // or setting it with strex failed
    } while ( (block && oldval == SemTaken) || __strex(SemTaken, &s) != 0 );
    if ( !block ) __clrex(); // clear exclusive lock set by ldrex
#else // on arm7 there's only swp

    do {
        // swp sets the pointed data to the given value and returns the previous one
        oldval = __swp(SemTaken, &s);
        // if blocking, loop until the previous value becomes 0
        // which would mean we have successfully taken the lock
    } while (block && oldval == SemTaken);
//#endif

    return oldval == SemFree;
*/
return true;    
}

// release the semaphore
void Semaphore::release() {
    s = SemFree;
}