[Kos-dev] Semaphores sous Linux
Thomas Petazzoni
thomas.petazzoni at enix.org
Wed Jun 23 20:49:44 CEST 2004
Salut,
Voilà un bout de code de include/asm-i386/rwsem.h :
static inline void __down_write(struct rw_semaphore *sem)
{
int tmp;
tmp = RWSEM_ACTIVE_WRITE_BIAS;
__asm__ __volatile__(
"# beginning down_write\n\t"
/* subtract 0x0000ffff, returns the old value */
LOCK_PREFIX " xadd %%edx,(%%eax)\n\t"
/* was the count 0 before? */
" testl %%edx,%%edx\n\t"
/* jump if we weren't granted the lock
" jnz 2f\n\t" */
"1:\n\t"
LOCK_SECTION_START("")
"2:\n\t"
" pushl %%ecx\n\t"
" call rwsem_down_write_failed\n\t"
" popl %%ecx\n\t"
" jmp 1b\n"
LOCK_SECTION_END
"# ending down_write"
: "=m"(sem->count), "=d"(tmp)
: "a"(sem), "1"(tmp), "m"(sem->count)
: "memory", "cc");
}
Je comprends pas exactement comment ça fonctionne. A priori, on
soustrait 0x0000ffff, et on récupère l'ancienne valeur du compteur de la
semaphore. Ensuite, on regarde si c'est 0. Si c'était 0, alors, on a pas
la sémaphore, on saute en 2:, qui va appeler rwsem_down_write_failed qui
va nous mettre en attente.
Mais si jamais le compteur n'atteint pas 0, on passe pas à 2:, mais on
poursuit vers 1: qui fait cet énigmatique LOCK_SECTION_START ... Mais
ensuite on continue sur deux ... qui va nous mettre en attente, non ?
Alors dans le cas où on peut prendre la sémaphore (aka le compteur
n'est pas à 0), comment ça se passe ?
Merci,
Thomas
--
PETAZZONI Thomas - thomas.petazzoni at enix.org
http://thomas.enix.org - Jabber: kos_tom at sourcecode.de
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E 1624 F653 CB30 98D3 F7A7
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://the-doors.enix.org/pipermail/kos-dev/attachments/20040623/7b4e94e0/attachment.pgp
More information about the Kos-dev
mailing list