authoriser / interdire l'acces aux methodes d'une classe
J'ai un driver de peripherique stocké dans une classe : Driver
J'ai une classe gestionnaire de periph appelée par les
differentes threads : DM
Un thread demande l'acces au driver et recoit une clef
qui l'identifie comme propriétaire
en cours de route la clef peut etre invalidée pcq un process
prioritaire a pris la main sur le driver
j'ai donc une fonction
Driver * DM(int key);
si la clef est valide le device manager renvoie le pointeur sur le driver
sinon il lance une exception
--- il me semble que ce systeme est correct en tout cas si vous avez meilleure idée !! je suis preneur ---
Mon probleme est le suivant, en cas d'export du code
et d'utilisation par une tierce personne pressée
il suffit d'ecrire :
Code:
1 2 3 4
| int key = DM::GetKey();
Driver * t = DM::Driver(key)
t->Truc()
t->Bidule() |
au lieu de
Code:
1 2 3
| int key = DM::GetKey();
DM::Driver(key)->Truc()
DM::Driver(key)->Bidule() |
ou la si la fonction a perdu la main entre truc et bidule
DM peut lancer une exception
alors qu'en sauvegardant l'acces dans une variable
ce n'est pas verifié et le peripherique va peter
l'ideal serait que seul le device manager puisse activer la fonction
de maniere indirecte (il suffirait qu'il soit friend de Driver) mais je ne vois pas comment faire :cry:
[Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]
Re: authoriser / interdire l'acces aux methodes d'une classe
Bigre les gens, j'ai l'impression que vous tentez de mettre un cataplasme sur une jambe de bois... C'est une bête question de design, et le singleton n'est pas la réponse, je pense !!
Citation:
Envoyé par buzzz
J'ai un driver de peripherique stocké dans une classe : Driver
Bon, et ce driver est unique, c'est une ressource
Citation:
Envoyé par buzzz
[...]
j'ai donc une fonction
Driver * DM(int key);
si la clef est valide le device manager renvoie le pointeur sur le driver
sinon il lance une exception
--- il me semble que ce systeme est correct en tout cas si vous avez meilleure idée !! je suis preneur ---
Moi ça me semble tout bon, si tu est sûr qu'on ne peut pas préempter pendant l'excution de Truc() ou Machin()...
Citation:
Envoyé par buzzz
il suffit d'ecrire :
Code:
1 2 3 4
| int key = DM::GetKey();
Driver * t = DM::Driver(key)
t->Truc()
t->Bidule() |
alors qu'en sauvegardant l'acces dans une variable
ce n'est pas verifié et le peripherique va peter
Et bien il suffit que celà soit impossible.
Code:
1 2 3 4 5 6 7
|
class DM {
...
static void Truc(int key);
static void Bidule(int key);
...
}; |
Les fonction s'occupe de vérifier la validité de la clé, et exécute la fonction voulue si OK.
Citation:
Envoyé par buzzz
l'ideal serait que seul le device manager puisse activer la fonction
de maniere indirecte (il suffirait qu'il soit friend de Driver) mais je ne vois pas comment faire
Oui, si c'est une classe de confience, un protected friend qui à accès à la méthode qui retourne un Driver*
Fais gaffe aux interblocages !