Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3095 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Question pour un champion [1]

n°664577
docmaboul
Posté le 05-03-2004 à 17:16:51  profilanswer
 

Reprise du message précédent :

bjone a écrit :

ceci dit, donc l'astuce ce serait quoi ?


 
Malheureusement, il n'y a pas d'astuce (ça se saurait).
 
Faut juste être complètement fou.

mood
Publicité
Posté le 05-03-2004 à 17:16:51  profilanswer
 

n°664580
bjone
Insert booze to continue
Posté le 05-03-2004 à 17:17:01  profilanswer
 

enfin de toutes manières c'est casse-gueule de passer des instances de classes à méthodes virtuelles par une mémoire partagée...

n°664582
bjone
Insert booze to continue
Posté le 05-03-2004 à 17:18:35  profilanswer
 

DocMaboul a écrit :


 
Malheureusement, il n'y a pas d'astuce (ça se saurait).
 
Faut juste être complètement fou.


 
donc fodrait se démerder pour se faire une table de translation pour résoudre le vfptr du process créateur au vfptr du process courant.

n°664586
bjone
Insert booze to continue
Posté le 05-03-2004 à 17:22:53  profilanswer
 

genre au niveau process créateur, tu énuméres les classes possibles dans la mémoire partagée, tu as une table de couples nom classe/vfptr..
 
le process courant fait la même chose, et se construit une table de translation vfptr créateur->vfptr courant.
 
pour les appels de méthodes virtuelles, t'attrapes le vfptr de l'instance dans la mémoire partagée, tu retrouves le vfptr pour le process courant, tu te démerdes pour faire l'appel (gni)...
 
et pi tu te tires un balle et tu notes pour plus tard, qu'être un programmeur fou (et un petit peu matuvu) c'est mal.


Message édité par bjone le 05-03-2004 à 17:23:31
n°664587
docmaboul
Posté le 05-03-2004 à 17:22:58  profilanswer
 

bjone a écrit :

enfin de toutes manières c'est casse-gueule de passer des instances de classes à méthodes virtuelles par une mémoire partagée...


 
Casse gueule, c'est le mot.
 
Deux programmeurs sont en haut d'une immeuble. Ils se lancent un pari : descendre le plus vite possible. Le premier, sain de corps et d'esprit se dirige rapidement vers les ascenseurs. Le deuxième ouvre la fenêtre et se jette. Il a intérêt à apprendre rapidement à voler...


Message édité par docmaboul le 05-03-2004 à 18:37:27
n°664594
docmaboul
Posté le 05-03-2004 à 17:28:13  profilanswer
 

bjone a écrit :


pour les appels de méthodes virtuelles, t'attrapes le vfptr de l'instance dans la mémoire partagée, tu retrouves le vfptr pour le process courant, tu te démerdes pour faire l'appel (gni)...


 
Il y a comme un hic au niveau du (gni). Et d'autant plus que si tu avais dans l'idée de patcher ton objet, tu vas te poser des restrictions de locking pour le moins sévères.

n°664610
bjone
Insert booze to continue
Posté le 05-03-2004 à 17:39:09  profilanswer
 

patcher non, faire juste ça en local... dans la fonction appelante du process non créateur...


Message édité par bjone le 05-03-2004 à 17:39:25
n°664621
HelloWorld
Salut tout le monde!
Posté le 05-03-2004 à 17:52:23  profilanswer
 

J'ai pas compris, c'est faisable ou c'est pas faisable ?
De toute façon, 2 process n'ont pas à se passer et bosser sur de mêmes instances de classes.
Dans le cas de ton toto, faudrait changer le private int toto en private volatile int toto...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°664628
HelloWorld
Salut tout le monde!
Posté le 05-03-2004 à 17:55:37  profilanswer
 

Et puis faut gérer l'exclusion mutuelle...
Bref, en plus d'être une horeur en génie log, ça peut pas marcher, avec ou sans vtable.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°664630
bjone
Insert booze to continue
Posté le 05-03-2004 à 17:56:49  profilanswer
 

bah...... en se faisant chier chier et en priant très fort pour avoir de cas particuliers tordus, ça peut passer...
 
par contre pourquoi le volatile pour la méthode toto() ?

mood
Publicité
Posté le 05-03-2004 à 17:56:49  profilanswer
 

n°664676
docmaboul
Posté le 05-03-2004 à 18:15:18  profilanswer
 

bjone a écrit :

patcher non, faire juste ça en local... dans la fonction appelante du process non créateur...


 
Je ne vois pas bien ce que vous voulez dire et faire.

n°664682
docmaboul
Posté le 05-03-2004 à 18:16:38  profilanswer
 

HelloWorld a écrit :

J'ai pas compris, c'est faisable ou c'est pas faisable ?
De toute façon, 2 process n'ont pas à se passer et bosser sur de mêmes instances de classes.
Dans le cas de ton toto, faudrait changer le private int toto en private volatile int toto...


 
C'est faisable mais c'est vraiment pas simple, loin de là. Je ne suis même pas sûr qu'on trouve une solution quelque part dans google.
 
Pour le reste, 2 process peuvent très bien avoir à utiliser une instance commune d'une même classe (on peut toujours se débrouiller autrement mais là n'est pas la question). Si vous désirez des explications sur des implémentations à la mords-moi-le-com, je dois pouvoir vous trouver un lien.

