summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-10-19 06:19:06 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-10-19 06:19:06 +0000
commit26b3a7405d65fecfd4ef7119042513a89a0a5140 (patch)
tree0f431c74a13961976d58197c2cc65903e96d4cce
parent1e199cd25ef05794095951458ac2a3495da2357b (diff)
downloadrockbox-26b3a7405d65fecfd4ef7119042513a89a0a5140.zip
rockbox-26b3a7405d65fecfd4ef7119042513a89a0a5140.tar.gz
rockbox-26b3a7405d65fecfd4ef7119042513a89a0a5140.tar.bz2
rockbox-26b3a7405d65fecfd4ef7119042513a89a0a5140.tar.xz
Reverse some logic with Peterson's algorithm and cut an instruction. Make C-reference reflect it.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15199 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/thread.c46
1 files changed, 24 insertions, 22 deletions
diff --git a/firmware/thread.c b/firmware/thread.c
index f7100a7..930e149 100644
--- a/firmware/thread.c
+++ b/firmware/thread.c
@@ -273,16 +273,15 @@ void corelock_lock(struct corelock *cl)
asm volatile (
"mov r1, %0 \n" /* r1 = PROCESSOR_ID */
"ldrb r1, [r1] \n"
- "mov r3, #1 \n" /* cl->myl[core] = 1 */
- "strb r3, [r0, r1, lsr #7] \n"
+ "strb r1, [r0, r1, lsr #7] \n" /* cl->myl[core] = core */
"and r2, r1, #1 \n" /* r2 = othercore */
"strb r2, [r0, #2] \n" /* cl->turn = othercore */
"1: \n"
- "ldrb r3, [r0, r2] \n" /* cl->myl[othercore] == 1 ? */
- "cmp r3, #1 \n"
- "ldreqb r3, [r0, #2] \n" /* && cl->turn == othercore ? */
- "cmpeq r3, r2 \n"
- "bxne lr \n" /* no? lock acquired */
+ "ldrb r3, [r0, r2] \n" /* cl->myl[othercore] == 0 ? */
+ "cmp r3, #0 \n"
+ "ldrneb r3, [r0, #2] \n" /* || cl->turn == core ? */
+ "cmpne r3, r1, lsr #7 \n"
+ "bxeq lr \n" /* yes? lock acquired */
"b 1b \n" /* keep trying */
: : "i"(&PROCESSOR_ID)
);
@@ -299,17 +298,16 @@ int corelock_try_lock(struct corelock *cl)
asm volatile (
"mov r1, %0 \n" /* r1 = PROCESSOR_ID */
"ldrb r1, [r1] \n"
- "mov r3, #1 \n" /* cl->myl[core] = 1 */
- "strb r3, [r0, r1, lsr #7] \n"
+ "strb r1, [r0, r1, lsr #7] \n" /* cl->myl[core] = core */
"and r2, r1, #1 \n" /* r2 = othercore */
"strb r2, [r0, #2] \n" /* cl->turn = othercore */
"1: \n"
- "ldrb r3, [r0, r2] \n" /* cl->myl[othercore] == 1 ? */
- "cmp r3, #1 \n"
- "ldreqb r3, [r0, #2] \n" /* && cl->turn == othercore? */
- "cmpeq r3, r2 \n"
- "movne r0, #1 \n" /* no? lock acquired */
- "bxne lr \n"
+ "ldrb r3, [r0, r2] \n" /* cl->myl[othercore] == 0 ? */
+ "cmp r3, #0 \n"
+ "ldrneb r3, [r0, #2] \n" /* || cl->turn == core? */
+ "cmpne r3, r1, lsr #7 \n"
+ "moveq r0, #1 \n" /* yes? lock acquired */
+ "bxeq lr \n"
"mov r2, #0 \n" /* cl->myl[core] = 0 */
"strb r2, [r0, r1, lsr #7] \n"
"mov r0, r2 \n"
@@ -348,10 +346,14 @@ void corelock_lock(struct corelock *cl)
const unsigned int core = CURRENT_CORE;
const unsigned int othercore = 1 - core;
- cl->myl[core] = 1;
+ cl->myl[core] = core;
cl->turn = othercore;
- while (cl->myl[othercore] == 1 && cl->turn == othercore);
+ for (;;)
+ {
+ if (cl->myl[othercore] == 0 || cl->turn == core)
+ break;
+ }
}
/*---------------------------------------------------------------------------
@@ -363,16 +365,16 @@ int corelock_try_lock(struct corelock *cl)
const unsigned int core = CURRENT_CORE;
const unsigned int othercore = 1 - core;
- cl->myl[core] = 1;
+ cl->myl[core] = core;
cl->turn = othercore;
- if (cl->myl[othercore] == 1 && cl->turn == othercore)
+ if (cl->myl[othercore] == 0 || cl->turn == core)
{
- cl->myl[core] = 0;
- return 0;
+ return 1;
}
- return 1;
+ cl->myl[core] = 0;
+ return 0;
}
/*---------------------------------------------------------------------------