2010-10-15 5 views
0

J'ai une bonne affectation de programmation de noyau impliquant une nouvelle méthode de verrouillage de noyau, et mon groupe et moi avons choisi de l'implémenter comme un wrapper autour d'un achèvement. Cependant, la spécification exige que nous renvoyions le nombre de processus notifiés par notre méthode, ce qui impliquait de renvoyer le nombre de processus éveillés par complete_all dans notre implémentation.Existe-t-il un moyen sûr d'obtenir le nombre de tâches en attente d'achèvement?

Comment obtenons-nous ce numéro? Il semblerait qu'il suffise de verrouiller l'achèvement avec son spinlock interne, de compter le nombre d'éléments, puis de le déverrouiller. Cette méthode est préemptive, car nos fonctions sont les seules à avoir accès à l'achèvement en question. Alors, la question est: est-ce que l'achèvement de struct est opaque? Si c'est le cas, serait-il acceptable que, pour faire nos devoirs à temps pour la saison de mi-saison, ignorer cette opacité? Ou, y a-t-il un moyen de le faire sans hacks?

Répondre

1

Strictement parlant, il n'est pas opaque, à savoir. c'est défini dans un en-tête, mais vous le saviez.

Il est possible que l'auteur ait souhaité qu'il soit opaque mais qu'il l'ait échangé pour une définition publique afin de permettre à des inlines statiques de fonctionner dessus. C'est assez commun dans le code du noyau car vous êtes plus préoccupé par la taille du code que par une API stricte - c'est tout le code du noyau après tout.

Je vois:

struct completion { 
     unsigned int done; 
     wait_queue_head_t wait; 
}; 

Ainsi, la plupart des bits intéressants sont en fait dans wait_queue_head_t, qui est un typedef de struct __wait_queue_head. Les doubles caractères de soulignement peuvent indiquer que l'auteur pense que c'est privé, ou ils ont juste pensé qu'il serait déroutant d'avoir struct wait_queue_head et wait_queue_head_t, c'est-à-dire

les doubles caractères soulignent que vous êtes censé utiliser le typedef.

Je pense que si vous regardez dans le mauvais sens. Vous avez dit que vous devez connaître le nombre de processus éveillés par complete_all(). Ce code prend déjà le verrou et marche la liste des processus pour se réveiller, à savoir. afin de les réveiller, alors pourquoi ne pas le renvoyer le nombre de processus éveillés?

+0

Ne remplit-il pas tous les processus? Je ne suis pas du tout dans la liste des processus, j'appelle simplement complete_all et je le laisse faire. – Alex

+1

Oui complete_all() réveille tous les processus, et ce faisant, il doit savoir combien de "tous" sont, et il pourrait vous le renvoyer. Quelqu'un pourrait dire que c'est un hack, mais je pense que c'est une solution raisonnable, et c'est plus propre que de marcher à nouveau sur la liste juste pour avoir le compte. – mpe

2

Vous pouvez simplement modifier __wake_up_common afin qu'il renvoie le nombre de tâches qui ont été éveillées, puis modifiez complete_all pour renvoyer le même nombre.

Amusez-vous avec votre téléphone orienté vers le haut et vers le bas. Par ailleurs, une structure opaque aura typedef struct whatever whatever_t, comme atomic_t. Ce sont opaques.

Nico.

Questions connexes