spinlock

En cas d'accès à une même ressource (mémoire ou io) depuis une interruption, une DPC ou l'entrée du driver vous pouvez avoir des risques de conflits d'accès.

Pour les éviter vous pouvez utiliser un sémaphore ou spinlock en langage microsoft :

KSPIN_LOCK FifoSpin;                 // déclaration

KeInitializeSpinLock(&FifoSpin); // initialisation

Ensuite avant chaque section de code où il y a risque de conflit, vous devez réserver le spinlock :

KIRQL savIrq;

KeAcquireSpinLock(&FifoSpin,&savIrq);

puis après les traitements le libérer

KeReleaseSpinLock(&FifoSpin,savIrq);

Ainsi une seule section de code encadré par ces deux instructions pourra s'exécuter à un instant donné, si une autre tente de demander le spinlock elle sera mise en attente jusqu'à libération du spinlock.

Si ces traitements peuvent être localisés dans un sous-programme, cela peut s'automatiser par une section critique qui n'est pas traitée ici.

 

Accueil ] Remonter ]