Re: pragma Attach_Handler : Interrupt 15 is reserved

Thomas De Contes <[email protected]>
Newsgroups gmane.comp.lang.ada.france
Message-ID <[email protected]>
Le 10 déc. 2010 à 22:29, Jeffrey R. Carter a écrit :

> On 12/10/2010 12:28 PM, Thomas De Contes wrote:
>> 
>> avec ce code :
>> 
>> 	protected gestionnaireDeSignaux is
>> 		procedure extinction;
>> 		pragma Attach_Handler(extinction, Ada.Interrupts.Names.SIGTERM);
>> 	end gestionnaireDeSignaux;
>> 
>> je me mange un
>> raised PROGRAM_ERROR : Interrupt 15 is reserved
> 
> pragma Unreserve_All_Interrupts;

merci d'avoir répondu :-)


(dans le corps du paquetage)

	pragma Unreserve_All_Interrupts;
	protected gestionnaireDeSignaux is
		procedure extinction;
		pragma Attach_Handler(extinction, Ada.Interrupts.Names.SIGTERM);
	end gestionnaireDeSignaux;

ainsi que

	protected gestionnaireDeSignaux is
		pragma Unreserve_All_Interrupts;
		procedure extinction;
		pragma Attach_Handler(extinction, Ada.Interrupts.Names.SIGTERM);
	end gestionnaireDeSignaux;

n'ont aucun effet :
j'ai toujours l'erreur, et Ctrl-C marche toujours


en suivant http://gcc.gnu.org/onlinedocs/gnat_rm/Pragma-Unreserve_005fAll_005fInterrupts.html ,

je suis allé voir a-intnam.ads
et 2 choses m'ont étonné :
- dans ce fichier a-intnam.ads, il est indiqué que seul SIGINT est géré par pragma Unreserve_All_Interrupts
pourquoi SIGTERM n'en fait pas partie, alors qu'il est manifestement réservé par le "run-time Ada" ?
- pragma Unreserve_All_Interrupts est censé "débrancher" tous les signaux qui peuvent l'être, et ils deviennent alors tous sans effet, même quand ils en ont un par défaut, j'ai bien compris ?
si oui, on dirait que même SIGINT ne marche pas avec pragma Unreserve_All_Interrupts, puisque Ctrl-C marche toujours

puis j'ai regardé Interrupt_State
http://gcc.gnu.org/onlinedocs/gnat_rm/Pragma-Interrupt_005fState.html

et c'est juste ce qu'il me fallait, puisque, ne connaissant pas parfaitement bien les signaux, je ne souhaite pas tous les désactiver mais seulement ceux dont j'ai besoin (si le "run-time Ada" fait certaines choses, c'est peut être pour de bonnes raisons)

	pragma Interrupt_State( Ada.Interrupts.Names.SIGTERM ,User);
	protected gestionnaireDeSignaux is
		procedure extinction;
		pragma Attach_Handler( extinction, Ada.Interrupts.Names.SIGTERM );
	end gestionnaireDeSignaux;

et en plus, cette fois, (on dirait bien que) ça marche :-)
quand j'envoie un kill, ça ne quitte pas comme prévu, ça tombe dans une boucle infinie, mais je suppose que c'est un bug plus loin, et que cette partie là marche correctement :-)


reste un truc qui me derange un petit peu : la portabilité

à l'origine j'aimais pas trop utiliser les pragma, parce que ça sert un peu à tout et n'importe quoi, donc c'est pas vraiment synonyme de lisibilité, et surtout une bonne partie est définie par le compilateur

alors bon, à la limite, ceux qui sont definis par le langage, meme si j'aime pas trop la forme, considerons qu'on peut les utiliser à volonté parce qu'ils font partie du langage

reste pragma Interrupt_State, défini par gnat :
je ne sais plus ce qu'un compilateur est censé faire, quand il voit un pragma qu'il ne connait pas,
est ce que quelqu'un aurais quelque chose à me conseiller, pour rendre mon code plus portable ?


-- 
Téléassistance / Télémaintenance
http://www.portparallele.com/ThomasDECONTES/

_______________________________________________
Site WWW de l'association Ada-France: http://www.ada-france.org/
[email protected]
http://www.ada-france.org/mailman/listinfo/ada-france
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.