cpu: enforce a memory barrier inside cpu_relax()
authorarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 29 Sep 2010 12:50:16 +0000 (12:50 +0000)
committerarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 29 Sep 2010 12:50:16 +0000 (12:50 +0000)
commit52c7785bca06ce9a837ac378662f351235ec10a7
treea14aa3773fb50c0f19872146120563471150bec0
parent93308de29d9092161217cfff1b1375b482937214
cpu: enforce a memory barrier inside cpu_relax()

Put a memory barrier inside cpu_relax() to make sure the compiler
doesn't cache variables used outside cpu_relax() in registers.

Suppose to have the following case (used in many device drivers):

static int done = false;

void irq_handler(void)
{
done = true;
}

void wait_for_completion(void)
{
while (done == false)
cpu_relax();
}

If cpu_relax() is just considered a nop the compiler may decide to not
reload the value in the variable "done" from memory, causing a
neverending loop.

The presence of an explicit memory barrier fixes this case.

git-svn-id: https://src.develer.com/svnoss/bertos/trunk@4344 38d2e660-2303-0410-9eaa-f027e97ec537
bertos/cpu/power.h