[Kos-dev] "Race condition" 1

Thomas Petazzoni kos-dev@enix.org
Mon, 26 May 2003 11:19:58 +0200


This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enigCE45573027AB17608ED6B178
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 8bit

Bonjour,

> D'ou le "du type"...  Ceci dit, il me semblerait une bonne chose de
> faire comme pour cp0_switch "normal" : avoir un wrapper "C" pour la
> version assembleur "_internal", meme si le wrapper "C" ne fait
> absolument rien d'autre qu'appeler le _internal. 

Euh, tu parles de quelle fonction là, parce que cpl0_switch_no_return
appelle déjà son équivalent internal, de même pour cpl0_switch_with_return.

> C'est quoi le bit 1 du eflags ?

La doc dit "reserved, 1" ;-)

> write_spin_lock(*ptr_spin, flags) ? non ?

Pffiou, oui, on a qu'a mettre ça sur le compte de la fatique. En
revanche, tu veux le placer où le spin_unlock ? (Cf code).

Mais globalement, je trouve ça pas très beau de devoir passer un
pointeur sur le spinlock + les flags.

void kwaitqueue_add_waiting(struct kwaitqueue *kwq,
                            kwaitqueue_thread_cmp_fct_t cmp_fct,
                            void *arg, spinlock_t *lock, k_ui32_t
lock_flags)
{
  thread_t *old_thread, *next_thread;
  k_ui32_t flags;

  CONCEPTION_ASSERT(kwq != NULL);

  exclusive_spin_lock(global_kwaitqueue_lock, flags);

  ASSERT_FATAL(kwq->state == WAITQUEUE_READY);

  kwaitqueue_add_unsafe(kwq, WAITING,
                        cmp_fct, arg,
                        &old_thread, &next_thread);

  exclusive_spin_unlock_remote(global_kwaitqueue_lock, flags);

  /*** Moi je verrais bien le spin_unlock(*lock, lock_flags) ici. A
priori, vu qu'on a déjà relaché le lock global_kwaitqueue_lock, et qu'on
garde juste les interruptions, on a pas de risque de deadlock. (Pas sur). */

  /* Actual context switch */
  cpl0_switch_with_return(&(old_thread->cpu_context.cpl0),
                          next_thread->cpu_context.cpl0);
  /* Back */

  exclusive_spin_unlock_local(global_kwaitqueue_lock, flags);
}

Thomas
-- 
PETAZZONI Thomas - thomas DOT petazzoni AT enix DOT org - UIN : 34937744
Web: http://www.enix.org/~thomas/
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E  1624 F653 CB30 98D3 F7A7

--------------enigCE45573027AB17608ED6B178
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQE+0dw+9lPLMJjT96cRAotNAJ47EnHr9AAfpGgxJAjjt83zkJIsYQCcCOGZ
Ry10IT9HagFOaVswMK4zlMs=
=/gWH
-----END PGP SIGNATURE-----

--------------enigCE45573027AB17608ED6B178--