/* ================================================================================ RPL/2 (R) version 4.0.19 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. RPL/2 is free software; you can redistribute it and/or modify it under the terms of the CeCILL V2 License as published by the french CEA, CNRS and INRIA. RPL/2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License for more details. You should have received a copy of the CeCILL License along with RPL/2. If not, write to info@cecill.info. ================================================================================ */ #include "rpl-conv.h" /* ================================================================================ Fonction 'while' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_while(struct_processus *s_etat_processus) { (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WHILE "); if ((*s_etat_processus).langue == 'F') { printf("(structure de contrôle)\n\n"); printf(" Utilisation :\n\n"); } else { printf("(control statement)\n\n"); printf(" Usage:\n\n"); } printf(" WHILE\n"); printf(" (clause)\n"); printf(" REPEAT\n"); printf(" (expression 1)\n"); printf(" EXIT\n"); printf(" (expression 2)\n"); printf(" END\n\n"); printf(" WHILE\n"); printf(" (clause)\n"); printf(" REPEAT\n"); printf(" (expression)\n"); printf(" END\n"); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } empilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { return; } (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'W'; (*(*s_etat_processus).l_base_pile_systeme).clause = 'W'; if ((*s_etat_processus).mode_execution_programme == 'Y') { (*(*s_etat_processus).l_base_pile_systeme).adresse_retour = (*s_etat_processus).position_courante; } else { if ((*s_etat_processus).expression_courante == NULL) { (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle; return; } (*(*s_etat_processus).l_base_pile_systeme).pointeur_objet_retour = (*s_etat_processus).expression_courante; } return; } /* ================================================================================ Fonction 'warranty' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_warranty(struct_processus *s_etat_processus) { # include "garanties-conv.h" (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WARRANTY "); if ((*s_etat_processus).langue == 'F') { printf("(garantie)\n\n"); printf(" Aucun argument\n"); } else { printf("(warranty)\n\n"); printf(" No argument\n"); } return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } printf("%s\n", warranty); if ((*s_etat_processus).hauteur_pile_operationnelle == 0) { printf("\n"); } return; } /* ================================================================================ Fonction 'wait' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_wait(struct_processus *s_etat_processus) { int code_retour; int erreur; real8 attente; struct_objet *s_objet; struct timespec temporisation; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WAIT "); if ((*s_etat_processus).langue == 'F') { printf("(attente exprimée en secondes)\n\n"); } else { printf("(wait a number of seconds)\n\n"); } printf(" 1: %s, %s\n", d_INT, d_REL); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (((*s_objet).type == INT) || ((*s_objet).type == REL)) { if ((*s_objet).type == INT) { attente = (real8) (*((integer8 *) (*s_objet).objet)); } else { attente = (*((real8 *) (*s_objet).objet)); } if (attente < 0) { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } temporisation.tv_sec = (long) floor((double) attente); temporisation.tv_nsec = (attente - temporisation.tv_sec) * (long) 1000000000; if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, "Sleep function (WAIT)"); if ((*s_etat_processus).erreur_systeme != d_es) { return; } } do { # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif code_retour = nanosleep(&temporisation, &temporisation); erreur = errno; scrutation_injection(s_etat_processus); if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) { affectation_interruptions_logicielles(s_etat_processus); } if ((*s_etat_processus).nombre_interruptions_en_queue != 0) { traitement_interruptions_logicielles(s_etat_processus); } # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } while(((code_retour == -1) && (erreur == EINTR)) && ((*s_etat_processus).var_volatile_requete_arret == 0)); if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } } else { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet); return; } /* ================================================================================ Fonction 'wireframe' (passe en mode d'affichage échantillonné) ================================================================================ Entrées : structure processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_wireframe(struct_processus *s_etat_processus) { (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WIREFRAME "); if ((*s_etat_processus).langue == 'F') { printf("(graphique tridimensionnel grillagé)\n\n"); printf(" Aucun argument\n"); } else { printf("(wireframe 3D graph)\n\n"); printf(" No argument\n"); } return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } strcpy((*s_etat_processus).type_trace_eq, "GRILLE 3D"); return; } /* ================================================================================ Fonction 'write' ================================================================================ Entrées : structure processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_write(struct_processus *s_etat_processus) { const char *queue; int adresse[16]; int port; integer8 clef; integer8 compteur; integer8 id; integer8 ordre; logical1 mise_a_jour; long longueur_effective; long recursivite; sqlite3_stmt *ppStmt; ssize_t ios; struct_descripteur_fichier *descripteur; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_courant_format; struct_objet *s_format; struct_objet *s_element; struct_objet *s_objet_argument_1; struct_objet *s_objet_argument_2; struct_objet *s_objet_argument_3; struct sigaction action; struct sigaction registre; struct sockaddr_in adresse_ipv4; # ifdef IPV6 struct sockaddr_in6 adresse_ipv6; # endif struct sockaddr_un adresse_unix; struct flock lock; uint32_t calcul_adresse; unsigned char *chaine; unsigned char *chaine_utf8; unsigned char *clef_utf8; unsigned char *commande; unsigned long i; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WRITE "); if ((*s_etat_processus).langue == 'F') { printf("(écriture d'un enregistrement d'un fichier)\n\n"); } else { printf("(write a record of a file)\n\n"); } printf(" 2: %s\n", d_LST); printf(" 1: %s, %s\n\n", d_FCH, d_SCK); printf(" 3: %s\n", d_LST); printf(" 2: %s\n", d_INT); printf(" 1: %s\n", d_FCH); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if ((*s_etat_processus).l_base_pile == NULL) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*(*(*s_etat_processus).l_base_pile).donnee).type == FCH) { if ((*((struct_fichier *) (*(*(*s_etat_processus).l_base_pile) .donnee).objet)).acces == 'D') { if (empilement_pile_last(s_etat_processus, 3) == d_erreur) { return; } } else { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } } } else { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument_2) == d_erreur) { liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet_argument_1).type == FCH) { if ((descripteur = descripteur_fichier(s_etat_processus, (struct_fichier *) (*s_objet_argument_1).objet)) == NULL) { return; } /* * Vérification des verrous */ lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_pid = getpid(); recursivite = 0; if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock) == -1) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (lock.l_type != F_UNLCK) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_fichier_verrouille; return; } /* * Vérification de l'autorisation d'écriture */ if ((*((struct_fichier *) (*s_objet_argument_1).objet)) .protection == 'R') { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire == 'N') { /* * Fichiers formatés */ if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces == 'S') { if ((*s_objet_argument_2).type != LST) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((chaine = formateur_fichier(s_etat_processus, s_objet_argument_2, (*((struct_fichier *) (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'F', &longueur_effective, &recursivite)) == NULL) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } BUG(((*descripteur).type != 'C'), uprintf("Bad filetype !\n")); if (fseek((*descripteur).descripteur_c, (long) 0, SEEK_END) != 0) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((chaine_utf8 = transliteration(s_etat_processus, chaine, d_locale, "UTF-8")) == NULL) { free(chaine); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } free(chaine); if (fprintf((*descripteur).descripteur_c, "%s\n", chaine_utf8) < 0) { free(chaine_utf8); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(chaine_utf8); } else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces == 'D') { BUG(((*descripteur).type != 'S'), uprintf("Bad filetype !\n")); if ((*s_objet_argument_2).type != INT) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_argument_3) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet_argument_3).type != LST) { liberation(s_etat_processus, s_objet_argument_3); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } // Modification ou création d'un nouvel enregistrement if ((chaine = formateur_fichier(s_etat_processus, s_objet_argument_3, (*((struct_fichier *) (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'F', &longueur_effective, &recursivite)) == NULL) { liberation(s_etat_processus, s_objet_argument_3); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } if ((chaine_utf8 = transliteration(s_etat_processus, chaine, d_locale, "UTF-8")) == NULL) { free(chaine); liberation(s_etat_processus, s_objet_argument_3); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } free(chaine); if (alsprintf(&commande, "insert or replace into data " "(id, data) values (%lld, '%s')", (*((integer8 *) (*s_objet_argument_2).objet)), chaine_utf8) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } free(chaine_utf8); if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, commande, strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_step(ppStmt) != SQLITE_DONE) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_finalize(ppStmt) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_argument_3); free(commande); } else // Fichiers indexés { BUG(((*descripteur).type != 'S'), uprintf("Bad filetype !\n")); if ((*s_objet_argument_2).type != LST) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } // Récupération de la position de la clef if (alsprintf(&commande, "select key from control " "where id = 1") < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, commande, strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_step(ppStmt) != SQLITE_ROW) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } clef = sqlite3_column_int64(ppStmt, 0); if (sqlite3_step(ppStmt) != SQLITE_DONE) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_finalize(ppStmt) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(commande); l_element_courant = (struct_liste_chainee *) (*s_objet_argument_2).objet; l_element_courant_format = (struct_liste_chainee *) (*(*((struct_fichier *) (*s_objet_argument_1).objet)) .format).objet; compteur = 1; while((l_element_courant != NULL) && (l_element_courant_format != NULL)) { if (compteur == clef) { break; } l_element_courant = (*l_element_courant).suivant; l_element_courant_format = (*l_element_courant_format) .suivant; compteur++; } if ((l_element_courant == NULL) || (l_element_courant_format == NULL)) { (*s_etat_processus).erreur_execution = d_ex_clef_inexistante; liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } if ((s_element = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*s_element).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_liste_chainee *) (*s_element).objet)).suivant = NULL; if (((*((struct_liste_chainee *) (*s_element).objet)) .donnee = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'N')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if ((s_format = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*s_format).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_liste_chainee *) (*s_format).objet)).suivant = NULL; if (((*((struct_liste_chainee *) (*s_format).objet)) .donnee = copie_objet(s_etat_processus, (*l_element_courant_format).donnee, 'N')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if ((chaine = formateur_fichier(s_etat_processus, s_element, s_format, 0, 0, ' ', 'F', &longueur_effective, &recursivite)) == NULL) { liberation(s_etat_processus, s_element); liberation(s_etat_processus, s_format); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } liberation(s_etat_processus, s_element); liberation(s_etat_processus, s_format); if ((clef_utf8 = transliteration(s_etat_processus, chaine, d_locale, "UTF-8")) == NULL) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } free(chaine); // Récupération de l'identifiant de la clef if (alsprintf(&commande, "select id from key where key = " "'%s'", clef_utf8) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, commande, strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } switch(sqlite3_step(ppStmt)) { case SQLITE_ROW: { // Une clef existe. mise_a_jour = d_vrai; break; } case SQLITE_DONE: { // Aucune clef n'existe. mise_a_jour = d_faux; if (sqlite3_finalize(ppStmt) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(commande); if (alsprintf(&commande, "insert into key " "(key) values ('%s')", clef_utf8) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (sqlite3_prepare_v2((*descripteur) .descripteur_sqlite, commande, strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_step(ppStmt) != SQLITE_DONE) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_finalize(ppStmt) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(commande); if (alsprintf(&commande, "select id from key " "where key = '%s'", clef_utf8) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (sqlite3_prepare_v2((*descripteur) .descripteur_sqlite, commande, strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_step(ppStmt) != SQLITE_ROW) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } break; } default: { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } id = sqlite3_column_int64(ppStmt, 0); if (sqlite3_step(ppStmt) != SQLITE_DONE) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_finalize(ppStmt) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(commande); // Modification de la clef if (mise_a_jour == d_vrai) { if (alsprintf(&commande, "update key set key = '%s' where " "id = %lld", clef_utf8, id) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, commande, strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_step(ppStmt) != SQLITE_DONE) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_finalize(ppStmt) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(commande); } // Effacement de l'enregistrement existant if (alsprintf(&commande, "delete from data where " "key_id = %lld", id) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, commande, strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_step(ppStmt) != SQLITE_DONE) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_finalize(ppStmt) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(commande); // Modification ou création d'un nouvel enregistrement l_element_courant = (struct_liste_chainee *) (*s_objet_argument_2).objet; l_element_courant_format = (struct_liste_chainee *) (*(*((struct_fichier *) (*s_objet_argument_1).objet)) .format).objet; compteur = 1; ordre = 1; while((l_element_courant != NULL) && (l_element_courant_format != NULL)) { if (compteur == clef) { l_element_courant = (*l_element_courant).suivant; l_element_courant_format = (*l_element_courant_format) .suivant; compteur++; continue; } if ((s_element = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*s_element).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_liste_chainee *) (*s_element).objet)).suivant = NULL; if ((s_format = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*s_format).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_liste_chainee *) (*s_format).objet)).suivant = NULL; if (((*((struct_liste_chainee *) (*s_element).objet)) .donnee = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'N')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*((struct_liste_chainee *) (*s_format).objet)) .donnee = copie_objet(s_etat_processus, (*l_element_courant_format).donnee, 'N')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if ((chaine = formateur_fichier(s_etat_processus, s_element, s_format, 0, 0, ' ', 'F', &longueur_effective, &recursivite)) == NULL) { free(clef_utf8); liberation(s_etat_processus, s_element); liberation(s_etat_processus, s_format); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } if ((chaine_utf8 = transliteration(s_etat_processus, chaine, d_locale, "UTF-8")) == NULL) { free(clef_utf8); free(chaine); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } free(chaine); if (alsprintf(&commande, "insert into data " "(data, key_id, sequence) values " "('%s', %lld, %lld)", chaine_utf8, id, ordre) < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, commande, strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_step(ppStmt) != SQLITE_DONE) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (sqlite3_finalize(ppStmt) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(commande); free(chaine_utf8); liberation(s_etat_processus, s_element); liberation(s_etat_processus, s_format); l_element_courant = (*l_element_courant).suivant; l_element_courant_format = (*l_element_courant_format) .suivant; compteur++; ordre++; } free(clef_utf8); if ((l_element_courant != NULL) || (l_element_courant_format != NULL)) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier; return; } } } else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire == 'Y') { /* * Fichiers non formatés */ if ((chaine = formateur_fichier(s_etat_processus, s_objet_argument_2, (*((struct_fichier *) (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'U', &longueur_effective, &recursivite)) == NULL) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces == 'S') { BUG(((*descripteur).type != 'C'), uprintf("Bad filetype !\n")); if (fseek((*descripteur).descripteur_c, (long) 0, SEEK_END) != 0) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (fwrite(chaine, sizeof(unsigned char), longueur_effective, (*descripteur).descripteur_c) != (size_t) longueur_effective) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces == 'D') { } else { /* Fichiers indexés : panique totale ! */ } free(chaine); } else { /* * Fichiers de type FLOW */ } } else if (((*s_objet_argument_2).type == LST) && ((*s_objet_argument_1).type == SCK)) { /* * Vérification de l'autorisation d'écriture */ if ((*((struct_socket *) (*s_objet_argument_1).objet)) .protection == 'R') { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire == 'N') { /* * Sockets formatées */ if ((chaine = formateur_fichier(s_etat_processus, s_objet_argument_2, (*((struct_socket *) (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'F', &longueur_effective, &recursivite)) == NULL) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } if ((strcmp((*((struct_socket *) (*s_objet_argument_1).objet)).type, "STREAM") == 0) || (strcmp((*((struct_socket *) (*s_objet_argument_1).objet)).type, "SEQUENTIAL DATAGRAM") == 0)) { // Sockets connectées action.sa_handler = SIG_IGN; action.sa_flags = SA_ONSTACK; if (sigaction(SIGPIPE, &action, ®istre) != 0) { (*s_etat_processus).erreur_systeme = d_es_signal; return; } # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { if (sigaction(SIGPIPE, ®istre, NULL) != 0) { (*s_etat_processus).erreur_systeme = d_es_signal; return; } (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (send((*((struct_socket *) (*s_objet_argument_1).objet)) .socket, chaine, strlen(chaine), 0) < 0) { ios = errno; if (sigaction(SIGPIPE, ®istre, NULL) != 0) { (*s_etat_processus).erreur_systeme = d_es_signal; return; } # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if (ios == EPIPE) { (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { if (sigaction(SIGPIPE, ®istre, NULL) != 0) { (*s_etat_processus).erreur_systeme = d_es_signal; return; } (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if (sigaction(SIGPIPE, ®istre, NULL) != 0) { (*s_etat_processus).erreur_systeme = d_es_signal; return; } } else { // Sockets non connectées /* * Vérification de l'adresse distante */ if (strcmp((*((struct_socket *) (*s_objet_argument_1).objet)) .adresse_distante, "") == 0) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } /* * Création de l'adresse logique */ if ((*((struct_socket *) (*s_objet_argument_1).objet)) .domaine == PF_UNIX) { adresse_unix.sun_family = AF_UNIX; strncpy(adresse_unix.sun_path, (*((struct_socket *) (*s_objet_argument_1).objet)).adresse_distante, UNIX_PATH_MAX); adresse_unix.sun_path[UNIX_PATH_MAX - 1] = d_code_fin_chaine; # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif if (sendto((*((struct_socket *) (*s_objet_argument_1).objet)).socket, chaine, strlen(chaine), 0, (struct sockaddr *) &adresse_unix, sizeof(adresse_unix)) < 0) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus) .semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus) .semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } else if ((*((struct_socket *) (*s_objet_argument_1).objet)) .domaine == PF_INET) { if (sscanf((*((struct_socket *) (*s_objet_argument_1).objet)) .adresse_distante, "%d.%d.%d.%d(%d)", &(adresse[0]), &(adresse[1]), &(adresse[2]), &(adresse[3]), &port) == 5) { // Adresse IPv4 calcul_adresse = 0; for(i = 0; i < 4; calcul_adresse = (256 * calcul_adresse) + adresse[i++]); memset(&adresse_ipv4, 0, sizeof(adresse_ipv4)); adresse_ipv4.sin_family = AF_INET; adresse_ipv4.sin_port = htons(port); adresse_ipv4.sin_addr.s_addr = htonl(calcul_adresse); # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus) .semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus) .semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif if (sendto((*((struct_socket *) (*s_objet_argument_1).objet)).socket, chaine, strlen(chaine), 0, (struct sockaddr *) &adresse_ipv4, sizeof(adresse_ipv4)) < 0) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus) .semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus) .semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus) .semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus) .semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } else { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else if ((*((struct_socket *) (*s_objet_argument_1).objet)) .domaine == PF_INET6) { if (sscanf((*((struct_socket *) (*s_objet_argument_1) .objet)).adresse_distante, "%X:%X:%X:%X:%X:" "%X:%X:%X:%X:%X:%X:%X:%X:%X:%X:%X(%d)", &(adresse[0]), &(adresse[1]), &(adresse[2]), &(adresse[3]), &(adresse[4]), &(adresse[5]), &(adresse[6]), &(adresse[7]), &(adresse[8]), &(adresse[9]), &(adresse[10]), &(adresse[11]), &(adresse[12]), &(adresse[13]), &(adresse[14]), &(adresse[15]), &port)== 17) { // Adresse IPv6 # ifdef IPV6 memset(&adresse_ipv6, 0, sizeof(adresse_ipv6)); adresse_ipv6.sin6_family = AF_INET6; adresse_ipv6.sin6_port = htons((uint16_t) port); for(i = 0; i < 16; adresse_ipv6.sin6_addr.s6_addr[i] = adresse[i], i++); # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus) .semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus) .semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif if (sendto((*((struct_socket *) (*s_objet_argument_1).objet)).socket, chaine, strlen(chaine), 0, (struct sockaddr *) &adresse_ipv6, sizeof(adresse_ipv6)) < 0) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus) .semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus) .semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus) .semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus) .semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } # else if ((*s_etat_processus).langue == 'F') { printf("+++Attention : Support du protocole" " IPv6 indisponible\n"); } else { printf("+++Warning : IPv6 support " "unavailable\n"); } # endif } else { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } free(chaine); } else if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire == 'Y') { /* * Sockets non formatées */ } else { /* * Sockets de type FLOW */ } } else { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } /* ================================================================================ Fonction 'wflock' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_wflock(struct_processus *s_etat_processus) { logical1 drapeau; struct flock lock; struct timespec attente; struct_descripteur_fichier *descripteur; struct_objet *s_objet_argument_1; struct_objet *s_objet_argument_2; unsigned char *chaine; unsigned char registre_instruction_valide; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WFLOCK "); if ((*s_etat_processus).langue == 'F') { printf("(attente du positionnement d'un verrou sur un fichier)" "\n\n"); } else { printf("(wait for file lock)\n\n"); } printf(" 2: %s\n", d_FCH); printf(" 1: %s (READ/WRITE/NONE)\n", d_CHN); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument_2) == d_erreur) { liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (((*s_objet_argument_2).type == FCH) && ((*s_objet_argument_1).type == CHN)) { drapeau = d_faux; do { if ((chaine = conversion_majuscule((unsigned char *) (*s_objet_argument_1).objet)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (strcmp(chaine, "WRITE") == 0) { lock.l_type = F_WRLCK; } else if (strcmp(chaine, "READ") == 0) { lock.l_type = F_RDLCK; } else if (strcmp(chaine, "NONE") == 0) { lock.l_type = F_UNLCK; } else { free(chaine); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_verrou_indefini; return; } free(chaine); lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_pid = getpid(); if ((descripteur = descripteur_fichier(s_etat_processus, (struct_fichier *) (*s_objet_argument_2).objet)) == NULL) { return; } if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock) == -1) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_fichier_verrouille; return; } # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if (lock.l_type == F_UNLCK) { drapeau = d_vrai; } else { if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) { affectation_interruptions_logicielles(s_etat_processus); } if ((*s_etat_processus).nombre_interruptions_en_queue != 0) { registre_instruction_valide = (*s_etat_processus).instruction_valide; traitement_interruptions_logicielles( s_etat_processus); (*s_etat_processus).instruction_valide = registre_instruction_valide; } nanosleep(&attente, NULL); scrutation_injection(s_etat_processus); INCR_GRANULARITE(attente.tv_nsec); } } while((drapeau == d_faux) && ((*s_etat_processus) .var_volatile_requete_arret != -1)); } else { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } return; } /* ================================================================================ Fonction 'wfproc' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_wfproc(struct_processus *s_etat_processus) { logical1 drapeau_fin; struct_liste_chainee *l_element_courant; struct_objet *s_objet_argument; struct timespec attente; unsigned char registre_instruction_valide; (*s_etat_processus).erreur_execution = d_ex; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WFPROC "); if ((*s_etat_processus).langue == 'F') { printf("(attente de la fin d'un processus fils)\n\n"); } else { printf("(wait for child process end)\n\n"); } printf(" 1: %s\n", d_PRC); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet_argument).type == PRC) { drapeau_fin = d_faux; if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, "Interprocess or interthread " "communications (WFPROC)"); if ((*s_etat_processus).erreur_systeme != d_es) { return; } } if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus).erreur_systeme = d_es_processus; return; } while(drapeau_fin == d_faux) { l_element_courant = (struct_liste_chainee *) (*s_etat_processus).l_base_pile_processus; while(l_element_courant != NULL) { if ((*(*((struct_processus_fils *) (*(*l_element_courant) .donnee).objet)).thread).processus_detache == d_vrai) { if ((*(*((struct_processus_fils *) (*s_objet_argument).objet)).thread) .processus_detache == d_vrai) { if ((*(*((struct_processus_fils *) (*(*l_element_courant) .donnee).objet)).thread).pid == (*(*((struct_processus_fils *) (*s_objet_argument).objet)).thread).pid) { break; } } } else { if ((*(*((struct_processus_fils *) (*s_objet_argument).objet)).thread) .processus_detache == d_faux) { if ((pthread_equal((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .tid, (*(*((struct_processus_fils *) (*s_objet_argument).objet)).thread).tid) != 0) && ((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .pid == (*(*((struct_processus_fils *) (*s_objet_argument).objet)).thread).pid)) { break; } } } l_element_courant = (*l_element_courant).suivant; } if ((*s_etat_processus).var_volatile_requete_arret != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_argument); return; } if (l_element_courant == NULL) { /* * Si l_element_courant vaut NULL, le processus n'existe plus. */ drapeau_fin = d_vrai; } else { if ((*(*((struct_processus_fils *) (*(*l_element_courant) .donnee).objet)).thread).processus_detache == d_vrai) { if (kill((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).pid, 0) != 0) { drapeau_fin = d_vrai; } else { drapeau_fin = d_faux; } } else { if (pthread_mutex_lock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .mutex)) != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus).erreur_systeme = d_es_processus; return; } if ((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .thread_actif == d_faux) { drapeau_fin = d_vrai; } else { drapeau_fin = d_faux; } if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .mutex)) != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if (drapeau_fin == d_faux) { /* * Le processus n'est pas terminé */ if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus).erreur_systeme = d_es_processus; return; } if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) { affectation_interruptions_logicielles(s_etat_processus); } if ((*s_etat_processus).nombre_interruptions_en_queue != 0) { registre_instruction_valide = (*s_etat_processus).instruction_valide; traitement_interruptions_logicielles( s_etat_processus); (*s_etat_processus).instruction_valide = registre_instruction_valide; } # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif nanosleep(&attente, NULL); # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } scrutation_injection(s_etat_processus); if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } INCR_GRANULARITE(attente.tv_nsec); } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_argument); return; } /* ================================================================================ Fonction 'wfdata' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_wfdata(struct_processus *s_etat_processus) { logical1 drapeau_fin; struct_liste_chainee *l_element_courant; struct_objet *s_objet_argument; struct timespec attente; unsigned char registre_instruction_valide; (*s_etat_processus).erreur_execution = d_ex; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WFDATA "); if ((*s_etat_processus).langue == 'F') { printf("(attente de données d'un processus fils)\n\n"); } else { printf("(wait for data from child process)\n\n"); } printf(" 1: %s\n", d_PRC); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet_argument).type == PRC) { drapeau_fin = d_faux; if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, "Interprocess or interthread " "communications (WFDATA)"); if ((*s_etat_processus).erreur_systeme != d_es) { return; } } if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus).erreur_systeme = d_es_processus; return; } while(drapeau_fin == d_faux) { l_element_courant = (struct_liste_chainee *) (*s_etat_processus).l_base_pile_processus; while(l_element_courant != NULL) { if ((*(*((struct_processus_fils *) (*(*l_element_courant) .donnee).objet)).thread).processus_detache == d_vrai) { if (((*(*((struct_processus_fils *) (*(*l_element_courant) .donnee).objet)).thread).pid == (*(*((struct_processus_fils *) (*s_objet_argument).objet)).thread).pid) && ((*(*((struct_processus_fils *) (*s_objet_argument).objet)).thread) .processus_detache == d_vrai)) { break; } } else { if ((pthread_equal((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).tid, (*(*((struct_processus_fils *) (*s_objet_argument) .objet)).thread).tid) != 0) && ((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).pid == (*(*((struct_processus_fils *) (*s_objet_argument).objet)).thread).pid) && ((*(*((struct_processus_fils *) (*s_objet_argument).objet)).thread) .processus_detache == d_faux)) { break; } } l_element_courant = (*l_element_courant).suivant; } if ((*s_etat_processus).var_volatile_requete_arret != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_argument); return; } if (l_element_courant != NULL) { if (pthread_mutex_lock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if ((*(*((struct_processus_fils *) (*(*l_element_courant) .donnee).objet)).thread).nombre_objets_dans_pipe != 0) { if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } drapeau_fin = d_vrai; } else { if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus).erreur_systeme = d_es_processus; return; } # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif nanosleep(&attente, NULL); # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } scrutation_injection(s_etat_processus); if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) { affectation_interruptions_logicielles(s_etat_processus); } if ((*s_etat_processus).nombre_interruptions_en_queue != 0) { registre_instruction_valide = (*s_etat_processus).instruction_valide; traitement_interruptions_logicielles(s_etat_processus); (*s_etat_processus).instruction_valide = registre_instruction_valide; } if ((*s_etat_processus).var_volatile_requete_arret != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } return; } if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } else { drapeau_fin = d_vrai; (*s_etat_processus).erreur_execution = d_ex_processus; } INCR_GRANULARITE(attente.tv_nsec); } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_argument); return; } /* ================================================================================ Fonction 'wfsock' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_wfsock(struct_processus *s_etat_processus) { int erreur; logical1 drapeau; socklen_t longueur; struct_liste_chainee *l_element_courant; struct_objet *s_objet_argument; struct_objet *s_objet_resultat; struct sockaddr_in adresse_ipv4; # ifdef IPV6 struct sockaddr_in6 adresse_ipv6; # endif unsigned long i; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WFSOCK "); if ((*s_etat_processus).langue == 'F') { printf("(attente d'une connexion sur une socket)\n\n"); } else { printf("(wait for connection on a socket)\n\n"); } printf(" 1: %s\n", d_SCK); printf("-> 2: %s\n", d_SCK); printf(" 1: %s\n", d_SCK); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet_argument).type == SCK) { if ((strcmp((*((struct_socket *) (*s_objet_argument).objet)).type, "STREAM") != 0) && (strcmp((*((struct_socket *) (*s_objet_argument).objet)).type, "SEQUENTIAL DATAGRAM") != 0)) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if ((s_objet_resultat = copie_objet(s_etat_processus, s_objet_argument, 'O')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_socket *) (*s_objet_resultat).objet)).socket_en_ecoute = 'N'; (*((struct_socket *) (*s_objet_resultat).objet)).effacement = 'N'; if ((*((struct_socket *) (*s_objet_resultat).objet)).domaine == PF_INET) { longueur = sizeof(adresse_ipv4); do { drapeau = d_vrai; # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif if (((*((struct_socket *) (*s_objet_resultat).objet)).socket = accept((*((struct_socket *) (*s_objet_argument).objet)) .socket, (struct sockaddr *) &adresse_ipv4, &longueur)) < 0) { erreur = errno; # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if (erreur != EINTR) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } scrutation_injection(s_etat_processus); if ((*s_etat_processus).var_volatile_requete_arret != 0) { drapeau = d_vrai; } else { drapeau = d_faux; } } else { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } } while(drapeau == d_faux); if (((*((struct_socket *) (*s_objet_resultat).objet)) .adresse_distante = malloc(22 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } sprintf((*((struct_socket *) (*s_objet_resultat).objet)) .adresse_distante, "%d.%d.%d.%d(%d)", (ntohl(adresse_ipv4.sin_addr.s_addr) >> 24) & 0xFF, (ntohl(adresse_ipv4.sin_addr.s_addr) >> 16) & 0xFF, (ntohl(adresse_ipv4.sin_addr.s_addr) >> 8) & 0xFF, ntohl(adresse_ipv4.sin_addr.s_addr) & 0xFF, ntohs(adresse_ipv4.sin_port)); } else if ((*((struct_socket *) (*s_objet_resultat).objet)).domaine == PF_INET6) { # ifdef IPV6 longueur = sizeof(adresse_ipv6); do { drapeau = d_vrai; # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif if (((*((struct_socket *) (*s_objet_resultat).objet)).socket = accept((*((struct_socket *) (*s_objet_argument).objet)) .socket, (struct sockaddr *) &adresse_ipv6, &longueur)) < 0) { erreur = errno; # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if (erreur != EINTR) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } scrutation_injection(s_etat_processus); if ((*s_etat_processus).var_volatile_requete_arret != 0) { drapeau = d_vrai; } else { drapeau = d_faux; } } else { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } } while(drapeau == d_faux); if (((*((struct_socket *) (*s_objet_resultat).objet)) .adresse_distante = malloc(55 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .adresse_distante = d_code_fin_chaine; for(i = 0; i < 16; i++) { sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse_distante, (i == 0) ? "%s%X" : "%s:%X", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse_distante, adresse_ipv6.sin6_addr.s6_addr[i]); } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse_distante, "%s(%u)", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse_distante, ntohs(adresse_ipv6.sin6_port)); # else if ((*s_etat_processus).langue == 'F') { printf("+++Attention : Support du protocole" " IPv6 indisponible\n"); } else { printf("+++Warning : IPv6 support " "unavailable\n"); } # endif } else { longueur = 0; do { drapeau = d_vrai; # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif if (((*((struct_socket *) (*s_objet_resultat).objet)).socket = accept((*((struct_socket *) (*s_objet_argument).objet)) .socket, NULL, &longueur)) < 0) { erreur = errno; # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if (erreur != EINTR) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } scrutation_injection(s_etat_processus); if ((*s_etat_processus).var_volatile_requete_arret != 0) { drapeau = d_vrai; } else { drapeau = d_faux; } } else { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } } while(drapeau == d_faux); } // Si accept() renvoie une erreur non récupérée, il ne peut s'agir // que de EINTR sachant qu'une requête d'arrêt est en court de // traitement. if ((*((struct_socket *) (*s_objet_resultat).objet)).socket >= 0) { l_element_courant = (*s_etat_processus).s_sockets; if (l_element_courant == NULL) { if (((*s_etat_processus).s_sockets = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*s_etat_processus).s_sockets).suivant = NULL; l_element_courant = (*s_etat_processus).s_sockets; } else { /* * Ajout d'un élément à la fin de la liste chaînée */ while((*l_element_courant).suivant != NULL) { l_element_courant = (*l_element_courant).suivant; } if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*l_element_courant).suivant; (*l_element_courant).suivant = NULL; } if (((*l_element_courant).donnee = copie_objet(s_etat_processus, s_objet_resultat, 'O')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_argument) == d_erreur) { return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { return; } } else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } return; } /* ================================================================================ Fonction 'wfswi' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_wfswi(struct_processus *s_etat_processus) { integer8 interruption; logical1 drapeau_fin; struct_objet *s_objet_argument; struct timespec attente; (*s_etat_processus).erreur_execution = d_ex; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WFSWI "); if ((*s_etat_processus).langue == 'F') { printf("(attente d'une interruption)\n\n"); } else { printf("(wait for interrupt)\n\n"); } printf(" 1: %s\n", d_INT); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet_argument).type == INT) { drapeau_fin = d_faux; interruption = (*((integer8 *) (*s_objet_argument).objet)); if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS)) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_interruption_invalide; return; } while(drapeau_fin == d_faux) { if ((*s_etat_processus).var_volatile_requete_arret != 0) { liberation(s_etat_processus, s_objet_argument); return; } if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) { affectation_interruptions_logicielles(s_etat_processus); } if ((*s_etat_processus).queue_interruptions[interruption - 1] > 0) { drapeau_fin = d_vrai; } else { nanosleep(&attente, NULL); scrutation_injection(s_etat_processus); INCR_GRANULARITE(attente.tv_nsec); } } } else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_argument); return; } /* ================================================================================ Fonction 'wfpoke' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_wfpoke(struct_processus *s_etat_processus) { struct timespec attente; unsigned char registre_instruction_valide; (*s_etat_processus).erreur_execution = d_ex; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WFPOKE "); if ((*s_etat_processus).langue == 'F') { printf("(attente de données en provenance du processus père)\n\n"); printf(" Aucun argument\n"); } else { printf("(wait for data from parent process)\n\n"); printf(" No argument\n"); } return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } } if ((*s_etat_processus).presence_pipes == d_faux) { (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere; return; } if ((*s_etat_processus).nombre_objets_injectes > 0) { return; } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, "Interprocess or interthread " "communications (WFPOKE)"); if ((*s_etat_processus).erreur_systeme != d_es) { return; } } do { # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif nanosleep(&attente, NULL); # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } scrutation_injection(s_etat_processus); if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) { affectation_interruptions_logicielles(s_etat_processus); } if ((*s_etat_processus).nombre_interruptions_en_queue != 0) { registre_instruction_valide = (*s_etat_processus).instruction_valide; traitement_interruptions_logicielles(s_etat_processus); (*s_etat_processus).instruction_valide = registre_instruction_valide; } if ((*s_etat_processus).var_volatile_requete_arret != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } return; } INCR_GRANULARITE(attente.tv_nsec); } while((*s_etat_processus).nombre_objets_injectes == 0); return; } /* ================================================================================ Fonction 'wfack' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_wfack(struct_processus *s_etat_processus) { struct timespec attente; unsigned char registre_instruction_valide; (*s_etat_processus).erreur_execution = d_ex; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n WFACK "); if ((*s_etat_processus).langue == 'F') { printf("(attente des acquittements de lecture)\n\n"); printf(" Aucun argument\n"); } else { printf("(wait for reading of data acknowledgement)\n\n"); printf(" No argument\n"); } return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } } if ((*s_etat_processus).presence_pipes == d_faux) { (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere; return; } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, "Interprocess or interthread communications" " (WFACK)"); if ((*s_etat_processus).erreur_systeme != d_es) { return; } } while((*s_etat_processus).nombre_objets_envoyes_non_lus != 0) { scrutation_injection(s_etat_processus); if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) { affectation_interruptions_logicielles(s_etat_processus); } if ((*s_etat_processus).nombre_interruptions_en_queue != 0) { registre_instruction_valide = (*s_etat_processus).instruction_valide; traitement_interruptions_logicielles(s_etat_processus); (*s_etat_processus).instruction_valide = registre_instruction_valide; } if ((*s_etat_processus).var_volatile_requete_arret != 0) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } return; } # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } # endif nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) # else while(sem_wait((*s_etat_processus).semaphore_fork) == -1) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } return; } // vim: ts=4