My Project
Chargement...
Recherche...
Aucune correspondance
atomique.h
Aller à la documentation de ce fichier.
1
10#ifndef ATOMIQUE_DEF
11#define ATOMIQUE_DEF
12
13#include <manux/types.h>
14#include <manux/scheduler.h> /* tacheEnCours */
15
16/*
17 * Type des données manipulées de façon atomique
18 */
20
21#define atomiqueInit(atom, val)\
22 *(atom) = (val);
23
24#define atomiqueLire(atom) \
25 (atom)
26
27static __inline__ uint32_t compareEtEchange(uint32_t * ptr, uint32_t cond, uint32_t val)
28{
33 uint32_t resultat;
34 __asm__ volatile("cmpxchg %2, %1 \n\t"
35 : "=a"(resultat), "+m"(*ptr)
36 : "r"(val), "0"(cond)
37 : "memory");
38 return resultat;
39}
40
41#define _compareEtEchange(ptr, cond, val) \
42 { \
43 uint32_t _cmpxchg_resultat; \
44 __asm__ volatile("cmpxchg %2, %1 \n\t" \
45 : "=a"(_cmpxchg_resultat), "+m"(ptr) \
46 : "r"(val), "0"(cond) \
47 : "memory"); \
48 _cmpxchg_resultat; \
49}
50
51static __inline__ booleen atomiqueTestInit(Atomique * atom, uint32_t val, uint32_t cond)
52/*
53 * La valeur de l'Atomique est comparée à la valeur cond ; en cas d'égalité,
54 * l'Atomique prend la valeur val et le retour est 1. Sinon rien n'est fait
55 * et le retour est 0.
56 */
57{
58 uint8_t resultat;
59
60 __asm__ ("cmpxchg %3, %2 \n\t"
61 "sete %0 \n\t"
62 : "=m"(resultat)
63 : "a"(cond), "m"(*(volatile Atomique *)atom), "r"(val));
64 return resultat;
65}
66
72#define tacheEnCoursInterdirePreemption() \
73 tacheEnCours->nonPreemptible++;
74
78#define tacheEnCoursAutoriserPreemption() \
79 tacheEnCours->nonPreemptible--;
80
81#endif
82
83
84
85
86/*
87 Désassemblage d'une compilation sans optimisation de cette version
88
89static __inline__ uint32_t compareEtEchange(uint32_t * ptr, uint32_t cond, uint32_t val)
90{
91 uint32_t resultat;
92 __asm__ volatile("cmpxchg %2, %1 \n\t"
93 : "=a"(resultat), "+m"(ptr)
94 : "r"(val), "0"(cond)
95 : "memory");
96 return resultat;
97}
98
99 État de la pile après la première instr :
100
10110(%esp) val
1020c(%esp) cond
10308(%esp) ptr
10404(%esp) @retour
10500(%esp) ebp
106
107 0x00020044 <+0>: push %ebp On sauve epb
108 0x00020045 <+1>: mov %esp,%ebp On l'utilise comme copie de esp
109 0x00020047 <+3>: sub $0x4,%esp esp qu'on aligne (ici à 2²)
110 0x0002004a <+6>: mov 0x10(%ebp),%edx edx <- val
111 0x0002004d <+9>: mov 0xc(%ebp),%eax eax <- cond
112 0x00020050 <+12>: cmpxchg %edx,0x8(%ebp) cmpxchg %edx, ptr
113 0x00020054 <+16>: mov %eax,-0x4(%ebp) result <- %eax
114 0x00020057 <+19>: mov -0x4(%ebp),%eax Pas d'optimisation
115 0x0002005a <+22>: mov %ebp,%esp On remet %esp en place
116 0x0002005c <+24>: pop %ebp On restaure %ebp
117 0x0002005d <+25>: ret
118
119 */
120
uint32_t Atomique
Definition atomique.h:19
unsigned long uint32_t
Definition types.h:20
int booleen
Definition types.h:32
unsigned char uint8_t
Definition types.h:12