n°664703
HelloWorld
Salut tout le monde!
Posté le 05-03-2004 à 18:31:07  profilanswer
 

Citation :

Pour le reste, 2 process peuvent très bien avoir à utiliser une instance commune d'une même classe


J'ai du mal à en saisir l'intérêt.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°664714
docmaboul
Posté le 05-03-2004 à 18:44:06  profilanswer
 

HelloWorld a écrit :

Citation :

Pour le reste, 2 process peuvent très bien avoir à utiliser une instance commune d'une même classe


J'ai du mal à en saisir l'intérêt.


 
Un intérêt est, par exemple, de masquer la communication des process pour se transmettre les données et d'avoir à reconstruire d'un coté ce qui existait déjà de l'autre.

n°664759
bjone
Insert booze to continue
Posté le 05-03-2004 à 19:26:04  profilanswer
 

DocMaboul a écrit :


 
Je ne vois pas bien ce que vous voulez dire et faire.


 
je dirais un truc dans ce goût là:
 

Code :
  1. class blabla
  2.   {
  3.     public:
  4.       // ...  
  5.       virtual void toto(int);
  6.       // ...  
  7.   };
  8.  
  9. /////////////////////////
  10.   // pObjetBlabla est en shared  
  11.   void func(blabla * pObjetBlabla)
  12.   {
  13.       void *vfptr=GetVftr(pObjectBlabla);
  14.       void *localfptr=TranslateVfptr(vfptr);
  15.       void *MethodePtr=GetMethod(localfptr,pObjectBlabla, ?? ); // ?? : un truc qui identifie blabla::toto
  16.       // ...  
  17.       //pObjetBlabla->Toto(0);  
  18.       // ...
  19.       asm {
  20.           mov eax, pObjetBlabla  // on va dire que la méthode s'attends à avoir l'adresse de l'instance en eax
  21.           push 0 // passage du paramètre 0
  22.           call [MethodePtr] // appel de la méthode virtuelle
  23.       };
  24.   }


 
un truc on ne peut plus dégueulasse, bancal et non portable qui soit.... (c'est un ordre d'idée m'en fous si c'est pas censé compiler bien évidemment, si les void* c'est mal, si le push 0 est pas popé)

n°664762
bjone
Insert booze to continue
Posté le 05-03-2004 à 19:28:27  profilanswer
 

en gros c'est un topic à mauvaises pratiques et autres choses suicidaires de la vie :D

n°665070
docmaboul
Posté le 06-03-2004 à 08:03:05  profilanswer
 

bjone a écrit :


un truc on ne peut plus dégueulasse, bancal et non portable qui soit.... (c'est un ordre d'idée m'en fous si c'est pas censé compiler bien évidemment, si les void* c'est mal, si le push 0 est pas popé)


 
Pour le principe d'avoir à coder, quelque part, l'appel à la fonction, tu es sûr la bonne piste. Il y a de l'idée mais tel quel, je pense que cela être plus que difficile d'implémenter la fonction TranslateVfptr parce qu'elle ne pourra pas facilement savoir qu'elle travaille sur la classe blabla au moment du runtime. En outre, le challenge était de pouvoir faire directement : pObjetBlabla->UneMethode(). Disons que le programmeur fou trouve la méthode pour le faire et une fois qu'il l'a réalisée, un programmeur pas fou peut l'utiliser sans même savoir comment elle fonctionne.
 
Astuce 5: le problème ne se résout pas dans le code du process appelant les méthodes
Astuce 6: le problème ne se résout pas non plus dans le code du process créant l'objet

n°665072
docmaboul
Posté le 06-03-2004 à 08:06:47  profilanswer
 

bjone a écrit :

en gros c'est un topic à mauvaises pratiques et autres choses suicidaires de la vie :D


 
Pas tout à fait. C'est un topic pour montrer qu'on peut toujours faire ce que d'autres proclament comme impossible, du moment qu'on ouvre un peu son esprit et qu'on essaye de penser autrement.

n°665172
blackgodde​ss
vive le troll !
Posté le 06-03-2004 à 12:20:53  profilanswer
 

pour en revenir au loader de librairie, si le loader charge toute la lib en mémoire partagée, et qu'il force les allocations en mémoire partagée, la vtable ne pourrait-elle pas etre lisible et utilisable par les 2 processus ?
 
-edit-
si c'est la lib qui s'occupe de l'allocation de ses objets


Message édité par blackgoddess le 06-03-2004 à 12:21:30

---------------
-( BlackGoddess )-
n°665180
docmaboul
Posté le 06-03-2004 à 12:47:49  profilanswer
 

Oui, sauf qu'il y a deux autres points posant problème:
- il va falloir résoudre toutes les dépendances de la lib et faire en sorte qu'elles aillent aussi en mémoire partagée (ça reste faisable)
- la plupart des implémentations d'unix n'acceptent pas qu'on exécute du code en mémoire partagée (petit souci...)


Message édité par docmaboul le 06-03-2004 à 12:49:35
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
2 petites question de rien du tout = pb email et HTML ... merci......Question sur select()
petite question avec GTKbonjour, est il possible de vous poser une question a propos de CSS ??
[JAVA] Question à propos des FlowLayout()[C] Question sur strtol (conversion de char* en int)
[Visual C++] Question (basique) sur les CPenQuestion Parsage avec SAX ...
[lisp] petite question sur implodechQuestion pour un champion...
Plus de sujets relatifs à : Question pour un champion [1]


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)