diff options
| author | Michael Sevakis <jethead71@rockbox.org> | 2007-10-19 06:19:06 +0000 |
|---|---|---|
| committer | Michael Sevakis <jethead71@rockbox.org> | 2007-10-19 06:19:06 +0000 |
| commit | 26b3a7405d65fecfd4ef7119042513a89a0a5140 (patch) | |
| tree | 0f431c74a13961976d58197c2cc65903e96d4cce | |
| parent | 1e199cd25ef05794095951458ac2a3495da2357b (diff) | |
| download | rockbox-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.c | 46 |
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; } /*--------------------------------------------------------------------------- |