[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