2010-10-29 20 views
3

Je suis en train de transférer un mixage audio de directsound sur Windows à alsa sous Linux. J'interroge, disons, 16 descripteurs de fichiers en utilisant l'appel système "sondage". Maintenant, je dois être en mesure d'annuler le sondage en quelque sorte. Sous Windows, j'utilise les WaitForMultipleObjects en utilisant des événements et quand j'ai besoin d'abandonner l'attente, j'ai juste SetEvent sur l'un des événements provoquant l'attente de retour. Y at-il un moyen de marquer un descripteur de fichier dans Linux "prêt" afin que le sondage va revenir?Abandon linux polling

J'ai jeté un oeil à ppoll mais je ne suis pas familier avec les signaux et je ne veux pas gérer les conditions de course inutiles. Je veux dire, si alsa peut mettre les descripteurs de fichiers à "prêt", je devrais également être en mesure de;)

+0

Quel est le problème avec l'ajout d'un délai d'expiration? –

+0

Je ne souhaite pas interroger en mode utilisateur. – Alex

+0

Pouvez-vous définir plus précisément ce que vous entendez par interrogation "mode utilisateur"? Soit vous écrivez le code du noyau, et ensuite vous ne faites pas d'appel système, ou vous écrivez le code utilisateur, et je ne peux pas voir ce qui ne va pas avec le sondage? Peut-être que vous voulez dire "code de l'application en utilisant votre bibliothèque" ne pas utiliser l'interrogation, mais doit être capable d'interrompre l'appel? – shodanex

Répondre

3

Si vous faites un tuyau à l'aide de la fonction pipe(), vous pouvez ajouter à la fin de la sortie dans votre liste poll(). Ensuite, vous pouvez écrire quelque chose dans l'extrémité d'entrée du tuyau et votre sondage reviendra. Tout comme votre version de Windows.

Vous auriez besoin d'utiliser quelque chose de asynchrone comme des threads ou des gestionnaires de signaux pour que cela fonctionne.

Une autre option serait d'utiliser sigaction() pour définir un gestionnaire de signal sans le drapeau SA_RESTART. Vous pouvez utiliser un signal inutilisé comme SIGUSR1 ou l'un des signaux en temps réel. Lorsque vous voulez interrompre le poll(), vous envoyez ce signal et poll() renverra -1 et errno sera défini sur EINTR.

Un signal différent pourrait aussi interrompre votre poll(), sauf si vous avez utilisé sigmask() pour bloquer les signaux indésirables.

+0

J'aime votre solution avec le descripteur supplémentaire comme moyen de quitter le sondage, mais qu'en est-il de l'appel système "ppoll"? La citation "ppoll() permet à une application d'attendre en toute sécurité jusqu'à ce qu'un descripteur de fichier soit prêt ou qu'un signal soit intercepté." En utilisant ppoll je devrais être capable d'envoyer une sorte de signal quand je veux annuler le sondage, je ne sais pas beaucoup de choses sur les signaux car je ne les ai jamais vraiment utilisés. – Alex

+0

Hey je pense que je comprends - la ppoll a un masque, bloquant les signaux autres que celui que j'utilise pour annuler le sondage?Si je spécifie 0 comme masque, le sondage ne sera pas interrompu par des signaux et si je fais un masque pour le signal que j'utilise, il n'abandonnera que sur mon signal? Je pense que je dois regarder dans les signaux alors :) – Alex

+1

Je l'ai fait pour annuler le sondage: // Interroger sondage dans le fil de streaming signal (SIGUSR1, ignore_handler); pthread_kill (thread-> native_handle(), SIGUSR1); où ignore_handle est un vide vide prenant un int. – Alex

0

Utilisez le délai d'expiration et vérifiez la condition de sortie.

while (not exit_condition): 
    int poll(struct pollfd *fds, nfds_t nfds, int timeout); 
+0

Ce sera l'interrogation en mode utilisateur. – Alex