Primitive de synchronisation avec IO / Kit
-
25-10-2019 - |
Question
Je cherche une attente / synchronisation de signal primitive dans IO / Kit de travail comme:
Thread1: wait (myEvent) // Blocage thread1
Thread2: wait (myEvent) // Blocage thread2
Thread3: signal (myEvent) // sortie d'un des thread1 ou thread2
Cela ne peut pas être fait à l'aide d'un IOLOCK depuis seraient les opérations de verrouillage / déverrouillage de fils de différentes, ce qui est une mauvaise idée selon certains doc, je l'ai lu.
Thread1, 2, 3 peuvent être des fils de l'utilisateur ou les fils du noyau.
Je voudrais aussi avoir un temps en option avec l'opération d'attente.
Merci pour votre aide!
La solution
Vous voulez que la fonction IOLockSleepDeadline()
, a déclaré dans <IOKit/IOLocks.h>
.
Vous mettez en place un seul endroit de IOLock
avec IOLockAlloc()
avant de commencer. Ensuite, les fils 1 et 2 verrouiller le IOLOCK avec IOLockLock()
et quitter immédiatement le verrou et aller dormir en appelant IOLockSleepDeadline()
. Quand le fil 3 est prêt, il appelle IOLockWakeup()
(avec oneThread = true
si vous voulez seulement de se réveiller un seul fil). Cela provoque un fil 1 ou 2 de se réveiller et d'acquérir immédiatement le verrou (donc ils ont besoin pour déverrouiller ou encore le sommeil).
IOLockSleep()
fonctionne de façon similaire, mais sans le délai d'attente.
Vous pouvez faire quelque chose de similaire en utilisant commandSleep () du IOCommandGate de qui peut être plus approprié si votre pilote est déjà centré autour un IOWorkLoop
.
Autres conseils
La documentation de la méthode IOLocks::IOLockLock
stipule ce qui suit:
Verrouiller le mutex. Si le verrou est maintenu par un fil, pour bloquer en attente son déverrouillage. Cette fonction peut bloquer et ne devrait donc pas être appelé à partir niveau d'interruption ou pendant un verrou de rotation est maintenue. Le verrouillage du mutex récursive d'un fil entraînera dans une impasse.
Ainsi, il sera certainement pas bloquer les autres fils (T1 et T2) jusqu'à ce que le fil en maintenant les sorties verrouiller (T3). Une chose qu'il ne semble pas le soutien est le délai d'attente.