Je lisais le code d'un noyau, et à un endroit, j'ai vu une expression à l'intérieur de if
comme
if (value == (SPINLOCK_SHARED | 1) - 1) {
............
}
où SPINLOCK_SHARED = 0x80000000
est une constante prédéfinie.
Je me demande pourquoi nous avons besoin (SPINLOCK_SHARED | 1) - 1
- Le résultat de l'expression serait 80000000 - la même chose que 0x80000000, n'est-ce pas ? Mais pourquoi ORing 1 et Subtracting 1 ont-ils de l'importance ?
J'ai l'impression qu'il me manque quelque chose
0 votes
Il y a quelque chose qui n'est pas clair pour moi : est-ce que
SPINLOCK_SHARED
une variable ou une constante définie par #define ?3 votes
define SPINLOCK_SHARED 0x80000000
1 votes
Je pense qu'il n'y a pas de raison. Il s'agit peut-être d'un problème de copier-coller. Pourriez-vous ajouter où vous avez trouvé cela exactement (quelle version de quel noyau, quel fichier, etc.).
2 votes
Toma, github.com/DragonFlyBSD/DragonFlyBSD/blob/master/sys/kern/
0 votes
Où se trouve
SPINLOCK_SHARED
défini ? Se trouve-t-il dans un code conditionnel, de sorte qu'il puisse être défini par un code différent si des options de compilation différentes sont utilisées ?0 votes
github.com/DragonFlyBSD/DragonFlyBSD/blob/master/sys/sys/
0 votes
En s'engager ne l'explique pas du tout.
2 votes
Le même fichier de code source contient également
if (atomic_cmpset_int(&spin->counta, SPINLOCK_SHARED|0, 1))
.0 votes
J'ai copié le git et j'ai cherché
grep '|[[:space:]]*1[[:space:]]*)[[:space:]]*-[[:space:]]*1' -r .
(et similaires). Il s'agit d'une seule instance de|1)-1
dans le code.2 votes
Dans ce cas, je pense qu'il faut demander à l'auteur pourquoi il a été modifié.
1 votes
Le code source contient plusieurs instances de
SPINLOCK_SHARED|0
ySPINLOCK_SHARED|1
ce qui suggère que l'auteur pense au "compteur" du spinlock comme un bit indiquant partagé/exclusif et d'autres bits contenant un décompte (dans lequel 0 et 1 sont des décomptes notables à des fins diverses).1 votes
Sur les autres plates-formes, le bit 0 est défini pour les constantes. La seule hypothèse pour ne pas utiliser SPINLOCK_SHARED & -2 pourrait être la comparaison signé/non signé sur certains processeurs, spinlock | 1 est vérifié à certains endroits.
0 votes
IIRC Le dépassement de capacité des entiers n'est pas défini en C donc assigner un 0x80000000 à un int me semble être un problème.