[Perl] Programmation XS

Programmation XS [Perl] - Perl - Programmation

Marsh Posté le 11-08-2004 à 23:47:50    

Bin voila, recherchant un max de fonctionnalité, je me suis lancé dans la comprésension de la programmation XS pour pouvoir me créer des librairies Perl à partir de librairie en C
 
j'ai tenté un truc au boulot tantot à l'aide d'un tuto, qui m'a permis de réécrire la fonction time() à partir de sys/time.h
 
donc je vais tentez d'ajouter à ce topic ce que j'apprends, si vous avez des conseils, des questions, posez les ici et on tentera de se démerder à plusieurs :D

Reply

Marsh Posté le 11-08-2004 à 23:47:50   

Reply

Marsh Posté le 12-08-2004 à 01:43:32    

bon premier truc que j'ai fait à l'aide d'un exemple
 


h2xs /usr/include/time.h


 
Modifier le contenu du Time.xs
 

Code :
  1. #include <unistd.h>
  2. #include <sys/time.h>
  3. #include "EXTERN.h"
  4. #include "perl.h"
  5. #include "XSUB.h"
  6. MODULE = Sys::Time           PACKAGE = Sys::Time
  7. double
  8. time()
  9.     CODE:
  10.         struct timeval tv;
  11.         gettimeofday(&tv,0);
  12.         RETVAL = tv.tv_sec + ((double) tv.tv_usec) / 1000000;
  13.     OUTPUT:
  14.         RETVAL


 


perl Makefile.pl
make
make install


 
on test
 


perl -e 'use Sys::Time; print Sys::Time::time() . "\n"; print time() . "\n";'


 
Le résultat
 


1092267679.73259
1092267679


 
une fonction time hyper précise
 
maintenant je cherche à comprendre le time.xs :D

Reply

Marsh Posté le 12-08-2004 à 15:15:18    

pourkoi n'utilise tu pas Inline::C  ?
 
ca donnerais un truc du genre :

Code :
  1. print "CORE::time:  ", time(),"\n";
  2. print "gettimofday: ", my_time(),"\n";
  3. use Inline C => <<'END_C_CODE';
  4. #include <unistd.h>
  5. #include <sys/time.h>
  6. struct timeval tv;
  7. double my_time() {
  8. gettimeofday(&tv,0);
  9. return tv.tv_sec + ((double) tv.tv_usec) / 1000000;
  10. }
  11. END_C_CODE


 
ya juste à le lancer, ca compile (la premiere fois seulement, apres ca ne recompile que si il y a un changement) et on peu en mettre partout dans son code!

Reply

Marsh Posté le 12-08-2004 à 15:18:18    

pospos a écrit :

pourkoi n'utilise tu pas Inline::C  ?
 
ca donnerais un truc du genre :

Code :
  1. print "CORE::time:  ", time(),"\n";
  2. print "gettimofday: ", my_time(),"\n";
  3. use Inline C => <<'END_C_CODE';
  4. #include <unistd.h>
  5. #include <sys/time.h>
  6. struct timeval tv;
  7. double my_time() {
  8. gettimeofday(&tv,0);
  9. return tv.tv_sec + ((double) tv.tv_usec) / 1000000;
  10. }
  11. END_C_CODE


 
ya juste à le lancer, ca compile (la premiere fois seulement, apres ca ne recompile que si il y a un changement) et on peu en mettre partout dans son code!


 
je connaissais simplement aps, mais jvais y jetter un oeil

Reply

Marsh Posté le 12-08-2004 à 16:04:02    

bon ca répond plus ou moins au besoin
 
en gros je vais avoir besoin de me monter un set de librairie pour appeler les fonctions d'un serveur de fichier pas très répendu, et les script devront rouler sur tous les serveurs (meme sans compilateur)
 
donc je préfère me compiler une librairie et en faire des appels que de mettre le code C direct dans le perl
 
mais merci tout de meme pour l'idée

Reply

Marsh Posté le 12-08-2004 à 16:58:25    

tu peux recuperer le XS généré par inline, ya une option comme ca

Reply

Marsh Posté le 02-10-2004 à 16:48:58    

up
 
jsuis en train d'essayer de me faire un XS pour un module de process (procinfo.h)
 
le problème, c'est que j'ai X process, chaque process est un élément de struct procsinfo, et jsuis incapable de retourner le tableau complet des process
 
je sais pas trop comment traité ca, j'ai tenté des XPUSHs mais ca semble réservé à des types de bases (int, double, ...) et non à des struct :/

Reply

Marsh Posté le 04-10-2004 à 14:25:26    

ben il faut que tu decompose ta structure, en creant un hash par exemple, et en remplissant chaque entrée avec avec hv_store.
 
Sinon regarde du coté de Convert::Binary::C ( http://search.cpan.org/~mhx/Conver [...] inary/C.pm )
 
avec ce truc tu passe directement ta structure et tu la depack dans ton script (apres avoir scanné le .h pour analyser ta structure). Ce sera surement plus rapide à l'execution

Reply

Marsh Posté le 05-10-2004 à 05:22:54    

ouais j'ai compris qu'il fallait que je joue avec l'API de perl dans mon xs pour créer un hash

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed