Display text on LCD displays (even on multiple ones). Allow to create windows (frames) on display, and to combine them (split, add, duplicate, scroll). See http://mbed.org/users/hlipka/notebook/lcdwindow/ for more information.

Dependents:   Mbell

semaphore.cpp

Committer:
hlipka
Date:
2011-02-22
Revision:
9:2fe93daa2106
Parent:
3:e5d5e2fe4bf6

File content as of revision 9:2fe93daa2106:

/**
 * 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;
}

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