|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 25600 (0x6400) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Scheduler, seg_0573ba
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦this⟧
with Byte_Defs, Tableur, Transport, Transport_Defs, Bounded_String, Trame, Utils; with Affichage; use Affichage, Tableur, Bounded_String, Trame, Transport_Defs; package body Scheduler is type Identite is new Object; Buffer_Reception : Tableur.Tache_Tableur; Id_Rec, Id_Emet : Identite; Index_Courant : Positive; Done : Boolean := False; --************************************************************************************* task Reception is entry Go_Reception; end Reception; task Emission is entry Envoi (Message : Byte_Defs.Byte_String); entry Dispose; end Emission; task Majordome is entry Extract (Num_Requete : in Positive; Num_Param : in Positive; Reponse : out String); entry Request (Message : in String; Num_Requete : out Positive); entry Answer (Message : Byte_Defs.Byte_String); entry Registration (Message : in String); entry Unregistration (Message : in String); end Majordome; procedure Init_Socket_Recepteur (S : Transport_Defs.Socket_Id); procedure Definir_Socket_Recepteur; --************************************************************************************* procedure Init_Socket_Recepteur (S : Transport_Defs.Socket_Id) is begin Id_Rec.Socket := S; end Init_Socket_Recepteur; --************************************************************************************* procedure Init_Socket_Emetteur (S : Transport_Defs.Socket_Id) is begin Id_Emet.Socket := S; end Init_Socket_Emetteur; --************************************************************************************* procedure Definir_Socket_Recepteur is begin while not (Transport.Is_Open (Id_Rec.Connection)) loop Transport.Open (Id_Rec.Connection, Id_Rec.Status, Id_Rec.Network, Id_Rec.Socket); end loop; Id_Rec.Socket := Transport.Local_Socket (Id_Rec.Connection); end Definir_Socket_Recepteur; --************************************************************************************* procedure Definir_Communication_Pour_Objet is begin Init_Socket_Emetteur ((10, 46)); Definir_Socket_Recepteur; end Definir_Communication_Pour_Objet; --************************************************************************************* procedure Definir_Communication_Pour_Orb is begin Init_Socket_Recepteur ((10, 46)); end Definir_Communication_Pour_Orb; --************************************************************************************* procedure Envoi_Demande (Message : in String; Num_Requete : out Positive) is begin Majordome.Request (Message, Num_Requete); end Envoi_Demande; --************************************************************************** function Extrait_Parametre (Num_Param : in Positive) return String is --Renvoie le contenu du sous-champ No. Num_Param, a partir d'un Index connu(Index_Courant) --...contenu dans le champ "Commande" Commande : Bounded_String.Variable_String (1024); Debut : Positive := 1; Long : Positive; Compteur : Positive := 1; begin --Lecture du champ "commande"... Buffer_Reception.Donne_String (Index_Courant, 6, Commande); --Trouve la position du Num_Param'ieme "$" (debut) while Compteur /= Num_Param + 1 loop while Bounded_String.Char_At (Commande, Debut) /= '$' loop Debut := Debut + 1; end loop; Compteur := Compteur + 1; Debut := Debut + 1; end loop; --Efface le debut Bounded_String.Delete (Commande, 1, Debut - 1); Compteur := 1; Long := Bounded_String.Length (Commande); --Trouve la position du prochain "$" (fin) while Bounded_String.Char_At (Commande, Compteur) /= '$' loop Compteur := Compteur + 1; end loop; --Efface la fin, et retourne la portion demandee (No. Num_Param) Bounded_String.Delete (Commande, Compteur, Long - Compteur + 1); return Bounded_String.Image (Commande); end Extrait_Parametre; --************************************************************************************* function Extrait_Reponse (Num_Requete : in Positive; Num_Param : in Positive) return String is --Renvoie le contenu du sous-champ No. Num_Param, a partir du numero de requete --...contenu dans le champ "Commande" Commande : Bounded_String.Variable_String (1024); Contenu : Bounded_String.Variable_String (1024); Index_Courant : Positive; Debut : Positive := 1; Long : Positive; Compteur : Positive := 1; Compt : Positive; Error : Boolean := False; begin --Recherche l'Index contenant le numero de requete Buffer_Reception.Trouve_Index (Num_Requete, Index_Courant, Error); if Error then Bounded_String.Copy (Commande, "Erreur"); else --Le numero de requete etant trouve, --Lecture du champ "commande" Buffer_Reception.Donne_String (Index_Courant, 6, Commande); --Trouve la position du Num_Param'ieme "$" (debut) while Compteur /= Num_Param + 1 loop while Bounded_String.Char_At (Commande, Debut) /= '$' loop Debut := Debut + 1; end loop; Compteur := Compteur + 1; Debut := Debut + 1; end loop; --Efface le debut Bounded_String.Delete (Commande, 1, Debut - 1); Compteur := 1; Long := Bounded_String.Length (Commande); --Trouve la position du prochain "$" (fin) while Bounded_String.Char_At (Commande, Compteur) /= '$' loop Compteur := Compteur + 1; end loop; --Efface la fin, et retourne la portion demandee (No. Num_Param) Bounded_String.Delete (Commande, Compteur, Long - Compteur + 1); end if; return Bounded_String.Image (Commande); end Extrait_Reponse; --************************************************************************************* procedure Efface_Par_Requete (Num_Requete : in Positive) is Erreur : Boolean := False; Index : Positive; begin Buffer_Reception.Trouve_Index (Num_Requete, Index, Erreur); if not (Erreur) then Buffer_Reception.Efface (Index, Erreur); end if; end Efface_Par_Requete; --************************************************************************************* procedure Efface_Par_Index (Index : in Positive) is Erreur : Boolean; begin Buffer_Reception.Efface (Index, Erreur); end Efface_Par_Index; --************************************************************************************* procedure Init_Tab_Reception is begin Buffer_Reception.Init; end Init_Tab_Reception; --************************************************************************************* procedure Enregistre_Service (Message : in String) is begin Majordome.Registration (Message); end Enregistre_Service; --************************************************************************************* procedure Supprime_Service (Message : in String) is begin Majordome.Unregistration (Message); end Supprime_Service; --************************************************************************************* procedure Place_Reponse (Index : in Positive; Message : in String) is Nom_Contrat : Bounded_String.Variable_String (1024); begin Buffer_Reception.Donne_Contrat (Index, Nom_Contrat); Bounded_String.Append (Nom_Contrat, '(' & Message & ')'); Buffer_Reception.Insere_Integer (Index, 1, 2); --Le 2 indique que la reponse est arrivee (type_msg) Buffer_Reception.Insere_String (Index, 6, Nom_Contrat); --Place le message dans le champ Commande end Place_Reponse; --************************************************************************************* procedure Donne_Taille_Buffer_Reception (Taille : out Positive) is begin Buffer_Reception.Taille_Max (Taille); end Donne_Taille_Buffer_Reception; --************************************************************************************* procedure Donne_Champ_Type_Integer (Index : in Positive; Rang : in Positive; Resultat : in out Integer) is begin Buffer_Reception.Donne_Integer (Index, Rang, Resultat); end Donne_Champ_Type_Integer; --************************************************************************************* procedure Accepte_Reception is begin Reception.Go_Reception; end Accepte_Reception; --************************************************************************************* procedure Fabrique_Trame (Index : in Positive; Trame : out Byte_Defs.Byte_String) is begin Buffer_Reception.Fait_Trame (Index, Trame); end Fabrique_Trame; --************************************************************************************* procedure Envoi_Trame (Trame : Byte_Defs.Byte_String) is begin Emission.Envoi (Trame); end Envoi_Trame; --************************************************************************************* procedure Trouve_Reponse (Codage : in Positive; Rang : in Positive; Reponse : out String; Erreur : in out Boolean) is Index : Positive; Rep : Bounded_String.Variable_String (1024); begin Buffer_Reception.Trouve_Index (Codage, Index, Erreur); Buffer_Reception.Donne (Codage, Rang, Rep, Erreur); Reponse := Bounded_String.Image (Rep); end Trouve_Reponse; --************************************************************************************* task body Reception is Total, Count : Natural; Data : Byte_Defs.Byte_String (1 .. 1024); Etat : Boolean; Erreur : Boolean; begin Id_Rec.Max_Wait := 3.0; Done := False; select accept Go_Reception; Pl ("Reception: Debut"); loop -- Arrete la reception si plein Buffer_Reception.Teste_Plein (Etat); if not (Etat) then while not (Transport.Is_Open (Id_Rec.Connection)) and Id_Rec.Status /= Transport_Defs.Ok loop Transport.Open (Id_Rec.Connection, Id_Rec.Status, Id_Rec.Network, Id_Rec.Socket); end loop; if Transport.Is_Connected (Id_Rec.Connection) then Pl ("Reception: Connection etablie"); Count := 0; while Count = 0 loop Transport.Receive (Id_Rec.Connection, Id_Rec.Status, Data, Count, Id_Rec.Max_Wait); end loop; Erreur := False; P ("Message Recu: "); Pl (Bounded_String.Image (Extrait (Data, 5))); --Pl (Utils.Byte_String_To_String (Data)); Buffer_Reception.Ajoute (Data, Erreur); Transport.Disconnect (Id_Rec.Connection); else Transport.Connect (Id_Rec.Connection, Id_Rec.Status, Id_Rec.Max_Wait); --P ("."); delay 0.5; end if; end if; exit when Done; end loop; Transport.Close (Id_Rec.Connection); end select; end Reception; --************************************************************************************* task body Emission is Done : Boolean := False; Compteur_Essais : Positive; Max_Essais : constant Positive := 10; Attente : constant Duration := 6.0; --Duree max. d'attente pour connection = Max_Essais*Attente (=60s) begin loop Compteur_Essais := 1; select accept Envoi (Message : Byte_Defs.Byte_String) do Pl ("Emission: Debut"); while not (Transport.Is_Open (Id_Emet.Connection)) and Id_Emet.Status /= Transport_Defs.Ok loop Transport.Open (Id_Emet.Connection, Id_Emet.Status, Id_Emet.Network); end loop; while (not (Transport.Is_Connected (Id_Emet.Connection))) and (Compteur_Essais <= Max_Essais) loop Transport.Connect (Id_Emet.Connection, Id_Emet.Status, Id_Emet.Host, Id_Emet.Socket, Id_Emet.Max_Wait); delay (Attente); Compteur_Essais := Compteur_Essais + 1; end loop; if Transport.Is_Connected (Id_Emet.Connection) then Pl ("Emission: Connection etablie"); Transport.Transmit (Id_Emet.Connection, Id_Emet.Status, Message, Id_Emet.Count, Id_Emet.Max_Wait, Id_Emet.More_Data); P ("Message Emis: "); Pl (Bounded_String.Image (Extrait (Message, 5))); --P (Bounded_String.Image (Trame.Extrait (Message, 1))); --P (Bounded_String.Image (Trame.Extrait (Message, 2))); --P (Bounded_String.Image (Trame.Extrait (Message, 3))); --P (Bounded_String.Image (Trame.Extrait (Message, 4))); --P (Bounded_String.Image (Trame.Extrait (Message, 5))); end if; Transport.Disconnect (Id_Emet.Connection); end Envoi; or accept Dispose do Transport.Close (Id_Emet.Connection); Done := True; end Dispose; end select; exit when Done; end loop; end Emission; --************************************************************************************* task body Majordome is Texte : Variable_String (1024); Code : Positive := 1000; Type_Message : Positive; Erreur : Boolean; Index : Positive; begin loop select accept Request (Message : in String; Num_Requete : out Positive) do if Code < 999 then Code := Code + 1; else Code := 1; end if; Num_Requete := Code; Type_Message := 1; Emission.Envoi (Trame.Fait_Trame (Type_Message, Fait_Host (Id_Rec.Host), Fait_Socket (Id_Rec.Socket), Code, Value (Message))); end Request; or accept Extract (Num_Requete : in Positive; Num_Param : in Positive; Reponse : out String) do Buffer_Reception.Donne (Num_Requete, Num_Param, Texte, Erreur); Reponse := Image (Texte); end Extract; or accept Answer (Message : Byte_Defs.Byte_String) do Emission.Envoi (Message); end Answer; or accept Registration (Message : in String) do Type_Message := 3; Emission.Envoi (Trame.Fait_Trame (Type_Message, Fait_Host (Id_Rec.Host), Fait_Socket (Id_Rec.Socket), 1001, Value (Message))); end Registration; or accept Unregistration (Message : in String) do Type_Message := 4; Emission.Envoi (Trame.Fait_Trame (Type_Message, Fait_Host (Id_Rec.Host), Fait_Socket (Id_Rec.Socket), 1002, Value (Message))); end Unregistration; end select; exit when Done; end loop; end Majordome; end Scheduler;
nblk1=18 nid=e hdr6=2c [0x00] rec0=1e rec1=00 rec2=01 rec3=022 [0x01] rec0=00 rec1=00 rec2=02 rec3=03a [0x02] rec0=17 rec1=00 rec2=06 rec3=06a [0x03] rec0=19 rec1=00 rec2=12 rec3=096 [0x04] rec0=1a rec1=00 rec2=11 rec3=056 [0x05] rec0=18 rec1=00 rec2=0d rec3=02c [0x06] rec0=1a rec1=00 rec2=10 rec3=034 [0x07] rec0=1b rec1=00 rec2=09 rec3=060 [0x08] rec0=08 rec1=00 rec2=08 rec3=00e [0x09] rec0=17 rec1=00 rec2=15 rec3=060 [0x0a] rec0=15 rec1=00 rec2=0a rec3=034 [0x0b] rec0=18 rec1=00 rec2=13 rec3=04a [0x0c] rec0=19 rec1=00 rec2=03 rec3=056 [0x0d] rec0=11 rec1=00 rec2=0f rec3=076 [0x0e] rec0=01 rec1=00 rec2=0c rec3=088 [0x0f] rec0=1a rec1=00 rec2=04 rec3=006 [0x10] rec0=11 rec1=00 rec2=07 rec3=034 [0x11] rec0=12 rec1=00 rec2=17 rec3=036 [0x12] rec0=1a rec1=00 rec2=16 rec3=05a [0x13] rec0=03 rec1=00 rec2=05 rec3=050 [0x14] rec0=15 rec1=00 rec2=0b rec3=016 [0x15] rec0=0e rec1=00 rec2=14 rec3=000 [0x16] rec0=10 rec1=00 rec2=07 rec3=000 [0x17] rec0=00 rec1=00 rec2=00 rec3=000 tail 0x21764260a87c7488553b6 0x42a00088462060003 Free Block Chain: 0xe: 0000 00 18 03 fc 80 32 20 20 20 20 20 20 20 20 20 20 ┆ 2 ┆ 0x18: 0000 00 00 00 0b 80 08 20 20 20 20 20 20 20 20 08 09 ┆ ┆