Annotation of rpl/src/instructions_a5.c, revision 1.1
1.1 ! bertrand 1: /*
! 2: ================================================================================
! 3: RPL/2 (R) version 4.0.9
! 4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
! 5:
! 6: This file is part of RPL/2.
! 7:
! 8: RPL/2 is free software; you can redistribute it and/or modify it
! 9: under the terms of the CeCILL V2 License as published by the french
! 10: CEA, CNRS and INRIA.
! 11:
! 12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
! 13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
! 14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
! 15: for more details.
! 16:
! 17: You should have received a copy of the CeCILL License
! 18: along with RPL/2. If not, write to info@cecill.info.
! 19: ================================================================================
! 20: */
! 21:
! 22:
! 23: #include "rpl.conv.h"
! 24:
! 25:
! 26: /*
! 27: ================================================================================
! 28: Fonction 'alarm'
! 29: ================================================================================
! 30: Entrées : pointeur sur une structure struct_processus
! 31: --------------------------------------------------------------------------------
! 32: Sorties :
! 33: --------------------------------------------------------------------------------
! 34: Effets de bord : néant
! 35: ================================================================================
! 36: */
! 37:
! 38: void
! 39: instruction_alarm(struct_processus *s_etat_processus)
! 40: {
! 41: double duree;
! 42:
! 43: int code_retour;
! 44: int erreur;
! 45:
! 46: logical1 specification_date;
! 47:
! 48: struct_liste_chainee *l_element_courant;
! 49:
! 50: struct_objet *s_objet_argument;
! 51:
! 52: struct timeb st;
! 53:
! 54: struct timespec attente;
! 55:
! 56: struct timeval debut_interruption;
! 57: struct timeval duree_interruption;
! 58: struct timeval fin_interruption;
! 59:
! 60: struct tm *s_time_actuel;
! 61: struct tm s_time_alarme;
! 62: struct tm s_time_registre;
! 63:
! 64: time_t alarme;
! 65:
! 66: unsigned long nombre_elements;
! 67:
! 68: (*s_etat_processus).erreur_execution = d_ex;
! 69:
! 70: if ((*s_etat_processus).affichage_arguments == 'Y')
! 71: {
! 72: printf("\n ALARM ");
! 73:
! 74: if ((*s_etat_processus).langue == 'F')
! 75: {
! 76: printf("(suspension du processus jusqu'à un instant spécifié)\n\n");
! 77: }
! 78: else
! 79: {
! 80: printf("(wait until timestamp)\n\n");
! 81: }
! 82:
! 83: printf(" 1: %s\n\n", d_LST);
! 84:
! 85: if ((*s_etat_processus).langue == 'F')
! 86: {
! 87: printf(" Utilisation :\n\n");
! 88: }
! 89: else
! 90: {
! 91: printf(" Usage:\n\n");
! 92: }
! 93:
! 94: printf(" { hours minutes } ALARM\n");
! 95: printf(" { hours minutes seconds } ALARM\n");
! 96: printf(" { hours minutes seconds day } ALARM\n");
! 97: printf(" { hours minutes seconds day month } ALARM\n");
! 98: printf(" { hours minutes seconds day month year } ALARM\n");
! 99:
! 100: return;
! 101: }
! 102: else if ((*s_etat_processus).test_instruction == 'Y')
! 103: {
! 104: (*s_etat_processus).nombre_arguments = 1;
! 105: return;
! 106: }
! 107:
! 108: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 109: {
! 110: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 111: {
! 112: return;
! 113: }
! 114: }
! 115:
! 116: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 117: &s_objet_argument) == d_erreur)
! 118: {
! 119: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 120: return;
! 121: }
! 122:
! 123: if ((*s_objet_argument).type == LST)
! 124: {
! 125: l_element_courant = (*s_objet_argument).objet;
! 126: nombre_elements = 0;
! 127:
! 128: while(l_element_courant != NULL)
! 129: {
! 130: if ((*(*l_element_courant).donnee).type != INT)
! 131: {
! 132: (*s_etat_processus).erreur_execution =
! 133: d_ex_erreur_type_argument;
! 134:
! 135: liberation(s_etat_processus, s_objet_argument);
! 136: return;
! 137: }
! 138:
! 139: l_element_courant = (*l_element_courant).suivant;
! 140: nombre_elements++;
! 141: }
! 142:
! 143: if ((nombre_elements < 2) || (nombre_elements > 6))
! 144: {
! 145: (*s_etat_processus).erreur_execution =
! 146: d_ex_argument_invalide;
! 147:
! 148: liberation(s_etat_processus, s_objet_argument);
! 149: return;
! 150: }
! 151:
! 152: st.time = time(NULL);
! 153: s_time_actuel = localtime(&(st.time));
! 154:
! 155: l_element_courant = (*s_objet_argument).objet;
! 156: s_time_alarme.tm_hour = (*((integer8 *) (*(*l_element_courant)
! 157: .donnee).objet));
! 158: l_element_courant = (*l_element_courant).suivant;
! 159: s_time_alarme.tm_min = (*((integer8 *) (*(*l_element_courant)
! 160: .donnee).objet));
! 161: l_element_courant = (*l_element_courant).suivant;
! 162:
! 163: specification_date = d_faux;
! 164:
! 165: if (l_element_courant != NULL)
! 166: {
! 167: s_time_alarme.tm_sec = (*((integer8 *) (*(*l_element_courant)
! 168: .donnee).objet));
! 169: l_element_courant = (*l_element_courant).suivant;
! 170:
! 171: if (l_element_courant != NULL)
! 172: {
! 173: specification_date = d_vrai;
! 174:
! 175: s_time_alarme.tm_mday = (*((integer8 *) (*(*l_element_courant)
! 176: .donnee).objet));
! 177: l_element_courant = (*l_element_courant).suivant;
! 178:
! 179: if (l_element_courant != NULL)
! 180: {
! 181: s_time_alarme.tm_mon = (*((integer8 *)
! 182: (*(*l_element_courant).donnee).objet)) - 1;
! 183: l_element_courant = (*l_element_courant).suivant;
! 184:
! 185: if (l_element_courant != NULL)
! 186: {
! 187: s_time_alarme.tm_year = (*((integer8 *)
! 188: (*(*l_element_courant).donnee).objet))
! 189: - 1900;
! 190: l_element_courant = (*l_element_courant).suivant;
! 191: }
! 192: else
! 193: {
! 194: s_time_alarme.tm_year = (*s_time_actuel).tm_year;
! 195: }
! 196: }
! 197: else
! 198: {
! 199: s_time_alarme.tm_mon = (*s_time_actuel).tm_mon;
! 200: s_time_alarme.tm_year = (*s_time_actuel).tm_year;
! 201: }
! 202: }
! 203: else
! 204: {
! 205: s_time_alarme.tm_mday = (*s_time_actuel).tm_mday;
! 206: s_time_alarme.tm_mon = (*s_time_actuel).tm_mon;
! 207: s_time_alarme.tm_year = (*s_time_actuel).tm_year;
! 208: }
! 209: }
! 210: else
! 211: {
! 212: s_time_alarme.tm_sec = 0;
! 213: s_time_alarme.tm_mday = (*s_time_actuel).tm_mday;
! 214: s_time_alarme.tm_mon = (*s_time_actuel).tm_mon;
! 215: s_time_alarme.tm_year = (*s_time_actuel).tm_year;
! 216: }
! 217:
! 218: s_time_registre = s_time_alarme;
! 219: alarme = mktime(&s_time_alarme);
! 220:
! 221: if ((s_time_alarme.tm_sec != s_time_registre.tm_sec) ||
! 222: (s_time_alarme.tm_min != s_time_registre.tm_min) ||
! 223: (s_time_alarme.tm_hour != s_time_registre.tm_hour) ||
! 224: (s_time_alarme.tm_mday != s_time_registre.tm_mday) ||
! 225: (s_time_alarme.tm_mon != s_time_registre.tm_mon) ||
! 226: (s_time_alarme.tm_year != s_time_registre.tm_year))
! 227: {
! 228: (*s_etat_processus).erreur_execution =
! 229: d_ex_argument_invalide;
! 230:
! 231: liberation(s_etat_processus, s_objet_argument);
! 232: return;
! 233: }
! 234:
! 235: while((duree = difftime(alarme, st.time)) < 0)
! 236: {
! 237: if (specification_date == d_vrai)
! 238: {
! 239: (*s_etat_processus).erreur_execution =
! 240: d_ex_argument_invalide;
! 241:
! 242: liberation(s_etat_processus, s_objet_argument);
! 243: return;
! 244: }
! 245:
! 246: s_time_alarme.tm_mday++;
! 247: alarme = mktime(&s_time_alarme);
! 248: }
! 249:
! 250: attente.tv_nsec = (long) ((duree - (attente.tv_sec =
! 251: (long) floor(duree))) * 1000000000);
! 252:
! 253: if ((*s_etat_processus).profilage == d_vrai)
! 254: {
! 255: profilage(s_etat_processus, "Sleep function (ALARM)");
! 256:
! 257: if ((*s_etat_processus).erreur_systeme != d_es)
! 258: {
! 259: return;
! 260: }
! 261: }
! 262:
! 263: do
! 264: {
! 265: code_retour = nanosleep(&attente, &attente);
! 266: erreur = errno;
! 267:
! 268: if (code_retour == -1)
! 269: {
! 270: gettimeofday(&debut_interruption, NULL);
! 271:
! 272: scrutation_injection(s_etat_processus);
! 273:
! 274: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
! 275: {
! 276: affectation_interruptions_logicielles(s_etat_processus);
! 277: }
! 278:
! 279: if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
! 280: {
! 281: traitement_interruptions_logicielles(s_etat_processus);
! 282: }
! 283:
! 284: gettimeofday(&fin_interruption, NULL);
! 285:
! 286: if (fin_interruption.tv_usec < debut_interruption.tv_usec)
! 287: {
! 288: duree_interruption.tv_usec = (1000000
! 289: + fin_interruption.tv_usec)
! 290: - debut_interruption.tv_usec;
! 291: duree_interruption.tv_sec = fin_interruption.tv_sec
! 292: - (debut_interruption.tv_sec + 1);
! 293: }
! 294: else
! 295: {
! 296: duree_interruption.tv_usec = fin_interruption.tv_usec
! 297: - debut_interruption.tv_usec;
! 298: duree_interruption.tv_sec = fin_interruption.tv_sec
! 299: - debut_interruption.tv_sec;
! 300: }
! 301:
! 302: if (attente.tv_nsec < (1000 * duree_interruption.tv_usec))
! 303: {
! 304: attente.tv_nsec = (1000000000 + attente.tv_nsec)
! 305: - (1000 * duree_interruption.tv_usec);
! 306: attente.tv_sec = attente.tv_sec
! 307: - (duree_interruption.tv_sec + 1);
! 308: }
! 309: else
! 310: {
! 311: attente.tv_nsec = attente.tv_nsec
! 312: - (1000 * duree_interruption.tv_usec);
! 313: attente.tv_sec = attente.tv_sec
! 314: - duree_interruption.tv_sec;
! 315: }
! 316:
! 317: if (attente.tv_sec < 0)
! 318: {
! 319: code_retour = 0;
! 320: }
! 321: }
! 322: } while(((code_retour == -1) && (erreur == EINTR))
! 323: && ((*s_etat_processus).var_volatile_requete_arret == 0));
! 324:
! 325: if ((*s_etat_processus).profilage == d_vrai)
! 326: {
! 327: profilage(s_etat_processus, NULL);
! 328: }
! 329: }
! 330: else
! 331: {
! 332: liberation(s_etat_processus, s_objet_argument);
! 333:
! 334: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 335: return;
! 336: }
! 337:
! 338: liberation(s_etat_processus, s_objet_argument);
! 339: }
! 340:
! 341: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>