Annotation of rpl/src/gestion_processus.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 de surveillance d'un processus fils.
! 29: Elle tourne dans un thread séparé et ferme les descripteurs lors
! 30: de la mort du fils.
! 31: ================================================================================
! 32: Entrées : pointeur sur une structure
! 33: --------------------------------------------------------------------------------
! 34: Sorties :
! 35: --------------------------------------------------------------------------------
! 36: Effets de bord : néant
! 37: ================================================================================
! 38: */
! 39:
! 40: void *
! 41: surveillance_processus(void *argument)
! 42: {
! 43: int iostat;
! 44: int status;
! 45:
! 46: integer8 nombre_donnees;
! 47:
! 48: logical1 drapeau;
! 49: logical1 drapeau_fin;
! 50: logical1 drapeau_fin_scrutation;
! 51: logical1 drapeau_interruptions_traitees;
! 52: logical1 drapeau_objets_traites;
! 53:
! 54: pid_t pid;
! 55: pid_t pid_candidat;
! 56:
! 57: pthread_t tid_candidat;
! 58:
! 59: sigset_t masque;
! 60:
! 61: ssize_t longueur_ecriture;
! 62:
! 63: struct_descripteur_thread *s_argument_thread;
! 64:
! 65: struct_liste_chainee *l_element_courant;
! 66: struct_liste_chainee *l_element_precedent;
! 67:
! 68: struct_processus *s_etat_processus;
! 69:
! 70: struct timespec attente;
! 71:
! 72: unsigned char caractere;
! 73:
! 74: unsigned int tampon_erreur;
! 75:
! 76: sigemptyset(&masque);
! 77: sigaddset(&masque, SIGINJECT);
! 78: sigaddset(&masque, SIGFSTOP);
! 79: sigaddset(&masque, SIGURG);
! 80: sigaddset(&masque, SIGALRM);
! 81: sigaddset(&masque, SIGCONT);
! 82: sigaddset(&masque, SIGINT);
! 83: pthread_sigmask(SIG_BLOCK, &masque, NULL);
! 84:
! 85: s_argument_thread = argument;
! 86: s_etat_processus = (*s_argument_thread).s_etat_processus;
! 87: insertion_thread_surveillance(s_etat_processus, s_argument_thread);
! 88:
! 89: attente.tv_sec = 0;
! 90: attente.tv_nsec = GRANULARITE_us * 1000;
! 91:
! 92: status = 0;
! 93:
! 94: drapeau_interruptions_traitees = d_faux;
! 95: drapeau_objets_traites = d_faux;
! 96:
! 97: if ((*s_etat_processus).debug == d_vrai)
! 98: if (((*s_etat_processus).type_debug &
! 99: d_debug_processus) != 0)
! 100: {
! 101: if ((*s_argument_thread).processus_detache == d_vrai)
! 102: {
! 103: if ((*s_etat_processus).langue == 'F')
! 104: {
! 105: printf("[%d] Lancement du thread de surveillance du"
! 106: " processus %d\n", (int) getpid(),
! 107: (int) (*s_argument_thread).pid);
! 108: }
! 109: else
! 110: {
! 111: printf("[%d] Start monitoring of process %d\n", (int) getpid(),
! 112: (int) (*s_argument_thread).pid);
! 113: }
! 114: }
! 115: else
! 116: {
! 117: if ((*s_etat_processus).langue == 'F')
! 118: {
! 119: printf("[%d] Lancement du thread de surveillance du"
! 120: " thread %llu\n", (int) getpid(), (unsigned long long)
! 121: (*s_argument_thread).tid);
! 122: }
! 123: else
! 124: {
! 125: printf("[%d] Start monitoring of thread %llu\n",
! 126: (int) getpid(), (unsigned long long)
! 127: (*s_argument_thread).tid);
! 128: }
! 129: }
! 130:
! 131: fflush(stdout);
! 132: }
! 133:
! 134: /*
! 135: * On attend une donnée fictive pour être sûr que le processus fils
! 136: * est bien démarré.
! 137: */
! 138:
! 139: while(read_atomic(s_etat_processus,
! 140: (*s_argument_thread).pipe_nombre_objets_attente[0],
! 141: &caractere, sizeof(caractere)) == 0)
! 142: {
! 143: if ((*s_etat_processus).var_volatile_requete_arret != 0)
! 144: {
! 145: drapeau_objets_traites = d_vrai;
! 146: drapeau_interruptions_traitees = d_vrai;
! 147: }
! 148:
! 149: nanosleep(&attente, NULL);
! 150: }
! 151:
! 152: do
! 153: {
! 154: if ((*s_argument_thread).processus_detache == d_vrai)
! 155: {
! 156: /*
! 157: * Le processus est un processus détaché.
! 158: */
! 159:
! 160: // Scrutation de l'envoi de données par le fils.
! 161:
! 162: pid_candidat = 0;
! 163:
! 164: if (drapeau_objets_traites == d_vrai)
! 165: {
! 166: nanosleep(&attente, NULL);
! 167: }
! 168: else if ((iostat = read_atomic(s_etat_processus,
! 169: (*s_argument_thread).pipe_nombre_objets_attente[0],
! 170: &pid_candidat, sizeof(pid_candidat))) == 0)
! 171: {
! 172: // Rien dans le pipe
! 173:
! 174: nanosleep(&attente, NULL);
! 175: }
! 176: else if (iostat != sizeof(pid_candidat))
! 177: {
! 178: (*s_etat_processus).erreur_systeme_processus_fils =
! 179: d_es_processus;
! 180: }
! 181: else
! 182: {
! 183: // Un pid est dans le pipe. On vérifie que les deux pids
! 184: // correspondent.
! 185:
! 186: if (pid_candidat == -2)
! 187: {
! 188: drapeau_objets_traites = d_vrai;
! 189: }
! 190: else if (pid_candidat == -1)
! 191: {
! 192: }
! 193: else if ((iostat = read_atomic(s_etat_processus,
! 194: (*s_argument_thread).pipe_nombre_objets_attente[0],
! 195: &pid_candidat, sizeof(pid_candidat))) ==
! 196: sizeof(pid_candidat))
! 197: {
! 198: if ((*s_argument_thread).pid != pid_candidat)
! 199: {
! 200: (*s_etat_processus).erreur_systeme_processus_fils =
! 201: d_es_processus;
! 202: BUG(1, printf("Spurious process identifier"));
! 203: }
! 204:
! 205: // Un objet supplémentaire est dans le pipe correspondant
! 206: // au processus surveillé par ce thread.
! 207:
! 208: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 209: {
! 210: (*s_etat_processus).erreur_systeme_processus_fils =
! 211: d_es_processus;
! 212: }
! 213: else
! 214: {
! 215: l_element_courant = (struct_liste_chainee *)
! 216: (*s_etat_processus).l_base_pile_processus;
! 217:
! 218: while(l_element_courant != NULL)
! 219: {
! 220: if ((*(*((struct_processus_fils *)
! 221: (*(*l_element_courant).donnee).objet))
! 222: .thread).processus_detache == d_faux)
! 223: {
! 224: l_element_courant = (*l_element_courant)
! 225: .suivant;
! 226: continue;
! 227: }
! 228:
! 229: if ((*(*((struct_processus_fils *)
! 230: (*(*l_element_courant).donnee).objet))
! 231: .thread).pid == pid_candidat)
! 232: {
! 233: if ((*s_etat_processus).debug == d_vrai)
! 234: if (((*s_etat_processus).type_debug &
! 235: d_debug_processus) != 0)
! 236: {
! 237: if ((*s_etat_processus).langue == 'F')
! 238: {
! 239: printf("[%d] Données en provenance "
! 240: "du processus %d\n",
! 241: (int) getpid(),
! 242: (int) (*s_argument_thread).pid);
! 243: fflush(stdout);
! 244: }
! 245: else
! 246: {
! 247: printf("[%d] Data from process %d\n",
! 248: (int) getpid(),
! 249: (int) (*s_argument_thread).pid);
! 250: fflush(stdout);
! 251: }
! 252: }
! 253:
! 254: if (pthread_mutex_lock(
! 255: &((*(*((struct_processus_fils *)
! 256: (*(*l_element_courant).donnee).objet))
! 257: .thread).mutex)) != 0)
! 258: {
! 259: (*s_etat_processus).erreur_systeme =
! 260: d_es_processus;
! 261: }
! 262:
! 263: (*(*((struct_processus_fils *)
! 264: (*(*l_element_courant).donnee).objet))
! 265: .thread).nombre_objets_dans_pipe++;
! 266:
! 267: if (pthread_mutex_unlock(
! 268: &((*(*((struct_processus_fils *)
! 269: (*(*l_element_courant).donnee).objet))
! 270: .thread).mutex)) != 0)
! 271: {
! 272: (*s_etat_processus).erreur_systeme =
! 273: d_es_processus;
! 274: }
! 275:
! 276: while((longueur_ecriture =
! 277: write_atomic(s_etat_processus,
! 278: (*(*((struct_processus_fils *)
! 279: (*(*l_element_courant).donnee).objet))
! 280: .thread).pipe_acquittement[1], "-",
! 281: sizeof(unsigned char))) !=
! 282: sizeof(unsigned char))
! 283: {
! 284: if (longueur_ecriture == -1)
! 285: {
! 286: (*s_etat_processus)
! 287: .erreur_systeme_processus_fils =
! 288: d_es_processus;
! 289: }
! 290: }
! 291:
! 292: if ((*s_etat_processus).debug == d_vrai)
! 293: if (((*s_etat_processus).type_debug &
! 294: d_debug_processus) != 0)
! 295: {
! 296: if ((*s_etat_processus).langue == 'F')
! 297: {
! 298: printf("[%d] Données acquittées "
! 299: "en provenance du "
! 300: "processus %d\n",
! 301: (int) getpid(),
! 302: (int) (*s_argument_thread).pid);
! 303: fflush(stdout);
! 304: }
! 305: else
! 306: {
! 307: printf("[%d] Data acknowklegment "
! 308: "from process %d\n",
! 309: (int) getpid(),
! 310: (int) (*s_argument_thread).pid);
! 311: fflush(stdout);
! 312: }
! 313: }
! 314:
! 315: break;
! 316: }
! 317:
! 318: l_element_courant = (*l_element_courant).suivant;
! 319: }
! 320:
! 321: BUG(l_element_courant == NULL,
! 322: printf("Process or thread not found"));
! 323:
! 324: if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
! 325: != 0)
! 326: {
! 327: (*s_etat_processus).erreur_systeme_processus_fils =
! 328: d_es_processus;
! 329: }
! 330:
! 331: pthread_kill((*s_argument_thread).thread_pere,
! 332: SIGINJECT);
! 333: }
! 334: }
! 335: else
! 336: {
! 337: (*s_etat_processus).erreur_systeme_processus_fils =
! 338: d_es_processus;
! 339: }
! 340: }
! 341:
! 342: // Scrutation de l'envoi d'interruptions par le fils.
! 343:
! 344: if (drapeau_interruptions_traitees == d_vrai)
! 345: {
! 346: nanosleep(&attente, NULL);
! 347: }
! 348: else if ((iostat = read_atomic(s_etat_processus,
! 349: (*s_argument_thread).pipe_nombre_interruptions_attente[0],
! 350: &pid_candidat, sizeof(pid_candidat))) == 0)
! 351: {
! 352: // Rien dans le pipe
! 353:
! 354: nanosleep(&attente, NULL);
! 355: }
! 356: else if (iostat != sizeof(pid_candidat))
! 357: {
! 358: (*s_etat_processus).erreur_systeme_processus_fils =
! 359: d_es_processus;
! 360: }
! 361: else
! 362: {
! 363: // Un pid est dans le pipe. On vérifie que les deux pids
! 364: // correspondent.
! 365:
! 366: if (pid_candidat == -2)
! 367: {
! 368: drapeau_interruptions_traitees = d_vrai;
! 369: }
! 370: else if (pid_candidat == -1)
! 371: {
! 372: }
! 373: else if ((iostat = read_atomic(s_etat_processus,
! 374: (*s_argument_thread).pipe_nombre_interruptions_attente
! 375: [0], &pid_candidat, sizeof(pid_candidat)))
! 376: == sizeof(pid_candidat))
! 377: {
! 378: if ((*s_argument_thread).pid != pid_candidat)
! 379: {
! 380: (*s_etat_processus).erreur_systeme_processus_fils =
! 381: d_es_processus;
! 382: BUG(1, printf("Spurious interrupt"));
! 383: }
! 384:
! 385: // Une interruption supplémentaire est dans le pipe
! 386: // correspondant au processus surveillé par ce thread.
! 387:
! 388: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 389: {
! 390: (*s_etat_processus).erreur_systeme_processus_fils =
! 391: d_es_processus;
! 392: }
! 393: else
! 394: {
! 395: l_element_courant = (struct_liste_chainee *)
! 396: (*s_etat_processus).l_base_pile_processus;
! 397:
! 398: while(l_element_courant != NULL)
! 399: {
! 400: if ((*(*((struct_processus_fils *)
! 401: (*(*l_element_courant).donnee).objet))
! 402: .thread).processus_detache == d_faux)
! 403: {
! 404: l_element_courant = (*l_element_courant)
! 405: .suivant;
! 406: continue;
! 407: }
! 408:
! 409: if ((*(*((struct_processus_fils *)
! 410: (*(*l_element_courant).donnee).objet))
! 411: .thread).pid == pid_candidat)
! 412: {
! 413: if ((*s_etat_processus).debug == d_vrai)
! 414: if (((*s_etat_processus).type_debug &
! 415: d_traitement_interruption) != 0)
! 416: {
! 417: if ((*s_etat_processus).langue == 'F')
! 418: {
! 419: printf("[%d] Interrution logicielle "
! 420: "en provenance du processus "
! 421: "%d\n", (int) getpid(),
! 422: (int) (*s_argument_thread).pid);
! 423: fflush(stdout);
! 424: }
! 425: else
! 426: {
! 427: printf("[%d] Software interrupt "
! 428: "from process %d\n",
! 429: (int) getpid(),
! 430: (int) (*s_argument_thread).pid);
! 431: fflush(stdout);
! 432: }
! 433: }
! 434:
! 435: if (pthread_mutex_lock(
! 436: &((*(*((struct_processus_fils *)
! 437: (*(*l_element_courant).donnee).objet))
! 438: .thread).mutex)) != 0)
! 439: {
! 440: (*s_etat_processus).erreur_systeme =
! 441: d_es_processus;
! 442: }
! 443:
! 444: (*(*((struct_processus_fils *)
! 445: (*(*l_element_courant).donnee)
! 446: .objet)).thread)
! 447: .nombre_interruptions_dans_pipe++;
! 448:
! 449: if (pthread_mutex_unlock(
! 450: &((*(*((struct_processus_fils *)
! 451: (*(*l_element_courant).donnee).objet))
! 452: .thread).mutex)) != 0)
! 453: {
! 454: (*s_etat_processus).erreur_systeme =
! 455: d_es_processus;
! 456: }
! 457:
! 458: (*s_etat_processus)
! 459: .nombre_interruptions_non_affectees++;
! 460:
! 461: while((longueur_ecriture =
! 462: write_atomic(s_etat_processus,
! 463: (*(*((struct_processus_fils *)
! 464: (*(*l_element_courant).donnee).objet))
! 465: .thread).pipe_acquittement[1], "-",
! 466: sizeof(unsigned char))) !=
! 467: sizeof(unsigned char))
! 468: {
! 469: if (longueur_ecriture == -1)
! 470: {
! 471: (*s_etat_processus)
! 472: .erreur_systeme_processus_fils =
! 473: d_es_processus;
! 474: }
! 475: }
! 476:
! 477: if ((*s_etat_processus).debug == d_vrai)
! 478: if (((*s_etat_processus).type_debug &
! 479: d_traitement_interruption) != 0)
! 480: {
! 481: if ((*s_etat_processus).langue == 'F')
! 482: {
! 483: printf("[%d] Interruption logicielle "
! 484: "acquittée en provenance "
! 485: "du processus %d\n",
! 486: (int) getpid(),
! 487: (int) (*s_argument_thread).pid);
! 488: fflush(stdout);
! 489: }
! 490: else
! 491: {
! 492: printf("[%d] Software interrupt "
! 493: "acknowklegment from "
! 494: "process %d\n",
! 495: (int) getpid(),
! 496: (int) (*s_argument_thread).pid);
! 497: fflush(stdout);
! 498: }
! 499: }
! 500:
! 501: break;
! 502: }
! 503:
! 504: l_element_courant = (*l_element_courant).suivant;
! 505: }
! 506:
! 507: BUG(l_element_courant == NULL,
! 508: printf("Process or thread not found"));
! 509:
! 510: if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
! 511: != 0)
! 512: {
! 513: (*s_etat_processus).erreur_systeme_processus_fils =
! 514: d_es_processus;
! 515: }
! 516:
! 517: pthread_kill((*s_argument_thread).thread_pere,
! 518: SIGINJECT);
! 519: }
! 520: }
! 521: else
! 522: {
! 523: (*s_etat_processus).erreur_systeme_processus_fils =
! 524: d_es_processus;
! 525: }
! 526: }
! 527:
! 528: if ((pid = waitpid((*s_argument_thread).pid, &status, WNOHANG)) < 0)
! 529: {
! 530: break;
! 531: }
! 532:
! 533: drapeau_fin_scrutation = (!WIFEXITED(status)) ||
! 534: (!WIFSIGNALED(status)) || (pid == 0);
! 535:
! 536: if (WIFEXITED(status))
! 537: {
! 538: if (WEXITSTATUS(status) == (0xFF & EXIT_FAILURE))
! 539: {
! 540: (*s_etat_processus).erreur_systeme = d_es_processus;
! 541: }
! 542: }
! 543: }
! 544: else
! 545: {
! 546: /*
! 547: * Le processus n'est pas détaché.
! 548: */
! 549:
! 550: // Scrutation de l'envoi de données par le fils.
! 551:
! 552: tid_candidat = (pthread_t) 0;
! 553:
! 554: if (drapeau_objets_traites == d_vrai)
! 555: {
! 556: nanosleep(&attente, NULL);
! 557: }
! 558: else if ((iostat = read_atomic(s_etat_processus,
! 559: (*s_argument_thread).pipe_nombre_objets_attente[0],
! 560: &tid_candidat, sizeof(tid_candidat))) == 0)
! 561: {
! 562: // Rien dans le pipe
! 563:
! 564: nanosleep(&attente, NULL);
! 565: }
! 566: else if (iostat != sizeof(tid_candidat))
! 567: {
! 568: (*s_etat_processus).erreur_systeme_processus_fils =
! 569: d_es_processus;
! 570: }
! 571: else
! 572: {
! 573: // Un pid est dans le pipe. On vérifie que les deux pids
! 574: // correspondent.
! 575:
! 576: if (tid_candidat == (pthread_t) -2)
! 577: {
! 578: drapeau_objets_traites = d_vrai;
! 579: }
! 580: else if (tid_candidat == (pthread_t) -1)
! 581: {
! 582: }
! 583: else if ((iostat = read_atomic(s_etat_processus,
! 584: (*s_argument_thread).pipe_nombre_objets_attente[0],
! 585: &tid_candidat, sizeof(tid_candidat))) ==
! 586: sizeof(tid_candidat))
! 587: {
! 588: if (pthread_equal((*s_argument_thread).tid,
! 589: tid_candidat) == 0)
! 590: {
! 591: (*s_etat_processus).erreur_systeme_processus_fils =
! 592: d_es_processus;
! 593: BUG(1, printf("Spurious thread identifier"));
! 594: }
! 595:
! 596: // Un objet supplémentaire est dans le pipe correspondant
! 597: // au processus surveillé par ce thread.
! 598:
! 599: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 600: {
! 601: (*s_etat_processus).erreur_systeme_processus_fils =
! 602: d_es_processus;
! 603: }
! 604: else
! 605: {
! 606: l_element_courant = (struct_liste_chainee *)
! 607: (*s_etat_processus).l_base_pile_processus;
! 608:
! 609: while(l_element_courant != NULL)
! 610: {
! 611: if ((*(*((struct_processus_fils *)
! 612: (*(*l_element_courant).donnee).objet))
! 613: .thread).processus_detache == d_vrai)
! 614: {
! 615: l_element_courant = (*l_element_courant)
! 616: .suivant;
! 617: continue;
! 618: }
! 619:
! 620: if (pthread_equal((*(*((struct_processus_fils *)
! 621: (*(*l_element_courant).donnee).objet))
! 622: .thread).tid, tid_candidat) != 0)
! 623: {
! 624: if ((*s_etat_processus).debug == d_vrai)
! 625: if (((*s_etat_processus).type_debug &
! 626: d_debug_processus) != 0)
! 627: {
! 628: if ((*s_etat_processus).langue == 'F')
! 629: {
! 630: printf("[%d] Données en provenance "
! 631: "du thread %llu\n",
! 632: (int) getpid(),
! 633: (unsigned long long)
! 634: (*s_argument_thread).tid);
! 635: fflush(stdout);
! 636: }
! 637: else
! 638: {
! 639: printf("[%d] Data from thread %llu\n",
! 640: (int) getpid(),
! 641: (unsigned long long)
! 642: (*s_argument_thread).tid);
! 643: fflush(stdout);
! 644: }
! 645: }
! 646:
! 647: if (pthread_mutex_lock(
! 648: &((*(*((struct_processus_fils *)
! 649: (*(*l_element_courant).donnee).objet))
! 650: .thread).mutex)) != 0)
! 651: {
! 652: (*s_etat_processus).erreur_systeme =
! 653: d_es_processus;
! 654: }
! 655:
! 656: (*(*((struct_processus_fils *)
! 657: (*(*l_element_courant).donnee).objet))
! 658: .thread).nombre_objets_dans_pipe++;
! 659:
! 660: if (pthread_mutex_unlock(
! 661: &((*(*((struct_processus_fils *)
! 662: (*(*l_element_courant).donnee).objet))
! 663: .thread).mutex)) != 0)
! 664: {
! 665: (*s_etat_processus).erreur_systeme =
! 666: d_es_processus;
! 667: }
! 668:
! 669: while((longueur_ecriture =
! 670: write_atomic(s_etat_processus,
! 671: (*(*((struct_processus_fils *)
! 672: (*(*l_element_courant).donnee).objet))
! 673: .thread).pipe_acquittement[1], "-",
! 674: sizeof(unsigned char))) !=
! 675: sizeof(unsigned char))
! 676: {
! 677: if (longueur_ecriture == -1)
! 678: {
! 679: (*s_etat_processus)
! 680: .erreur_systeme_processus_fils =
! 681: d_es_processus;
! 682: }
! 683: }
! 684:
! 685: if ((*s_etat_processus).debug == d_vrai)
! 686: if (((*s_etat_processus).type_debug &
! 687: d_debug_processus) != 0)
! 688: {
! 689: if ((*s_etat_processus).langue == 'F')
! 690: {
! 691: printf("[%d] Données acquittées "
! 692: "en provenance du thread "
! 693: "%llu\n", (int) getpid(),
! 694: (unsigned long long)
! 695: (*s_argument_thread).tid);
! 696: fflush(stdout);
! 697: }
! 698: else
! 699: {
! 700: printf("[%d] Data acknowklegment "
! 701: "from thread %llu\n",
! 702: (int) getpid(),
! 703: (unsigned long long)
! 704: (*s_argument_thread).tid);
! 705: fflush(stdout);
! 706: }
! 707: }
! 708:
! 709: break;
! 710: }
! 711:
! 712: l_element_courant = (*l_element_courant).suivant;
! 713: }
! 714:
! 715: BUG(l_element_courant == NULL,
! 716: printf("Process or thread not found"));
! 717:
! 718: if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
! 719: != 0)
! 720: {
! 721: (*s_etat_processus).erreur_systeme_processus_fils =
! 722: d_es_processus;
! 723: }
! 724: }
! 725: }
! 726: else
! 727: {
! 728: (*s_etat_processus).erreur_systeme_processus_fils =
! 729: d_es_processus;
! 730: }
! 731: }
! 732:
! 733: // Scrutation de l'envoi d'interruptions par le fils.
! 734:
! 735: if (drapeau_interruptions_traitees == d_vrai)
! 736: {
! 737: nanosleep(&attente, NULL);
! 738: }
! 739: else if ((iostat = read_atomic(s_etat_processus,
! 740: (*s_argument_thread).pipe_nombre_interruptions_attente[0],
! 741: &tid_candidat, sizeof(tid_candidat))) == 0)
! 742: {
! 743: // Rien dans le pipe
! 744:
! 745: nanosleep(&attente, NULL);
! 746: }
! 747: else if (iostat != sizeof(tid_candidat))
! 748: {
! 749: (*s_etat_processus).erreur_systeme_processus_fils =
! 750: d_es_processus;
! 751: }
! 752: else
! 753: {
! 754: // Un pid est dans le pipe. On vérifie que les deux pids
! 755: // correspondent.
! 756:
! 757: if (tid_candidat == (pthread_t) -2)
! 758: {
! 759: drapeau_interruptions_traitees = d_vrai;
! 760: }
! 761: else if (tid_candidat == (pthread_t) -1)
! 762: {
! 763: }
! 764: else if ((iostat = read_atomic(s_etat_processus,
! 765: (*s_argument_thread).pipe_nombre_interruptions_attente
! 766: [0], &tid_candidat, sizeof(tid_candidat))) ==
! 767: sizeof(tid_candidat))
! 768: {
! 769: if (pthread_equal((*s_argument_thread).tid,
! 770: tid_candidat) == 0)
! 771: {
! 772: (*s_etat_processus).erreur_systeme_processus_fils =
! 773: d_es_processus;
! 774: BUG(1, printf("Spurious interrupt"));
! 775: }
! 776:
! 777: // Une interruption supplémentaire est dans le pipe
! 778: // correspondant au processus surveillé par ce thread.
! 779:
! 780: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 781: {
! 782: (*s_etat_processus).erreur_systeme_processus_fils =
! 783: d_es_processus;
! 784: }
! 785: else
! 786: {
! 787: l_element_courant = (struct_liste_chainee *)
! 788: (*s_etat_processus).l_base_pile_processus;
! 789:
! 790: while(l_element_courant != NULL)
! 791: {
! 792: if ((*(*((struct_processus_fils *)
! 793: (*(*l_element_courant).donnee).objet))
! 794: .thread).processus_detache == d_vrai)
! 795: {
! 796: l_element_courant = (*l_element_courant)
! 797: .suivant;
! 798: continue;
! 799: }
! 800:
! 801: if (pthread_equal((*(*((struct_processus_fils *)
! 802: (*(*l_element_courant).donnee).objet))
! 803: .thread).tid, tid_candidat) != 0)
! 804: {
! 805: if ((*s_etat_processus).debug == d_vrai)
! 806: if (((*s_etat_processus).type_debug &
! 807: d_debug_processus) != 0)
! 808: {
! 809: if ((*s_etat_processus).langue == 'F')
! 810: {
! 811: printf("[%d] Interrution logicielle "
! 812: "en provenance du thread "
! 813: "%llu\n", (int) getpid(),
! 814: (unsigned long long)
! 815: (*s_argument_thread).tid);
! 816: fflush(stdout);
! 817: }
! 818: else
! 819: {
! 820: printf("[%d] Software interrupt "
! 821: "from thread %llu\n",
! 822: (int) getpid(),
! 823: (unsigned long long)
! 824: (*s_argument_thread).tid);
! 825: fflush(stdout);
! 826: }
! 827: }
! 828:
! 829: if (pthread_mutex_lock(
! 830: &((*(*((struct_processus_fils *)
! 831: (*(*l_element_courant).donnee).objet))
! 832: .thread).mutex)) != 0)
! 833: {
! 834: (*s_etat_processus).erreur_systeme =
! 835: d_es_processus;
! 836: }
! 837:
! 838: (*(*((struct_processus_fils *)
! 839: (*(*l_element_courant).donnee)
! 840: .objet)).thread)
! 841: .nombre_interruptions_dans_pipe++;
! 842:
! 843: if (pthread_mutex_unlock(
! 844: &((*(*((struct_processus_fils *)
! 845: (*(*l_element_courant).donnee).objet))
! 846: .thread).mutex)) != 0)
! 847: {
! 848: (*s_etat_processus).erreur_systeme =
! 849: d_es_processus;
! 850: }
! 851:
! 852: (*s_etat_processus)
! 853: .nombre_interruptions_non_affectees++;
! 854:
! 855: while((longueur_ecriture =
! 856: write_atomic(s_etat_processus,
! 857: (*(*((struct_processus_fils *)
! 858: (*(*l_element_courant).donnee).objet))
! 859: .thread).pipe_acquittement[1], "-",
! 860: sizeof(unsigned char))) !=
! 861: sizeof(unsigned char))
! 862: {
! 863: if (longueur_ecriture == -1)
! 864: {
! 865: (*s_etat_processus)
! 866: .erreur_systeme_processus_fils =
! 867: d_es_processus;
! 868: }
! 869: }
! 870:
! 871: if ((*s_etat_processus).debug == d_vrai)
! 872: if (((*s_etat_processus).type_debug &
! 873: d_traitement_interruption) != 0)
! 874: {
! 875: if ((*s_etat_processus).langue == 'F')
! 876: {
! 877: printf("[%d] Interruption logicielle "
! 878: "acquittée en provenance "
! 879: "du thread %llu\n",
! 880: (int) getpid(),
! 881: (unsigned long long)
! 882: (*s_argument_thread).tid);
! 883: fflush(stdout);
! 884: }
! 885: else
! 886: {
! 887: printf("[%d] Software interrupt "
! 888: "acknowklegment from "
! 889: "thread %llu\n",
! 890: (int) getpid(),
! 891: (unsigned long long)
! 892: (*s_argument_thread).tid);
! 893: fflush(stdout);
! 894: }
! 895: }
! 896:
! 897: break;
! 898: }
! 899:
! 900: l_element_courant = (*l_element_courant).suivant;
! 901: }
! 902:
! 903: BUG(l_element_courant == NULL,
! 904: printf("Process or thread not found"));
! 905:
! 906: if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
! 907: != 0)
! 908: {
! 909: (*s_etat_processus).erreur_systeme_processus_fils =
! 910: d_es_processus;
! 911: }
! 912: }
! 913: }
! 914: else
! 915: {
! 916: (*s_etat_processus).erreur_systeme_processus_fils =
! 917: d_es_processus;
! 918: }
! 919: }
! 920:
! 921: if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)
! 922: {
! 923: (*s_etat_processus).erreur_systeme = d_es_processus;
! 924: }
! 925:
! 926: if ((*s_argument_thread).thread_actif == d_faux)
! 927: {
! 928: if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
! 929: {
! 930: (*s_etat_processus).erreur_systeme = d_es_processus;
! 931: }
! 932:
! 933: pthread_join((*s_argument_thread).tid, NULL);
! 934: drapeau_fin_scrutation = (0 != 0);
! 935: }
! 936: else
! 937: {
! 938: if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
! 939: {
! 940: (*s_etat_processus).erreur_systeme = d_es_processus;
! 941: }
! 942:
! 943: drapeau_fin_scrutation = (0 == 0);
! 944: }
! 945: }
! 946: } while(drapeau_fin_scrutation);
! 947:
! 948: /*
! 949: * Le processus fils est terminé. On s'assure qu'il ne
! 950: * reste plus rien dans les tuyaux...
! 951: */
! 952:
! 953: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 954: {
! 955: (*s_etat_processus).erreur_systeme_processus_fils =
! 956: d_es_processus;
! 957: }
! 958: else
! 959: {
! 960: if ((*s_etat_processus).debug == d_vrai)
! 961: if (((*s_etat_processus).type_debug &
! 962: d_debug_processus) != 0)
! 963: {
! 964: if ((*s_argument_thread).processus_detache == d_vrai)
! 965: {
! 966: if ((*s_etat_processus).langue == 'F')
! 967: {
! 968: printf("[%d] Surveillance des tuyaux du processus %d\n",
! 969: (int) getpid(), (int) (*s_argument_thread).pid);
! 970: fflush(stdout);
! 971: }
! 972: else
! 973: {
! 974: printf("[%d] Check remaining pipes of process %d\n",
! 975: (int) getpid(), (int) (*s_argument_thread).pid);
! 976: fflush(stdout);
! 977: }
! 978: }
! 979: else
! 980: {
! 981: if ((*s_etat_processus).langue == 'F')
! 982: {
! 983: printf("[%d] Surveillance des tuyaux du thread %llu\n",
! 984: (int) getpid(), (unsigned long long)
! 985: (*s_argument_thread).tid);
! 986: fflush(stdout);
! 987: }
! 988: else
! 989: {
! 990: printf("[%d] Check remaining pipes of thread %llu\n",
! 991: (int) getpid(), (unsigned long long)
! 992: (*s_argument_thread).tid);
! 993: fflush(stdout);
! 994: }
! 995: }
! 996: }
! 997:
! 998: l_element_courant = (struct_liste_chainee *)
! 999: (*s_etat_processus).l_base_pile_processus;
! 1000:
! 1001: if (drapeau_objets_traites == d_faux)
! 1002: {
! 1003: if ((*s_argument_thread).processus_detache == d_vrai)
! 1004: {
! 1005: while(l_element_courant != NULL)
! 1006: {
! 1007: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 1008: .donnee).objet)).thread).processus_detache
! 1009: == d_faux)
! 1010: {
! 1011: l_element_courant = (*l_element_courant).suivant;
! 1012: continue;
! 1013: }
! 1014:
! 1015: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 1016: .donnee).objet)).thread).pid ==
! 1017: (*s_argument_thread).pid)
! 1018: {
! 1019: while(read_atomic(s_etat_processus, (*s_argument_thread)
! 1020: .pipe_nombre_objets_attente[0],
! 1021: &pid_candidat, sizeof(pid_candidat)) ==
! 1022: sizeof(pid_candidat))
! 1023: {
! 1024: /*
! 1025: * -1 est renvoyé par l'instruction SWI
! 1026: */
! 1027:
! 1028: if (pid_candidat == -2)
! 1029: {
! 1030: break;
! 1031: }
! 1032: else if (pid_candidat == -1)
! 1033: {
! 1034: }
! 1035: else if (read_atomic(s_etat_processus,
! 1036: (*s_argument_thread)
! 1037: .pipe_nombre_objets_attente[0],
! 1038: &pid_candidat, sizeof(pid_candidat)) ==
! 1039: sizeof(pid_candidat))
! 1040: {
! 1041: if ((*s_etat_processus).debug == d_vrai)
! 1042: if (((*s_etat_processus).type_debug &
! 1043: d_debug_processus) != 0)
! 1044: {
! 1045: if ((*s_etat_processus).langue == 'F')
! 1046: {
! 1047: printf("[%d] Données en provenance du "
! 1048: "processus %d (processus "
! 1049: "arrêté)\n", (int) getpid(),
! 1050: (int) (*s_argument_thread).pid);
! 1051: fflush(stdout);
! 1052: }
! 1053: else
! 1054: {
! 1055: printf("[%d] Data from process %d "
! 1056: "(processus stopped)\n",
! 1057: (int) getpid(),
! 1058: (int) (*s_argument_thread).pid);
! 1059: fflush(stdout);
! 1060: }
! 1061: }
! 1062:
! 1063: if (pthread_mutex_lock(
! 1064: &((*(*((struct_processus_fils *)
! 1065: (*(*l_element_courant).donnee).objet))
! 1066: .thread).mutex)) != 0)
! 1067: {
! 1068: (*s_etat_processus).erreur_systeme =
! 1069: d_es_processus;
! 1070: }
! 1071:
! 1072: (*(*((struct_processus_fils *)
! 1073: (*(*l_element_courant).donnee).objet))
! 1074: .thread).nombre_objets_dans_pipe++;
! 1075:
! 1076: if (pthread_mutex_unlock(
! 1077: &((*(*((struct_processus_fils *)
! 1078: (*(*l_element_courant).donnee).objet))
! 1079: .thread).mutex)) != 0)
! 1080: {
! 1081: (*s_etat_processus).erreur_systeme =
! 1082: d_es_processus;
! 1083: }
! 1084: }
! 1085: }
! 1086:
! 1087: break;
! 1088: }
! 1089:
! 1090: l_element_courant = (*l_element_courant).suivant;
! 1091: }
! 1092: }
! 1093: else
! 1094: {
! 1095: while(l_element_courant != NULL)
! 1096: {
! 1097: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 1098: .donnee).objet)).thread).processus_detache
! 1099: == d_vrai)
! 1100: {
! 1101: l_element_courant = (*l_element_courant).suivant;
! 1102: continue;
! 1103: }
! 1104:
! 1105: if (pthread_equal((*(*((struct_processus_fils *)
! 1106: (*(*l_element_courant).donnee).objet)).thread).tid,
! 1107: (*s_argument_thread).tid) != 0)
! 1108: {
! 1109: while(read_atomic(s_etat_processus, (*s_argument_thread)
! 1110: .pipe_nombre_objets_attente[0],
! 1111: &tid_candidat, sizeof(tid_candidat)) ==
! 1112: sizeof(tid_candidat))
! 1113: {
! 1114: /*
! 1115: * -1 est renvoyé par l'instruction SWI
! 1116: */
! 1117:
! 1118: if (tid_candidat == (pthread_t) -2)
! 1119: {
! 1120: break;
! 1121: }
! 1122: else if (tid_candidat == (pthread_t) -1)
! 1123: {
! 1124: }
! 1125: else if (read_atomic(s_etat_processus,
! 1126: (*s_argument_thread)
! 1127: .pipe_nombre_objets_attente[0],
! 1128: &tid_candidat, sizeof(tid_candidat)) ==
! 1129: sizeof(tid_candidat))
! 1130: {
! 1131: if ((*s_etat_processus).debug == d_vrai)
! 1132: if (((*s_etat_processus).type_debug &
! 1133: d_debug_processus) != 0)
! 1134: {
! 1135: if ((*s_etat_processus).langue == 'F')
! 1136: {
! 1137: printf("[%d] Données en provenance du "
! 1138: "thread %llu (thread "
! 1139: "arrêté)\n", (int) getpid(),
! 1140: (unsigned long long)
! 1141: (*s_argument_thread).tid);
! 1142: fflush(stdout);
! 1143: }
! 1144: else
! 1145: {
! 1146: printf("[%d] Data from thread %llu "
! 1147: "(thread stopped)\n",
! 1148: (int) getpid(),
! 1149: (unsigned long long)
! 1150: (*s_argument_thread).tid);
! 1151: fflush(stdout);
! 1152: }
! 1153: }
! 1154:
! 1155: if (pthread_mutex_lock(
! 1156: &((*(*((struct_processus_fils *)
! 1157: (*(*l_element_courant).donnee).objet))
! 1158: .thread).mutex)) != 0)
! 1159: {
! 1160: (*s_etat_processus).erreur_systeme =
! 1161: d_es_processus;
! 1162: }
! 1163:
! 1164: (*(*((struct_processus_fils *)
! 1165: (*(*l_element_courant).donnee).objet))
! 1166: .thread).nombre_objets_dans_pipe++;
! 1167:
! 1168: if (pthread_mutex_unlock(
! 1169: &((*(*((struct_processus_fils *)
! 1170: (*(*l_element_courant).donnee).objet))
! 1171: .thread).mutex)) != 0)
! 1172: {
! 1173: (*s_etat_processus).erreur_systeme =
! 1174: d_es_processus;
! 1175: }
! 1176: }
! 1177: }
! 1178:
! 1179: break;
! 1180: }
! 1181:
! 1182: l_element_courant = (*l_element_courant).suivant;
! 1183: }
! 1184: }
! 1185: }
! 1186:
! 1187: l_element_courant = (struct_liste_chainee *)
! 1188: (*s_etat_processus).l_base_pile_processus;
! 1189:
! 1190: if (drapeau_interruptions_traitees == d_faux)
! 1191: {
! 1192: if ((*s_argument_thread).processus_detache == d_vrai)
! 1193: {
! 1194: while(l_element_courant != NULL)
! 1195: {
! 1196: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 1197: .donnee).objet)).thread).processus_detache
! 1198: == d_faux)
! 1199: {
! 1200: l_element_courant = (*l_element_courant).suivant;
! 1201: continue;
! 1202: }
! 1203:
! 1204: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 1205: .donnee).objet)).thread).pid ==
! 1206: (*s_argument_thread).pid)
! 1207: {
! 1208: while(read_atomic(s_etat_processus, (*s_argument_thread)
! 1209: .pipe_nombre_interruptions_attente[0],
! 1210: &pid_candidat, sizeof(pid_candidat)) ==
! 1211: sizeof(pid_candidat))
! 1212: {
! 1213: if (pid_candidat == -2)
! 1214: {
! 1215: break;
! 1216: }
! 1217: else if (pid_candidat == -1)
! 1218: {
! 1219: }
! 1220: else if (read_atomic(s_etat_processus,
! 1221: (*s_argument_thread)
! 1222: .pipe_nombre_interruptions_attente[0],
! 1223: &pid_candidat, sizeof(pid_candidat)) ==
! 1224: sizeof(pid_candidat))
! 1225: {
! 1226: if ((*s_etat_processus).debug == d_vrai)
! 1227: if (((*s_etat_processus).type_debug &
! 1228: d_traitement_interruption) != 0)
! 1229: {
! 1230: if ((*s_etat_processus).langue == 'F')
! 1231: {
! 1232: printf("[%d] Interruption logicielle "
! 1233: "en provenance du processus %d"
! 1234: " (processus arrêté)\n",
! 1235: (int) getpid(),
! 1236: (int) (*s_argument_thread).pid);
! 1237: fflush(stdout);
! 1238: }
! 1239: else
! 1240: {
! 1241: printf("[%d] Software interrupt "
! 1242: "from process %d (processus "
! 1243: "stopped)\n", (int) getpid(),
! 1244: (int) (*s_argument_thread).pid);
! 1245: fflush(stdout);
! 1246: }
! 1247: }
! 1248:
! 1249: if (pthread_mutex_lock(
! 1250: &((*(*((struct_processus_fils *)
! 1251: (*(*l_element_courant).donnee).objet))
! 1252: .thread).mutex)) != 0)
! 1253: {
! 1254: (*s_etat_processus).erreur_systeme =
! 1255: d_es_processus;
! 1256: }
! 1257:
! 1258: (*(*((struct_processus_fils *)
! 1259: (*(*l_element_courant).donnee)
! 1260: .objet)).thread)
! 1261: .nombre_interruptions_dans_pipe++;
! 1262:
! 1263: if (pthread_mutex_unlock(
! 1264: &((*(*((struct_processus_fils *)
! 1265: (*(*l_element_courant).donnee).objet))
! 1266: .thread).mutex)) != 0)
! 1267: {
! 1268: (*s_etat_processus).erreur_systeme =
! 1269: d_es_processus;
! 1270: }
! 1271:
! 1272: (*s_etat_processus)
! 1273: .nombre_interruptions_non_affectees++;
! 1274: }
! 1275: }
! 1276:
! 1277: break;
! 1278: }
! 1279:
! 1280: l_element_courant = (*l_element_courant).suivant;
! 1281: }
! 1282: }
! 1283: else
! 1284: {
! 1285: while(l_element_courant != NULL)
! 1286: {
! 1287: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 1288: .donnee).objet)).thread).processus_detache
! 1289: == d_vrai)
! 1290: {
! 1291: l_element_courant = (*l_element_courant).suivant;
! 1292: continue;
! 1293: }
! 1294:
! 1295: if (pthread_equal((*(*((struct_processus_fils *)
! 1296: (*(*l_element_courant).donnee).objet)).thread).tid,
! 1297: (*s_argument_thread).tid) != 0)
! 1298: {
! 1299: while(read_atomic(s_etat_processus, (*s_argument_thread)
! 1300: .pipe_nombre_interruptions_attente[0],
! 1301: &tid_candidat, sizeof(tid_candidat)) ==
! 1302: sizeof(tid_candidat))
! 1303: {
! 1304: if (tid_candidat == (pthread_t) -2)
! 1305: {
! 1306: break;
! 1307: }
! 1308: else if (tid_candidat == (pthread_t) -1)
! 1309: {
! 1310: }
! 1311: else if (read_atomic(s_etat_processus,
! 1312: (*s_argument_thread)
! 1313: .pipe_nombre_interruptions_attente[0],
! 1314: &tid_candidat, sizeof(tid_candidat)) ==
! 1315: sizeof(tid_candidat))
! 1316: {
! 1317: if ((*s_etat_processus).debug == d_vrai)
! 1318: if (((*s_etat_processus).type_debug &
! 1319: d_traitement_interruption) != 0)
! 1320: {
! 1321: if ((*s_etat_processus).langue == 'F')
! 1322: {
! 1323: printf("[%d] Interruption logicielle "
! 1324: "en provenance du thread %llu"
! 1325: " (thread arrêté)\n",
! 1326: (int) getpid(),
! 1327: (unsigned long long)
! 1328: (*s_argument_thread).tid);
! 1329: fflush(stdout);
! 1330: }
! 1331: else
! 1332: {
! 1333: printf("[%d] Software interrupt "
! 1334: "from thread %llu (thread "
! 1335: "stopped)\n", (int) getpid(),
! 1336: (unsigned long long)
! 1337: (*s_argument_thread).tid);
! 1338: fflush(stdout);
! 1339: }
! 1340: }
! 1341:
! 1342: if (pthread_mutex_lock(
! 1343: &((*(*((struct_processus_fils *)
! 1344: (*(*l_element_courant).donnee).objet))
! 1345: .thread).mutex)) != 0)
! 1346: {
! 1347: (*s_etat_processus).erreur_systeme =
! 1348: d_es_processus;
! 1349: }
! 1350:
! 1351: (*(*((struct_processus_fils *)
! 1352: (*(*l_element_courant).donnee)
! 1353: .objet)).thread)
! 1354: .nombre_interruptions_dans_pipe++;
! 1355:
! 1356: if (pthread_mutex_unlock(
! 1357: &((*(*((struct_processus_fils *)
! 1358: (*(*l_element_courant).donnee).objet))
! 1359: .thread).mutex)) != 0)
! 1360: {
! 1361: (*s_etat_processus).erreur_systeme =
! 1362: d_es_processus;
! 1363: }
! 1364:
! 1365: (*s_etat_processus)
! 1366: .nombre_interruptions_non_affectees++;
! 1367: }
! 1368: }
! 1369:
! 1370: break;
! 1371: }
! 1372:
! 1373: l_element_courant = (*l_element_courant).suivant;
! 1374: }
! 1375: }
! 1376: }
! 1377:
! 1378: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 1379: {
! 1380: (*s_etat_processus).erreur_systeme_processus_fils =
! 1381: d_es_processus;
! 1382: }
! 1383: }
! 1384:
! 1385: /*
! 1386: * Traitement des interruptions et des erreurs.
! 1387: */
! 1388:
! 1389: if ((*s_etat_processus).debug == d_vrai)
! 1390: if (((*s_etat_processus).type_debug &
! 1391: d_debug_processus) != 0)
! 1392: {
! 1393: if ((*s_argument_thread).processus_detache == d_vrai)
! 1394: {
! 1395: if ((*s_etat_processus).langue == 'F')
! 1396: {
! 1397: printf("[%d] Récupération des erreurs du processus "
! 1398: "%d\n", (int) getpid(),
! 1399: (int) (*s_argument_thread).pid);
! 1400: fflush(stdout);
! 1401: }
! 1402: else
! 1403: {
! 1404: printf("[%d] Check errors from process %d\n", (int) getpid(),
! 1405: (int) (*s_argument_thread).pid);
! 1406: fflush(stdout);
! 1407: }
! 1408: }
! 1409: else
! 1410: {
! 1411: if ((*s_etat_processus).langue == 'F')
! 1412: {
! 1413: printf("[%d] Récupération des erreurs du thread "
! 1414: "%llu\n", (int) getpid(), (unsigned long long)
! 1415: (*s_argument_thread).tid);
! 1416: fflush(stdout);
! 1417: }
! 1418: else
! 1419: {
! 1420: printf("[%d] Check errors from process %llu\n", (int) getpid(),
! 1421: (unsigned long long) (*s_argument_thread).tid);
! 1422: fflush(stdout);
! 1423: }
! 1424: }
! 1425: }
! 1426:
! 1427: attente.tv_sec = 0;
! 1428: attente.tv_nsec = GRANULARITE_us * 1000;
! 1429:
! 1430: while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0],
! 1431: &((*s_etat_processus).erreur_execution_processus_fils),
! 1432: sizeof((*s_etat_processus).erreur_execution_processus_fils)) !=
! 1433: sizeof((*s_etat_processus).erreur_execution_processus_fils))
! 1434: {
! 1435: nanosleep(&attente, NULL);
! 1436: INCR_GRANULARITE(attente.tv_nsec);
! 1437: }
! 1438:
! 1439: attente.tv_sec = 0;
! 1440: attente.tv_nsec = GRANULARITE_us * 1000;
! 1441:
! 1442: while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0],
! 1443: &tampon_erreur,
! 1444: sizeof((*s_etat_processus).erreur_systeme_processus_fils)) !=
! 1445: sizeof((*s_etat_processus).erreur_systeme_processus_fils))
! 1446: {
! 1447: nanosleep(&attente, NULL);
! 1448: INCR_GRANULARITE(attente.tv_nsec);
! 1449: }
! 1450:
! 1451: (*s_etat_processus).erreur_systeme_processus_fils = tampon_erreur;
! 1452:
! 1453: attente.tv_sec = 0;
! 1454: attente.tv_nsec = GRANULARITE_us * 1000;
! 1455:
! 1456: while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0],
! 1457: &((*s_etat_processus).pid_erreur_processus_fils),
! 1458: sizeof((*s_etat_processus).pid_erreur_processus_fils)) !=
! 1459: sizeof((*s_etat_processus).pid_erreur_processus_fils))
! 1460: {
! 1461: nanosleep(&attente, NULL);
! 1462: INCR_GRANULARITE(attente.tv_nsec);
! 1463: }
! 1464:
! 1465: /*
! 1466: * Si une erreur est déclarée dans le processus fils, le message
! 1467: * d'erreur a déjà été affiché.
! 1468: */
! 1469:
! 1470: if (((*s_etat_processus).erreur_systeme_processus_fils != d_es) ||
! 1471: ((*s_etat_processus).erreur_execution_processus_fils != d_ex))
! 1472: {
! 1473: (*s_etat_processus).erreur_processus_fils = d_vrai;
! 1474: (*s_etat_processus).invalidation_message_erreur = d_vrai;
! 1475: }
! 1476:
! 1477: /*
! 1478: * Retrait du processus de la pile des processus
! 1479: */
! 1480:
! 1481: if (close((*s_argument_thread).pipe_erreurs[0]) != 0)
! 1482: {
! 1483: (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
! 1484: }
! 1485:
! 1486: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 1487: {
! 1488: (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
! 1489: }
! 1490: else
! 1491: {
! 1492: do
! 1493: {
! 1494: drapeau_fin = d_faux;
! 1495: l_element_courant = (struct_liste_chainee *)
! 1496: (*s_etat_processus).l_base_pile_processus;
! 1497: nombre_donnees = -1;
! 1498:
! 1499: while(l_element_courant != NULL)
! 1500: {
! 1501: if ((*s_argument_thread).processus_detache == d_vrai)
! 1502: {
! 1503: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 1504: .donnee).objet)).thread).processus_detache
! 1505: == d_vrai)
! 1506: {
! 1507: if ((*s_argument_thread).pid ==
! 1508: (*(*((struct_processus_fils *)
! 1509: (*(*l_element_courant)
! 1510: .donnee).objet)).thread).pid)
! 1511: {
! 1512: if (pthread_mutex_lock(
! 1513: &((*(*((struct_processus_fils *)
! 1514: (*(*l_element_courant).donnee).objet))
! 1515: .thread).mutex)) != 0)
! 1516: {
! 1517: (*s_etat_processus).erreur_systeme =
! 1518: d_es_processus;
! 1519: }
! 1520:
! 1521: nombre_donnees = (*(*((struct_processus_fils *)
! 1522: (*(*l_element_courant).donnee).objet))
! 1523: .thread).nombre_objets_dans_pipe +
! 1524: (*(*((struct_processus_fils *)
! 1525: (*(*l_element_courant).donnee).objet))
! 1526: .thread).nombre_interruptions_dans_pipe;
! 1527:
! 1528: if (pthread_mutex_unlock(
! 1529: &((*(*((struct_processus_fils *)
! 1530: (*(*l_element_courant).donnee).objet))
! 1531: .thread).mutex)) != 0)
! 1532: {
! 1533: (*s_etat_processus).erreur_systeme =
! 1534: d_es_processus;
! 1535: }
! 1536:
! 1537: break;
! 1538: }
! 1539: }
! 1540: }
! 1541: else
! 1542: {
! 1543: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 1544: .donnee).objet)).thread).processus_detache
! 1545: == d_faux)
! 1546: {
! 1547: if (pthread_equal((*s_argument_thread).tid,
! 1548: (*(*((struct_processus_fils *)
! 1549: (*(*l_element_courant)
! 1550: .donnee).objet)).thread).tid) != 0)
! 1551: {
! 1552: if (pthread_mutex_lock(
! 1553: &((*(*((struct_processus_fils *)
! 1554: (*(*l_element_courant).donnee).objet))
! 1555: .thread).mutex)) != 0)
! 1556: {
! 1557: (*s_etat_processus).erreur_systeme =
! 1558: d_es_processus;
! 1559: }
! 1560:
! 1561: nombre_donnees = (*(*((struct_processus_fils *)
! 1562: (*(*l_element_courant).donnee).objet))
! 1563: .thread).nombre_objets_dans_pipe +
! 1564: (*(*((struct_processus_fils *)
! 1565: (*(*l_element_courant).donnee).objet))
! 1566: .thread).nombre_interruptions_dans_pipe;
! 1567:
! 1568: if (pthread_mutex_unlock(
! 1569: &((*(*((struct_processus_fils *)
! 1570: (*(*l_element_courant).donnee).objet))
! 1571: .thread).mutex)) != 0)
! 1572: {
! 1573: (*s_etat_processus).erreur_systeme =
! 1574: d_es_processus;
! 1575: }
! 1576:
! 1577: break;
! 1578: }
! 1579: }
! 1580: }
! 1581:
! 1582: l_element_courant = (*l_element_courant).suivant;
! 1583: }
! 1584:
! 1585: if (nombre_donnees == -1)
! 1586: {
! 1587: (*s_etat_processus).erreur_systeme_processus_fils =
! 1588: d_es_processus;
! 1589: drapeau_fin = d_vrai;
! 1590: BUG(1, printf("Process or thread not found"));
! 1591: }
! 1592: else if ((nombre_donnees == 0) ||
! 1593: ((*s_etat_processus).var_volatile_requete_arret == -1))
! 1594: {
! 1595: if ((*s_etat_processus).debug == d_vrai)
! 1596: if (((*s_etat_processus).type_debug &
! 1597: d_debug_processus) != 0)
! 1598: {
! 1599: if ((*s_argument_thread).processus_detache == d_vrai)
! 1600: {
! 1601: if ((*s_etat_processus).langue == 'F')
! 1602: {
! 1603: printf("[%d] Fermeture des tuyaux du processus "
! 1604: "%d\n", (int) getpid(), (int)
! 1605: (*s_argument_thread).pid);
! 1606: fflush(stdout);
! 1607: }
! 1608: else
! 1609: {
! 1610: printf("[%d] Close remaining pipes "
! 1611: "of process %d\n", (int) getpid(),
! 1612: (int) (*s_argument_thread).pid);
! 1613: fflush(stdout);
! 1614: }
! 1615: }
! 1616: else
! 1617: {
! 1618: if ((*s_etat_processus).langue == 'F')
! 1619: {
! 1620: printf("[%d] Fermeture des tuyaux du thread "
! 1621: "%llu\n", (int) getpid(),
! 1622: (unsigned long long)
! 1623: (*s_argument_thread).tid);
! 1624: fflush(stdout);
! 1625: }
! 1626: else
! 1627: {
! 1628: printf("[%d] Close remaining pipes "
! 1629: "of thread %llu\n", (int) getpid(),
! 1630: (unsigned long long) (*s_argument_thread)
! 1631: .tid);
! 1632: fflush(stdout);
! 1633: }
! 1634: }
! 1635: }
! 1636:
! 1637: if (close((*s_argument_thread).pipe_objets[0]) != 0)
! 1638: {
! 1639: (*s_etat_processus).erreur_systeme_processus_fils =
! 1640: d_es_processus;
! 1641: }
! 1642:
! 1643: if (close((*s_argument_thread).pipe_acquittement[1]) != 0)
! 1644: {
! 1645: (*s_etat_processus).erreur_systeme_processus_fils =
! 1646: d_es_processus;
! 1647: }
! 1648:
! 1649: if (close((*s_argument_thread).pipe_injections[1]) != 0)
! 1650: {
! 1651: (*s_etat_processus).erreur_systeme_processus_fils =
! 1652: d_es_processus;
! 1653: }
! 1654:
! 1655: if (close((*s_argument_thread).pipe_nombre_injections[1]) != 0)
! 1656: {
! 1657: (*s_etat_processus).erreur_systeme_processus_fils =
! 1658: d_es_processus;
! 1659: }
! 1660:
! 1661: if (close((*s_argument_thread)
! 1662: .pipe_nombre_objets_attente[0]) != 0)
! 1663: {
! 1664: (*s_etat_processus).erreur_systeme_processus_fils =
! 1665: d_es_processus;
! 1666: }
! 1667:
! 1668: if (close((*s_argument_thread)
! 1669: .pipe_interruptions[0]) != 0)
! 1670: {
! 1671: (*s_etat_processus).erreur_systeme_processus_fils =
! 1672: d_es_processus;
! 1673: }
! 1674:
! 1675: if (close((*s_argument_thread)
! 1676: .pipe_nombre_interruptions_attente[0]) != 0)
! 1677: {
! 1678: (*s_etat_processus).erreur_systeme_processus_fils =
! 1679: d_es_processus;
! 1680: }
! 1681:
! 1682: drapeau_fin = d_vrai;
! 1683: }
! 1684: else
! 1685: {
! 1686: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 1687: {
! 1688: (*s_etat_processus).erreur_systeme_processus_fils =
! 1689: d_es_processus;
! 1690: drapeau_fin = d_vrai;
! 1691: }
! 1692:
! 1693: nanosleep(&attente, NULL);
! 1694: INCR_GRANULARITE(attente.tv_nsec);
! 1695:
! 1696: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 1697: {
! 1698: (*s_etat_processus).erreur_systeme_processus_fils =
! 1699: d_es_processus;
! 1700: drapeau_fin = d_vrai;
! 1701: }
! 1702: }
! 1703: } while(drapeau_fin == d_faux);
! 1704:
! 1705: l_element_courant = (struct_liste_chainee *)
! 1706: (*s_etat_processus).l_base_pile_processus;
! 1707: l_element_precedent = NULL;
! 1708:
! 1709: while(l_element_courant != NULL)
! 1710: {
! 1711: drapeau = d_faux;
! 1712:
! 1713: if ((*s_argument_thread).processus_detache ==
! 1714: (*(*((struct_processus_fils *) (*(*l_element_courant)
! 1715: .donnee).objet)).thread).processus_detache)
! 1716: {
! 1717: if ((*s_argument_thread).processus_detache == d_vrai)
! 1718: {
! 1719: if ((*(*((struct_processus_fils *)
! 1720: (*(*l_element_courant).donnee).objet))
! 1721: .thread).pid == (*s_argument_thread).pid)
! 1722: {
! 1723: drapeau = d_vrai;
! 1724: }
! 1725: else
! 1726: {
! 1727: drapeau = d_faux;
! 1728: }
! 1729: }
! 1730: else
! 1731: {
! 1732: if (pthread_equal((*(*((struct_processus_fils *)
! 1733: (*(*l_element_courant).donnee).objet))
! 1734: .thread).tid, (*s_argument_thread).tid) != 0)
! 1735: {
! 1736: drapeau = d_vrai;
! 1737: }
! 1738: else
! 1739: {
! 1740: drapeau = d_faux;
! 1741: }
! 1742: }
! 1743: }
! 1744: else
! 1745: {
! 1746: drapeau = d_faux;
! 1747: }
! 1748:
! 1749: if (drapeau == d_vrai)
! 1750: {
! 1751: if (l_element_precedent == NULL)
! 1752: {
! 1753: (*s_etat_processus).l_base_pile_processus =
! 1754: (*l_element_courant).suivant;
! 1755:
! 1756: free(l_element_courant);
! 1757:
! 1758: l_element_courant = (struct_liste_chainee *)
! 1759: (*s_etat_processus).l_base_pile_processus;
! 1760: }
! 1761: else
! 1762: {
! 1763: (*l_element_precedent).suivant =
! 1764: (*l_element_courant).suivant;
! 1765: free(l_element_courant);
! 1766: }
! 1767:
! 1768: break;
! 1769: }
! 1770: else
! 1771: {
! 1772: l_element_precedent = l_element_courant;
! 1773: l_element_courant = (*l_element_courant).suivant;
! 1774: }
! 1775: }
! 1776:
! 1777: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 1778: {
! 1779: (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
! 1780: }
! 1781: }
! 1782:
! 1783: if ((*s_etat_processus).debug == d_vrai)
! 1784: if (((*s_etat_processus).type_debug &
! 1785: d_debug_processus) != 0)
! 1786: {
! 1787: if ((*s_argument_thread).processus_detache == d_vrai)
! 1788: {
! 1789: if ((*s_etat_processus).langue == 'F')
! 1790: {
! 1791: printf("[%d] Arrêt du thread de surveillance du"
! 1792: " processus %d\n", (int) getpid(),
! 1793: (int) (*s_argument_thread).pid);
! 1794: }
! 1795: else
! 1796: {
! 1797: printf("[%d] Stop monitoring of process %d", (int) getpid(),
! 1798: (int) (*s_argument_thread).pid);
! 1799: }
! 1800: }
! 1801: else
! 1802: {
! 1803: if ((*s_etat_processus).langue == 'F')
! 1804: {
! 1805: printf("[%d] Arrêt du thread de surveillance du"
! 1806: " thread %llu\n", (int) getpid(),
! 1807: (unsigned long long) (*s_argument_thread)
! 1808: .tid);
! 1809: }
! 1810: else
! 1811: {
! 1812: printf("[%d] Stop monitoring of thread %llu", (int) getpid(),
! 1813: (unsigned long long) (*s_argument_thread)
! 1814: .tid);
! 1815: }
! 1816: }
! 1817:
! 1818: fflush(stdout);
! 1819: }
! 1820:
! 1821: retrait_thread_surveillance(s_etat_processus, s_argument_thread);
! 1822:
! 1823: pthread_exit(NULL);
! 1824: }
! 1825:
! 1826:
! 1827: /*
! 1828: ================================================================================
! 1829: Fonction d'écriture dans un pipe
! 1830: ================================================================================
! 1831: Entrées : pointeur sur une structure de description du processus,
! 1832: numéro du pipe et objet à écrire
! 1833: --------------------------------------------------------------------------------
! 1834: Sorties :
! 1835: --------------------------------------------------------------------------------
! 1836: Effets de bord : néant
! 1837: ================================================================================
! 1838: */
! 1839:
! 1840: logical1
! 1841: ecriture_pipe(struct_processus *s_etat_processus, int pipe,
! 1842: struct_objet *s_objet)
! 1843: {
! 1844: struct_liste_chainee *l_element_courant;
! 1845:
! 1846: struct timespec attente;
! 1847:
! 1848: unsigned long i;
! 1849: unsigned long j;
! 1850:
! 1851: size_t longueur;
! 1852: ssize_t longueur_ecriture;
! 1853:
! 1854: if ((*s_objet).type == INT)
! 1855: {
! 1856: attente.tv_sec = 0;
! 1857: attente.tv_nsec = GRANULARITE_us * 1000;
! 1858:
! 1859: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1860: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 1861: sizeof((*s_objet).type))
! 1862: {
! 1863: if (longueur_ecriture == -1)
! 1864: {
! 1865: return(d_erreur);
! 1866: }
! 1867:
! 1868: nanosleep(&attente, NULL);
! 1869: INCR_GRANULARITE(attente.tv_nsec);
! 1870: }
! 1871:
! 1872: attente.tv_sec = 0;
! 1873: attente.tv_nsec = GRANULARITE_us * 1000;
! 1874:
! 1875: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1876: pipe, (integer8 *)
! 1877: (*s_objet).objet, sizeof(integer8))) != sizeof(integer8))
! 1878: {
! 1879: if (longueur_ecriture == -1)
! 1880: {
! 1881: return(d_erreur);
! 1882: }
! 1883:
! 1884: nanosleep(&attente, NULL);
! 1885: INCR_GRANULARITE(attente.tv_nsec);
! 1886: }
! 1887: }
! 1888: else if ((*s_objet).type == REL)
! 1889: {
! 1890: attente.tv_sec = 0;
! 1891: attente.tv_nsec = GRANULARITE_us * 1000;
! 1892:
! 1893: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1894: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 1895: sizeof((*s_objet).type))
! 1896: {
! 1897: if (longueur_ecriture == -1)
! 1898: {
! 1899: return(d_erreur);
! 1900: }
! 1901:
! 1902: nanosleep(&attente, NULL);
! 1903: INCR_GRANULARITE(attente.tv_nsec);
! 1904: }
! 1905:
! 1906: attente.tv_sec = 0;
! 1907: attente.tv_nsec = GRANULARITE_us * 1000;
! 1908:
! 1909: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1910: pipe, (real8 *) (*s_objet).objet, sizeof(real8))) !=
! 1911: sizeof(real8))
! 1912: {
! 1913: if (longueur_ecriture == -1)
! 1914: {
! 1915: return(d_erreur);
! 1916: }
! 1917:
! 1918: nanosleep(&attente, NULL);
! 1919: INCR_GRANULARITE(attente.tv_nsec);
! 1920: }
! 1921: }
! 1922: else if ((*s_objet).type == CPL)
! 1923: {
! 1924: attente.tv_sec = 0;
! 1925: attente.tv_nsec = GRANULARITE_us * 1000;
! 1926:
! 1927: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1928: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 1929: sizeof((*s_objet).type))
! 1930: {
! 1931: if (longueur_ecriture == -1)
! 1932: {
! 1933: return(d_erreur);
! 1934: }
! 1935:
! 1936: nanosleep(&attente, NULL);
! 1937: INCR_GRANULARITE(attente.tv_nsec);
! 1938: }
! 1939:
! 1940: attente.tv_sec = 0;
! 1941: attente.tv_nsec = GRANULARITE_us * 1000;
! 1942:
! 1943: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1944: pipe, (real8 *) (*s_objet).objet, sizeof(complex16)))
! 1945: != sizeof(complex16))
! 1946: {
! 1947: if (longueur_ecriture == -1)
! 1948: {
! 1949: return(d_erreur);
! 1950: }
! 1951:
! 1952: nanosleep(&attente, NULL);
! 1953: INCR_GRANULARITE(attente.tv_nsec);
! 1954: }
! 1955: }
! 1956: else if ((*s_objet).type == VIN)
! 1957: {
! 1958: attente.tv_sec = 0;
! 1959: attente.tv_nsec = GRANULARITE_us * 1000;
! 1960:
! 1961: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1962: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 1963: sizeof((*s_objet).type))
! 1964: {
! 1965: if (longueur_ecriture == -1)
! 1966: {
! 1967: return(d_erreur);
! 1968: }
! 1969:
! 1970: nanosleep(&attente, NULL);
! 1971: INCR_GRANULARITE(attente.tv_nsec);
! 1972: }
! 1973:
! 1974: attente.tv_sec = 0;
! 1975: attente.tv_nsec = GRANULARITE_us * 1000;
! 1976:
! 1977: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 1978: &((*((struct_vecteur *) (*s_objet).objet))
! 1979: .taille), sizeof(unsigned long))) != sizeof(unsigned long))
! 1980: {
! 1981: if (longueur_ecriture == -1)
! 1982: {
! 1983: return(d_erreur);
! 1984: }
! 1985:
! 1986: nanosleep(&attente, NULL);
! 1987: INCR_GRANULARITE(attente.tv_nsec);
! 1988: }
! 1989:
! 1990: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
! 1991: {
! 1992: attente.tv_sec = 0;
! 1993: attente.tv_nsec = GRANULARITE_us * 1000;
! 1994:
! 1995: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 1996: &(((integer8 *) (*((struct_vecteur *) (*s_objet).objet))
! 1997: .tableau)[i]), sizeof(integer8))) != sizeof(integer8))
! 1998: {
! 1999: if (longueur_ecriture == -1)
! 2000: {
! 2001: return(d_erreur);
! 2002: }
! 2003:
! 2004: nanosleep(&attente, NULL);
! 2005: INCR_GRANULARITE(attente.tv_nsec);
! 2006: }
! 2007: }
! 2008: }
! 2009: else if ((*s_objet).type == VRL)
! 2010: {
! 2011: attente.tv_sec = 0;
! 2012: attente.tv_nsec = GRANULARITE_us * 1000;
! 2013:
! 2014: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2015: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2016: sizeof((*s_objet).type))
! 2017: {
! 2018: if (longueur_ecriture == -1)
! 2019: {
! 2020: return(d_erreur);
! 2021: }
! 2022:
! 2023: nanosleep(&attente, NULL);
! 2024: INCR_GRANULARITE(attente.tv_nsec);
! 2025: }
! 2026:
! 2027: attente.tv_sec = 0;
! 2028: attente.tv_nsec = GRANULARITE_us * 1000;
! 2029:
! 2030: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2031: &((*((struct_vecteur *) (*s_objet).objet))
! 2032: .taille), sizeof(unsigned long))) != sizeof(unsigned long))
! 2033: {
! 2034: if (longueur_ecriture == -1)
! 2035: {
! 2036: return(d_erreur);
! 2037: }
! 2038:
! 2039: nanosleep(&attente, NULL);
! 2040: INCR_GRANULARITE(attente.tv_nsec);
! 2041: }
! 2042:
! 2043: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
! 2044: {
! 2045: attente.tv_sec = 0;
! 2046: attente.tv_nsec = GRANULARITE_us * 1000;
! 2047:
! 2048: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2049: &(((real8 *) (*((struct_vecteur *) (*s_objet).objet))
! 2050: .tableau)[i]), sizeof(real8))) != sizeof(real8))
! 2051: {
! 2052: if (longueur_ecriture == -1)
! 2053: {
! 2054: return(d_erreur);
! 2055: }
! 2056:
! 2057: nanosleep(&attente, NULL);
! 2058: INCR_GRANULARITE(attente.tv_nsec);
! 2059: }
! 2060: }
! 2061: }
! 2062: else if ((*s_objet).type == VCX)
! 2063: {
! 2064: attente.tv_sec = 0;
! 2065: attente.tv_nsec = GRANULARITE_us * 1000;
! 2066:
! 2067: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2068: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2069: sizeof((*s_objet).type))
! 2070: {
! 2071: if (longueur_ecriture == -1)
! 2072: {
! 2073: return(d_erreur);
! 2074: }
! 2075:
! 2076: nanosleep(&attente, NULL);
! 2077: INCR_GRANULARITE(attente.tv_nsec);
! 2078: }
! 2079:
! 2080: attente.tv_sec = 0;
! 2081: attente.tv_nsec = GRANULARITE_us * 1000;
! 2082:
! 2083: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2084: &((*((struct_vecteur *) (*s_objet).objet))
! 2085: .taille), sizeof(unsigned long))) != sizeof(unsigned long))
! 2086: {
! 2087: if (longueur_ecriture == -1)
! 2088: {
! 2089: return(d_erreur);
! 2090: }
! 2091:
! 2092: nanosleep(&attente, NULL);
! 2093: INCR_GRANULARITE(attente.tv_nsec);
! 2094: }
! 2095:
! 2096: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
! 2097: {
! 2098: attente.tv_sec = 0;
! 2099: attente.tv_nsec = GRANULARITE_us * 1000;
! 2100:
! 2101: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2102: &(((complex16 *) (*((struct_vecteur *) (*s_objet).objet))
! 2103: .tableau)[i]), sizeof(complex16))) != sizeof(complex16))
! 2104: {
! 2105: if (longueur_ecriture == -1)
! 2106: {
! 2107: return(d_erreur);
! 2108: }
! 2109:
! 2110: nanosleep(&attente, NULL);
! 2111: INCR_GRANULARITE(attente.tv_nsec);
! 2112: }
! 2113: }
! 2114: }
! 2115: else if ((*s_objet).type == MIN)
! 2116: {
! 2117: attente.tv_sec = 0;
! 2118: attente.tv_nsec = GRANULARITE_us * 1000;
! 2119:
! 2120: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2121: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2122: sizeof((*s_objet).type))
! 2123: {
! 2124: if (longueur_ecriture == -1)
! 2125: {
! 2126: return(d_erreur);
! 2127: }
! 2128:
! 2129: nanosleep(&attente, NULL);
! 2130: INCR_GRANULARITE(attente.tv_nsec);
! 2131: }
! 2132:
! 2133: attente.tv_sec = 0;
! 2134: attente.tv_nsec = GRANULARITE_us * 1000;
! 2135:
! 2136: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2137: &((*((struct_matrice *) (*s_objet).objet)).nombre_lignes),
! 2138: sizeof(unsigned long))) != sizeof(unsigned long))
! 2139: {
! 2140: if (longueur_ecriture == -1)
! 2141: {
! 2142: return(d_erreur);
! 2143: }
! 2144:
! 2145: nanosleep(&attente, NULL);
! 2146: INCR_GRANULARITE(attente.tv_nsec);
! 2147: }
! 2148:
! 2149: attente.tv_sec = 0;
! 2150: attente.tv_nsec = GRANULARITE_us * 1000;
! 2151:
! 2152: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2153: &((*((struct_matrice *) (*s_objet).objet)).nombre_colonnes),
! 2154: sizeof(unsigned long))) != sizeof(unsigned long))
! 2155: {
! 2156: if (longueur_ecriture == -1)
! 2157: {
! 2158: return(d_erreur);
! 2159: }
! 2160:
! 2161: nanosleep(&attente, NULL);
! 2162: INCR_GRANULARITE(attente.tv_nsec);
! 2163: }
! 2164:
! 2165: for(i = 0; i < (*((struct_matrice *)
! 2166: (*s_objet).objet)).nombre_lignes; i++)
! 2167: {
! 2168: for(j = 0; j < (*((struct_matrice *)
! 2169: (*s_objet).objet)).nombre_colonnes; j++)
! 2170: {
! 2171: attente.tv_sec = 0;
! 2172: attente.tv_nsec = GRANULARITE_us * 1000;
! 2173:
! 2174: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2175: &(((integer8 **) (*((struct_matrice *)
! 2176: (*s_objet).objet)).tableau)[i][j]),
! 2177: sizeof(integer8))) != sizeof(integer8))
! 2178: {
! 2179: if (longueur_ecriture == -1)
! 2180: {
! 2181: return(d_erreur);
! 2182: }
! 2183:
! 2184: nanosleep(&attente, NULL);
! 2185: INCR_GRANULARITE(attente.tv_nsec);
! 2186: }
! 2187: }
! 2188: }
! 2189: }
! 2190: else if ((*s_objet).type == MRL)
! 2191: {
! 2192: attente.tv_sec = 0;
! 2193: attente.tv_nsec = GRANULARITE_us * 1000;
! 2194:
! 2195: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2196: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2197: sizeof((*s_objet).type))
! 2198: {
! 2199: if (longueur_ecriture == -1)
! 2200: {
! 2201: return(d_erreur);
! 2202: }
! 2203:
! 2204: nanosleep(&attente, NULL);
! 2205: INCR_GRANULARITE(attente.tv_nsec);
! 2206: }
! 2207:
! 2208: attente.tv_sec = 0;
! 2209: attente.tv_nsec = GRANULARITE_us * 1000;
! 2210:
! 2211: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2212: &((*((struct_matrice *) (*s_objet).objet)).nombre_lignes),
! 2213: sizeof(unsigned long))) != sizeof(unsigned long))
! 2214: {
! 2215: if (longueur_ecriture == -1)
! 2216: {
! 2217: return(d_erreur);
! 2218: }
! 2219:
! 2220: nanosleep(&attente, NULL);
! 2221: INCR_GRANULARITE(attente.tv_nsec);
! 2222: }
! 2223:
! 2224: attente.tv_sec = 0;
! 2225: attente.tv_nsec = GRANULARITE_us * 1000;
! 2226:
! 2227: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2228: &((*((struct_matrice *) (*s_objet).objet)).nombre_colonnes),
! 2229: sizeof(unsigned long))) != sizeof(unsigned long))
! 2230: {
! 2231: if (longueur_ecriture == -1)
! 2232: {
! 2233: return(d_erreur);
! 2234: }
! 2235:
! 2236: nanosleep(&attente, NULL);
! 2237: INCR_GRANULARITE(attente.tv_nsec);
! 2238: }
! 2239:
! 2240: for(i = 0; i < (*((struct_matrice *)
! 2241: (*s_objet).objet)).nombre_lignes; i++)
! 2242: {
! 2243: for(j = 0; j < (*((struct_matrice *)
! 2244: (*s_objet).objet)).nombre_colonnes; j++)
! 2245: {
! 2246: attente.tv_sec = 0;
! 2247: attente.tv_nsec = GRANULARITE_us * 1000;
! 2248:
! 2249: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2250: &(((real8 **) (*((struct_matrice *)
! 2251: (*s_objet).objet)).tableau)[i][j]),
! 2252: sizeof(real8))) != sizeof(real8))
! 2253: {
! 2254: if (longueur_ecriture == -1)
! 2255: {
! 2256: return(d_erreur);
! 2257: }
! 2258:
! 2259: nanosleep(&attente, NULL);
! 2260: INCR_GRANULARITE(attente.tv_nsec);
! 2261: }
! 2262: }
! 2263: }
! 2264: }
! 2265: else if ((*s_objet).type == MCX)
! 2266: {
! 2267: attente.tv_sec = 0;
! 2268: attente.tv_nsec = GRANULARITE_us * 1000;
! 2269:
! 2270: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2271: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2272: sizeof((*s_objet).type))
! 2273: {
! 2274: if (longueur_ecriture == -1)
! 2275: {
! 2276: return(d_erreur);
! 2277: }
! 2278:
! 2279: nanosleep(&attente, NULL);
! 2280: INCR_GRANULARITE(attente.tv_nsec);
! 2281: }
! 2282:
! 2283: attente.tv_sec = 0;
! 2284: attente.tv_nsec = GRANULARITE_us * 1000;
! 2285:
! 2286: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2287: &((*((struct_matrice *) (*s_objet).objet)).nombre_lignes),
! 2288: sizeof(unsigned long))) != sizeof(unsigned long))
! 2289: {
! 2290: if (longueur_ecriture == -1)
! 2291: {
! 2292: return(d_erreur);
! 2293: }
! 2294:
! 2295: nanosleep(&attente, NULL);
! 2296: INCR_GRANULARITE(attente.tv_nsec);
! 2297: }
! 2298:
! 2299: attente.tv_sec = 0;
! 2300: attente.tv_nsec = GRANULARITE_us * 1000;
! 2301:
! 2302: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2303: &((*((struct_matrice *) (*s_objet).objet)).nombre_colonnes),
! 2304: sizeof(unsigned long))) != sizeof(unsigned long))
! 2305: {
! 2306: if (longueur_ecriture == -1)
! 2307: {
! 2308: return(d_erreur);
! 2309: }
! 2310:
! 2311: nanosleep(&attente, NULL);
! 2312: INCR_GRANULARITE(attente.tv_nsec);
! 2313: }
! 2314:
! 2315: for(i = 0; i < (*((struct_matrice *)
! 2316: (*s_objet).objet)).nombre_lignes; i++)
! 2317: {
! 2318: for(j = 0; j < (*((struct_matrice *)
! 2319: (*s_objet).objet)).nombre_colonnes; j++)
! 2320: {
! 2321: attente.tv_sec = 0;
! 2322: attente.tv_nsec = GRANULARITE_us * 1000;
! 2323:
! 2324: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2325: &(((complex16 **) (*((struct_matrice *)
! 2326: (*s_objet).objet)).tableau)[i][j]),
! 2327: sizeof(complex16))) != sizeof(complex16))
! 2328: {
! 2329: if (longueur_ecriture == -1)
! 2330: {
! 2331: return(d_erreur);
! 2332: }
! 2333:
! 2334: nanosleep(&attente, NULL);
! 2335: INCR_GRANULARITE(attente.tv_nsec);
! 2336: }
! 2337: }
! 2338: }
! 2339: }
! 2340: else if ((*s_objet).type == BIN)
! 2341: {
! 2342: attente.tv_sec = 0;
! 2343: attente.tv_nsec = GRANULARITE_us * 1000;
! 2344:
! 2345: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2346: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2347: sizeof((*s_objet).type))
! 2348: {
! 2349: if (longueur_ecriture == -1)
! 2350: {
! 2351: return(d_erreur);
! 2352: }
! 2353:
! 2354: nanosleep(&attente, NULL);
! 2355: INCR_GRANULARITE(attente.tv_nsec);
! 2356: }
! 2357:
! 2358: attente.tv_sec = 0;
! 2359: attente.tv_nsec = GRANULARITE_us * 1000;
! 2360:
! 2361: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2362: (integer8 *) (*s_objet).objet,
! 2363: sizeof(integer8))) != sizeof(integer8))
! 2364: {
! 2365: if (longueur_ecriture == -1)
! 2366: {
! 2367: return(d_erreur);
! 2368: }
! 2369:
! 2370: nanosleep(&attente, NULL);
! 2371: INCR_GRANULARITE(attente.tv_nsec);
! 2372: }
! 2373: }
! 2374: else if ((*s_objet).type == NOM)
! 2375: {
! 2376: attente.tv_sec = 0;
! 2377: attente.tv_nsec = GRANULARITE_us * 1000;
! 2378:
! 2379: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2380: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2381: sizeof((*s_objet).type))
! 2382: {
! 2383: if (longueur_ecriture == -1)
! 2384: {
! 2385: return(d_erreur);
! 2386: }
! 2387:
! 2388: nanosleep(&attente, NULL);
! 2389: INCR_GRANULARITE(attente.tv_nsec);
! 2390: }
! 2391:
! 2392: longueur = strlen((*((struct_nom *) (*s_objet).objet)).nom) + 1;
! 2393:
! 2394: attente.tv_sec = 0;
! 2395: attente.tv_nsec = GRANULARITE_us * 1000;
! 2396:
! 2397: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2398: pipe, &longueur, sizeof(size_t))) != sizeof(size_t))
! 2399: {
! 2400: if (longueur_ecriture == -1)
! 2401: {
! 2402: return(d_erreur);
! 2403: }
! 2404:
! 2405: nanosleep(&attente, NULL);
! 2406: INCR_GRANULARITE(attente.tv_nsec);
! 2407: }
! 2408:
! 2409: attente.tv_sec = 0;
! 2410: attente.tv_nsec = GRANULARITE_us * 1000;
! 2411:
! 2412: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2413: (*((struct_nom *) (*s_objet).objet)).nom,
! 2414: longueur)) != (ssize_t) longueur)
! 2415: {
! 2416: if (longueur_ecriture == -1)
! 2417: {
! 2418: return(d_erreur);
! 2419: }
! 2420:
! 2421: nanosleep(&attente, NULL);
! 2422: INCR_GRANULARITE(attente.tv_nsec);
! 2423: }
! 2424:
! 2425: attente.tv_sec = 0;
! 2426: attente.tv_nsec = GRANULARITE_us * 1000;
! 2427:
! 2428: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2429: &((*((struct_nom *) (*s_objet).objet))
! 2430: .symbole), sizeof(logical1))) != sizeof(logical1))
! 2431: {
! 2432: if (longueur_ecriture == -1)
! 2433: {
! 2434: return(d_erreur);
! 2435: }
! 2436:
! 2437: nanosleep(&attente, NULL);
! 2438: INCR_GRANULARITE(attente.tv_nsec);
! 2439: }
! 2440: }
! 2441: else if ((*s_objet).type == FCT)
! 2442: {
! 2443: attente.tv_sec = 0;
! 2444: attente.tv_nsec = GRANULARITE_us * 1000;
! 2445:
! 2446: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2447: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2448: sizeof((*s_objet).type))
! 2449: {
! 2450: if (longueur_ecriture == -1)
! 2451: {
! 2452: return(d_erreur);
! 2453: }
! 2454:
! 2455: nanosleep(&attente, NULL);
! 2456: INCR_GRANULARITE(attente.tv_nsec);
! 2457: }
! 2458:
! 2459: longueur = strlen((*((struct_fonction *)
! 2460: (*s_objet).objet)).nom_fonction) + 1;
! 2461:
! 2462: attente.tv_sec = 0;
! 2463: attente.tv_nsec = GRANULARITE_us * 1000;
! 2464:
! 2465: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2466: pipe, &longueur, sizeof(size_t))) != sizeof(size_t))
! 2467: {
! 2468: if (longueur_ecriture == -1)
! 2469: {
! 2470: return(d_erreur);
! 2471: }
! 2472:
! 2473: nanosleep(&attente, NULL);
! 2474: INCR_GRANULARITE(attente.tv_nsec);
! 2475: }
! 2476:
! 2477: attente.tv_sec = 0;
! 2478: attente.tv_nsec = GRANULARITE_us * 1000;
! 2479:
! 2480: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2481: (*((struct_fonction *) (*s_objet).objet))
! 2482: .nom_fonction, longueur)) != (ssize_t) longueur)
! 2483: {
! 2484: if (longueur_ecriture == -1)
! 2485: {
! 2486: return(d_erreur);
! 2487: }
! 2488:
! 2489: nanosleep(&attente, NULL);
! 2490: INCR_GRANULARITE(attente.tv_nsec);
! 2491: }
! 2492:
! 2493: attente.tv_sec = 0;
! 2494: attente.tv_nsec = GRANULARITE_us * 1000;
! 2495:
! 2496: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2497: &((*((struct_fonction *) (*s_objet).objet)).nombre_arguments),
! 2498: sizeof(unsigned long))) != sizeof(unsigned long))
! 2499: {
! 2500: if (longueur_ecriture == -1)
! 2501: {
! 2502: return(d_erreur);
! 2503: }
! 2504:
! 2505: nanosleep(&attente, NULL);
! 2506: INCR_GRANULARITE(attente.tv_nsec);
! 2507: }
! 2508: }
! 2509: else if ((*s_objet).type == CHN)
! 2510: {
! 2511: attente.tv_sec = 0;
! 2512: attente.tv_nsec = GRANULARITE_us * 1000;
! 2513:
! 2514: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2515: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2516: sizeof((*s_objet).type))
! 2517: {
! 2518: if (longueur_ecriture == -1)
! 2519: {
! 2520: return(d_erreur);
! 2521: }
! 2522:
! 2523: nanosleep(&attente, NULL);
! 2524: INCR_GRANULARITE(attente.tv_nsec);
! 2525: }
! 2526:
! 2527: longueur = strlen((unsigned char *) (*s_objet).objet) + 1;
! 2528:
! 2529: attente.tv_sec = 0;
! 2530: attente.tv_nsec = GRANULARITE_us * 1000;
! 2531:
! 2532: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2533: pipe, &longueur, sizeof(size_t))) != sizeof(size_t))
! 2534: {
! 2535: if (longueur_ecriture == -1)
! 2536: {
! 2537: return(d_erreur);
! 2538: }
! 2539:
! 2540: nanosleep(&attente, NULL);
! 2541: INCR_GRANULARITE(attente.tv_nsec);
! 2542: }
! 2543:
! 2544: attente.tv_sec = 0;
! 2545: attente.tv_nsec = GRANULARITE_us * 1000;
! 2546:
! 2547: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2548: (unsigned char *) (*s_objet).objet,
! 2549: longueur)) != (ssize_t) longueur)
! 2550: {
! 2551: if (longueur_ecriture == -1)
! 2552: {
! 2553: return(d_erreur);
! 2554: }
! 2555:
! 2556: nanosleep(&attente, NULL);
! 2557: INCR_GRANULARITE(attente.tv_nsec);
! 2558: }
! 2559: }
! 2560: else if (((*s_objet).type == LST) ||
! 2561: ((*s_objet).type == ALG) ||
! 2562: ((*s_objet).type == RPN))
! 2563: {
! 2564: attente.tv_sec = 0;
! 2565: attente.tv_nsec = GRANULARITE_us * 1000;
! 2566:
! 2567: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2568: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2569: sizeof((*s_objet).type))
! 2570: {
! 2571: if (longueur_ecriture == -1)
! 2572: {
! 2573: return(d_erreur);
! 2574: }
! 2575:
! 2576: nanosleep(&attente, NULL);
! 2577: INCR_GRANULARITE(attente.tv_nsec);
! 2578: }
! 2579:
! 2580: l_element_courant = (*s_objet).objet;
! 2581: i = 0;
! 2582:
! 2583: while(l_element_courant != NULL)
! 2584: {
! 2585: i++;
! 2586: l_element_courant = (*l_element_courant).suivant;
! 2587: }
! 2588:
! 2589: attente.tv_sec = 0;
! 2590: attente.tv_nsec = GRANULARITE_us * 1000;
! 2591:
! 2592: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2593: pipe, &i, sizeof(i))) != sizeof(i))
! 2594: {
! 2595: if (longueur_ecriture == -1)
! 2596: {
! 2597: return(d_erreur);
! 2598: }
! 2599:
! 2600: nanosleep(&attente, NULL);
! 2601: INCR_GRANULARITE(attente.tv_nsec);
! 2602: }
! 2603:
! 2604: l_element_courant = (*s_objet).objet;
! 2605:
! 2606: while(l_element_courant != NULL)
! 2607: {
! 2608: if (ecriture_pipe(s_etat_processus, pipe,
! 2609: (*l_element_courant).donnee) == d_erreur)
! 2610: {
! 2611: return(d_erreur);
! 2612: }
! 2613:
! 2614: l_element_courant = (*l_element_courant).suivant;
! 2615: }
! 2616: }
! 2617: else if ((*s_objet).type == TBL)
! 2618: {
! 2619: attente.tv_sec = 0;
! 2620: attente.tv_nsec = GRANULARITE_us * 1000;
! 2621:
! 2622: while((longueur_ecriture = write_atomic(s_etat_processus,
! 2623: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
! 2624: sizeof((*s_objet).type))
! 2625: {
! 2626: if (longueur_ecriture == -1)
! 2627: {
! 2628: return(d_erreur);
! 2629: }
! 2630:
! 2631: nanosleep(&attente, NULL);
! 2632: INCR_GRANULARITE(attente.tv_nsec);
! 2633: }
! 2634:
! 2635: attente.tv_sec = 0;
! 2636: attente.tv_nsec = GRANULARITE_us * 1000;
! 2637:
! 2638: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
! 2639: &((*((struct_tableau *) (*s_objet).objet)).nombre_elements),
! 2640: sizeof(unsigned long))) != sizeof(unsigned long))
! 2641: {
! 2642: if (longueur_ecriture == -1)
! 2643: {
! 2644: return(d_erreur);
! 2645: }
! 2646:
! 2647: nanosleep(&attente, NULL);
! 2648: INCR_GRANULARITE(attente.tv_nsec);
! 2649: }
! 2650:
! 2651: for(i = 0; i < (*((struct_tableau *)
! 2652: (*s_objet).objet)).nombre_elements; i++)
! 2653: {
! 2654: if (ecriture_pipe(s_etat_processus, pipe,
! 2655: (*((struct_tableau *) (*s_objet).objet)).elements[i])
! 2656: == d_erreur)
! 2657: {
! 2658: return(d_erreur);
! 2659: }
! 2660: }
! 2661: }
! 2662: else
! 2663: {
! 2664: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 2665: return(d_erreur);
! 2666: }
! 2667:
! 2668: return(d_absence_erreur);
! 2669: }
! 2670:
! 2671:
! 2672: /*
! 2673: ================================================================================
! 2674: Fonction de lecture dans un pipe
! 2675: ================================================================================
! 2676: Entrées : pointeur sur une structure de description du processus,
! 2677: numéro du pipe et objet à écrire
! 2678: --------------------------------------------------------------------------------
! 2679: Sorties :
! 2680: --------------------------------------------------------------------------------
! 2681: Effets de bord : néant
! 2682: ================================================================================
! 2683: */
! 2684:
! 2685: struct_objet *
! 2686: lecture_pipe(struct_processus *s_etat_processus, int pipe)
! 2687: {
! 2688: size_t longueur;
! 2689:
! 2690: struct_liste_chainee *l_element_courant;
! 2691:
! 2692: struct_objet *s_objet;
! 2693:
! 2694: struct timespec attente;
! 2695:
! 2696: unsigned long i;
! 2697: unsigned long j;
! 2698:
! 2699: if ((s_objet = allocation(s_etat_processus, NON)) == NULL)
! 2700: {
! 2701: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2702: return(NULL);
! 2703: }
! 2704:
! 2705: attente.tv_sec = 0;
! 2706: attente.tv_nsec = GRANULARITE_us * 1000;
! 2707:
! 2708: while(read_atomic(s_etat_processus, pipe, &((*s_objet).type),
! 2709: sizeof((*s_objet).type)) != sizeof((*s_objet).type))
! 2710: {
! 2711: nanosleep(&attente, NULL);
! 2712: INCR_GRANULARITE(attente.tv_nsec);
! 2713: }
! 2714:
! 2715: if ((*s_objet).type == INT)
! 2716: {
! 2717: if (((*s_objet).objet = malloc(sizeof(integer8))) == NULL)
! 2718: {
! 2719: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2720: return(NULL);
! 2721: }
! 2722:
! 2723: attente.tv_sec = 0;
! 2724: attente.tv_nsec = GRANULARITE_us * 1000;
! 2725:
! 2726: while(read_atomic(s_etat_processus, pipe,
! 2727: (*s_objet).objet, sizeof(integer8)) != sizeof(integer8))
! 2728: {
! 2729: nanosleep(&attente, NULL);
! 2730: INCR_GRANULARITE(attente.tv_nsec);
! 2731: }
! 2732: }
! 2733: else if ((*s_objet).type == REL)
! 2734: {
! 2735: if (((*s_objet).objet = malloc(sizeof(real8))) == NULL)
! 2736: {
! 2737: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2738: return(NULL);
! 2739: }
! 2740:
! 2741: attente.tv_sec = 0;
! 2742: attente.tv_nsec = GRANULARITE_us * 1000;
! 2743:
! 2744: while(read_atomic(s_etat_processus, pipe,
! 2745: (*s_objet).objet, sizeof(real8)) != sizeof(real8))
! 2746: {
! 2747: nanosleep(&attente, NULL);
! 2748: INCR_GRANULARITE(attente.tv_nsec);
! 2749: }
! 2750: }
! 2751: else if ((*s_objet).type == CPL)
! 2752: {
! 2753: if (((*s_objet).objet = malloc(sizeof(complex16))) == NULL)
! 2754: {
! 2755: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2756: return(NULL);
! 2757: }
! 2758:
! 2759: attente.tv_sec = 0;
! 2760: attente.tv_nsec = GRANULARITE_us * 1000;
! 2761:
! 2762: while(read_atomic(s_etat_processus, pipe,
! 2763: (*s_objet).objet, sizeof(complex16)) != sizeof(complex16))
! 2764: {
! 2765: nanosleep(&attente, NULL);
! 2766: INCR_GRANULARITE(attente.tv_nsec);
! 2767: }
! 2768: }
! 2769: else if ((*s_objet).type == VIN)
! 2770: {
! 2771: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
! 2772: {
! 2773: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2774: return(NULL);
! 2775: }
! 2776:
! 2777: (*((struct_vecteur *) (*s_objet).objet)).type = 'I';
! 2778:
! 2779: attente.tv_sec = 0;
! 2780: attente.tv_nsec = GRANULARITE_us * 1000;
! 2781:
! 2782: while(read_atomic(s_etat_processus, pipe, &((*((struct_vecteur *)
! 2783: (*s_objet).objet)).taille),
! 2784: sizeof(unsigned long)) != sizeof(unsigned long))
! 2785: {
! 2786: nanosleep(&attente, NULL);
! 2787: INCR_GRANULARITE(attente.tv_nsec);
! 2788: }
! 2789:
! 2790: if (((*((struct_vecteur *) (*s_objet).objet)).tableau =
! 2791: malloc((*((struct_vecteur *) (*s_objet).objet)).taille *
! 2792: sizeof(integer8))) == NULL)
! 2793: {
! 2794: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2795: return(NULL);
! 2796: }
! 2797:
! 2798: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
! 2799: {
! 2800: attente.tv_sec = 0;
! 2801: attente.tv_nsec = GRANULARITE_us * 1000;
! 2802:
! 2803: while(read_atomic(s_etat_processus, pipe,
! 2804: &(((integer8 *) (*((struct_vecteur *)
! 2805: (*s_objet).objet)).tableau)[i]), sizeof(integer8)) !=
! 2806: sizeof(integer8))
! 2807: {
! 2808: nanosleep(&attente, NULL);
! 2809: INCR_GRANULARITE(attente.tv_nsec);
! 2810: }
! 2811: }
! 2812: }
! 2813: else if ((*s_objet).type == VRL)
! 2814: {
! 2815: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
! 2816: {
! 2817: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2818: return(NULL);
! 2819: }
! 2820:
! 2821: (*((struct_vecteur *) (*s_objet).objet)).type = 'R';
! 2822:
! 2823: attente.tv_sec = 0;
! 2824: attente.tv_nsec = GRANULARITE_us * 1000;
! 2825:
! 2826: while(read_atomic(s_etat_processus, pipe, &((*((struct_vecteur *)
! 2827: (*s_objet).objet)).taille),
! 2828: sizeof(unsigned long)) != sizeof(unsigned long))
! 2829: {
! 2830: nanosleep(&attente, NULL);
! 2831: INCR_GRANULARITE(attente.tv_nsec);
! 2832: }
! 2833:
! 2834: if (((*((struct_vecteur *) (*s_objet).objet)).tableau =
! 2835: malloc((*((struct_vecteur *) (*s_objet).objet)).taille *
! 2836: sizeof(real8))) == NULL)
! 2837: {
! 2838: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2839: return(NULL);
! 2840: }
! 2841:
! 2842: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
! 2843: {
! 2844: attente.tv_sec = 0;
! 2845: attente.tv_nsec = GRANULARITE_us * 1000;
! 2846:
! 2847: while(read_atomic(s_etat_processus, pipe,
! 2848: &(((real8 *) (*((struct_vecteur *)
! 2849: (*s_objet).objet)).tableau)[i]), sizeof(real8)) !=
! 2850: sizeof(real8))
! 2851: {
! 2852: nanosleep(&attente, NULL);
! 2853: INCR_GRANULARITE(attente.tv_nsec);
! 2854: }
! 2855: }
! 2856: }
! 2857: else if ((*s_objet).type == VCX)
! 2858: {
! 2859: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
! 2860: {
! 2861: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2862: return(NULL);
! 2863: }
! 2864:
! 2865: (*((struct_vecteur *) (*s_objet).objet)).type = 'C';
! 2866:
! 2867: attente.tv_sec = 0;
! 2868: attente.tv_nsec = GRANULARITE_us * 1000;
! 2869:
! 2870: while(read_atomic(s_etat_processus, pipe, &((*((struct_vecteur *)
! 2871: (*s_objet).objet)).taille),
! 2872: sizeof(unsigned long)) != sizeof(unsigned long))
! 2873: {
! 2874: nanosleep(&attente, NULL);
! 2875: INCR_GRANULARITE(attente.tv_nsec);
! 2876: }
! 2877:
! 2878: if (((*((struct_vecteur *) (*s_objet).objet)).tableau =
! 2879: malloc((*((struct_vecteur *) (*s_objet).objet)).taille *
! 2880: sizeof(complex16))) == NULL)
! 2881: {
! 2882: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2883: return(NULL);
! 2884: }
! 2885:
! 2886: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
! 2887: {
! 2888: attente.tv_sec = 0;
! 2889: attente.tv_nsec = GRANULARITE_us * 1000;
! 2890:
! 2891: while(read_atomic(s_etat_processus, pipe,
! 2892: &(((complex16 *) (*((struct_vecteur *)
! 2893: (*s_objet).objet)).tableau)[i]), sizeof(complex16)) !=
! 2894: sizeof(complex16))
! 2895: {
! 2896: nanosleep(&attente, NULL);
! 2897: INCR_GRANULARITE(attente.tv_nsec);
! 2898: }
! 2899: }
! 2900: }
! 2901: else if ((*s_objet).type == MIN)
! 2902: {
! 2903: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
! 2904: {
! 2905: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2906: return(NULL);
! 2907: }
! 2908:
! 2909: (*((struct_matrice *) (*s_objet).objet)).type = 'I';
! 2910:
! 2911: attente.tv_sec = 0;
! 2912: attente.tv_nsec = GRANULARITE_us * 1000;
! 2913:
! 2914: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
! 2915: (*s_objet).objet)).nombre_lignes),
! 2916: sizeof(unsigned long)) != sizeof(unsigned long))
! 2917: {
! 2918: nanosleep(&attente, NULL);
! 2919: INCR_GRANULARITE(attente.tv_nsec);
! 2920: }
! 2921:
! 2922: attente.tv_sec = 0;
! 2923: attente.tv_nsec = GRANULARITE_us * 1000;
! 2924:
! 2925: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
! 2926: (*s_objet).objet)).nombre_colonnes),
! 2927: sizeof(unsigned long)) != sizeof(unsigned long))
! 2928: {
! 2929: nanosleep(&attente, NULL);
! 2930: INCR_GRANULARITE(attente.tv_nsec);
! 2931: }
! 2932:
! 2933: if (((*((struct_matrice *) (*s_objet).objet)).tableau =
! 2934: malloc((*((struct_matrice *) (*s_objet).objet)).nombre_lignes *
! 2935: sizeof(integer8 *))) == NULL)
! 2936: {
! 2937: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2938: return(NULL);
! 2939: }
! 2940:
! 2941: for(i = 0; i < (*((struct_matrice *)
! 2942: (*s_objet).objet)).nombre_lignes; i++)
! 2943: {
! 2944: if ((((*((struct_matrice *) (*s_objet).objet)).tableau)[i] =
! 2945: malloc((*((struct_matrice *) (*s_objet).objet))
! 2946: .nombre_colonnes * sizeof(integer8))) == NULL)
! 2947: {
! 2948: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2949: return(NULL);
! 2950: }
! 2951:
! 2952: for(j = 0; j < (*((struct_matrice *)
! 2953: (*s_objet).objet)).nombre_colonnes; j++)
! 2954: {
! 2955: attente.tv_sec = 0;
! 2956: attente.tv_nsec = GRANULARITE_us * 1000;
! 2957:
! 2958: while(read_atomic(s_etat_processus,
! 2959: pipe, &(((integer8 **) (*((struct_matrice *)
! 2960: (*s_objet).objet)).tableau)[i][j]),
! 2961: sizeof(integer8)) != sizeof(integer8))
! 2962: {
! 2963: nanosleep(&attente, NULL);
! 2964: INCR_GRANULARITE(attente.tv_nsec);
! 2965: }
! 2966: }
! 2967: }
! 2968: }
! 2969: else if ((*s_objet).type == MRL)
! 2970: {
! 2971: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
! 2972: {
! 2973: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2974: return(NULL);
! 2975: }
! 2976:
! 2977: (*((struct_matrice *) (*s_objet).objet)).type = 'R';
! 2978:
! 2979: attente.tv_sec = 0;
! 2980: attente.tv_nsec = GRANULARITE_us * 1000;
! 2981:
! 2982: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
! 2983: (*s_objet).objet)).nombre_lignes),
! 2984: sizeof(unsigned long)) != sizeof(unsigned long))
! 2985: {
! 2986: nanosleep(&attente, NULL);
! 2987: INCR_GRANULARITE(attente.tv_nsec);
! 2988: }
! 2989:
! 2990: attente.tv_sec = 0;
! 2991: attente.tv_nsec = GRANULARITE_us * 1000;
! 2992:
! 2993: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
! 2994: (*s_objet).objet)).nombre_colonnes),
! 2995: sizeof(unsigned long)) != sizeof(unsigned long))
! 2996: {
! 2997: nanosleep(&attente, NULL);
! 2998: INCR_GRANULARITE(attente.tv_nsec);
! 2999: }
! 3000:
! 3001: if (((*((struct_matrice *) (*s_objet).objet)).tableau =
! 3002: malloc((*((struct_matrice *) (*s_objet).objet)).nombre_lignes *
! 3003: sizeof(real8 *))) == NULL)
! 3004: {
! 3005: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3006: return(NULL);
! 3007: }
! 3008:
! 3009: for(i = 0; i < (*((struct_matrice *)
! 3010: (*s_objet).objet)).nombre_lignes; i++)
! 3011: {
! 3012: if ((((*((struct_matrice *) (*s_objet).objet)).tableau)[i] =
! 3013: malloc((*((struct_matrice *) (*s_objet).objet))
! 3014: .nombre_colonnes * sizeof(real8))) == NULL)
! 3015: {
! 3016: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3017: return(NULL);
! 3018: }
! 3019:
! 3020: for(j = 0; j < (*((struct_matrice *)
! 3021: (*s_objet).objet)).nombre_colonnes; j++)
! 3022: {
! 3023: attente.tv_sec = 0;
! 3024: attente.tv_nsec = GRANULARITE_us * 1000;
! 3025:
! 3026: while(read_atomic(s_etat_processus,
! 3027: pipe, &(((real8 **) (*((struct_matrice *)
! 3028: (*s_objet).objet)).tableau)[i][j]),
! 3029: sizeof(real8)) != sizeof(real8))
! 3030: {
! 3031: nanosleep(&attente, NULL);
! 3032: INCR_GRANULARITE(attente.tv_nsec);
! 3033: }
! 3034: }
! 3035: }
! 3036: }
! 3037: else if ((*s_objet).type == MCX)
! 3038: {
! 3039: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
! 3040: {
! 3041: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3042: return(NULL);
! 3043: }
! 3044:
! 3045: (*((struct_matrice *) (*s_objet).objet)).type = 'C';
! 3046:
! 3047: attente.tv_sec = 0;
! 3048: attente.tv_nsec = GRANULARITE_us * 1000;
! 3049:
! 3050: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
! 3051: (*s_objet).objet)).nombre_lignes),
! 3052: sizeof(unsigned long)) != sizeof(unsigned long))
! 3053: {
! 3054: nanosleep(&attente, NULL);
! 3055: INCR_GRANULARITE(attente.tv_nsec);
! 3056: }
! 3057:
! 3058: attente.tv_sec = 0;
! 3059: attente.tv_nsec = GRANULARITE_us * 1000;
! 3060:
! 3061: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
! 3062: (*s_objet).objet)).nombre_colonnes),
! 3063: sizeof(unsigned long)) != sizeof(unsigned long))
! 3064: {
! 3065: nanosleep(&attente, NULL);
! 3066: INCR_GRANULARITE(attente.tv_nsec);
! 3067: }
! 3068:
! 3069: if (((*((struct_matrice *) (*s_objet).objet)).tableau =
! 3070: malloc((*((struct_matrice *) (*s_objet).objet)).nombre_lignes *
! 3071: sizeof(complex16 *))) == NULL)
! 3072: {
! 3073: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3074: return(NULL);
! 3075: }
! 3076:
! 3077: for(i = 0; i < (*((struct_matrice *)
! 3078: (*s_objet).objet)).nombre_lignes; i++)
! 3079: {
! 3080: if ((((*((struct_matrice *) (*s_objet).objet)).tableau)[i] =
! 3081: malloc((*((struct_matrice *) (*s_objet).objet))
! 3082: .nombre_colonnes * sizeof(complex16))) == NULL)
! 3083: {
! 3084: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3085: return(NULL);
! 3086: }
! 3087:
! 3088: for(j = 0; j < (*((struct_matrice *)
! 3089: (*s_objet).objet)).nombre_colonnes; j++)
! 3090: {
! 3091: attente.tv_sec = 0;
! 3092: attente.tv_nsec = GRANULARITE_us * 1000;
! 3093:
! 3094: while(read_atomic(s_etat_processus, pipe,
! 3095: &(((complex16 **) (*((struct_matrice *)
! 3096: (*s_objet).objet)).tableau)[i][j]),
! 3097: sizeof(complex16)) != sizeof(complex16))
! 3098: {
! 3099: nanosleep(&attente, NULL);
! 3100: INCR_GRANULARITE(attente.tv_nsec);
! 3101: }
! 3102: }
! 3103: }
! 3104: }
! 3105: else if ((*s_objet).type == BIN)
! 3106: {
! 3107: if (((*s_objet).objet = malloc(sizeof(integer8))) == NULL)
! 3108: {
! 3109: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3110: return(NULL);
! 3111: }
! 3112:
! 3113: attente.tv_sec = 0;
! 3114: attente.tv_nsec = GRANULARITE_us * 1000;
! 3115:
! 3116: while(read_atomic(s_etat_processus, pipe,
! 3117: (*s_objet).objet, sizeof(integer8)) != sizeof(integer8))
! 3118: {
! 3119: nanosleep(&attente, NULL);
! 3120: INCR_GRANULARITE(attente.tv_nsec);
! 3121: }
! 3122: }
! 3123: else if ((*s_objet).type == NOM)
! 3124: {
! 3125: if (((*s_objet).objet = malloc(sizeof(struct_nom))) == NULL)
! 3126: {
! 3127: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3128: return(NULL);
! 3129: }
! 3130:
! 3131: attente.tv_sec = 0;
! 3132: attente.tv_nsec = GRANULARITE_us * 1000;
! 3133:
! 3134: while(read_atomic(s_etat_processus,
! 3135: pipe, &longueur, sizeof(size_t)) != sizeof(size_t))
! 3136: {
! 3137: nanosleep(&attente, NULL);
! 3138: INCR_GRANULARITE(attente.tv_nsec);
! 3139: }
! 3140:
! 3141: if (((*((struct_nom *) (*s_objet).objet)).nom = malloc(longueur *
! 3142: sizeof(unsigned char))) == NULL)
! 3143: {
! 3144: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3145: return(NULL);
! 3146: }
! 3147:
! 3148: attente.tv_sec = 0;
! 3149: attente.tv_nsec = GRANULARITE_us * 1000;
! 3150:
! 3151: while(read_atomic(s_etat_processus, pipe, (*((struct_nom *)
! 3152: (*s_objet).objet)).nom, longueur) != (ssize_t) longueur)
! 3153: {
! 3154: nanosleep(&attente, NULL);
! 3155: INCR_GRANULARITE(attente.tv_nsec);
! 3156: }
! 3157:
! 3158: attente.tv_sec = 0;
! 3159: attente.tv_nsec = GRANULARITE_us * 1000;
! 3160:
! 3161: while(read_atomic(s_etat_processus, pipe,
! 3162: &((*((struct_nom *) (*s_objet).objet)).symbole),
! 3163: sizeof(logical1)) != sizeof(logical1))
! 3164: {
! 3165: nanosleep(&attente, NULL);
! 3166: INCR_GRANULARITE(attente.tv_nsec);
! 3167: }
! 3168: }
! 3169: else if ((*s_objet).type == FCT)
! 3170: {
! 3171: if (((*s_objet).objet = allocation(s_etat_processus, FCT)) == NULL)
! 3172: {
! 3173: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3174: return(NULL);
! 3175: }
! 3176:
! 3177: attente.tv_sec = 0;
! 3178: attente.tv_nsec = GRANULARITE_us * 1000;
! 3179:
! 3180: while(read_atomic(s_etat_processus, pipe,
! 3181: &longueur, sizeof(size_t)) != sizeof(size_t))
! 3182: {
! 3183: nanosleep(&attente, NULL);
! 3184: INCR_GRANULARITE(attente.tv_nsec);
! 3185: }
! 3186:
! 3187: if (((*((struct_fonction *) (*s_objet).objet)).nom_fonction =
! 3188: malloc(longueur * sizeof(unsigned char))) == NULL)
! 3189: {
! 3190: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3191: return(NULL);
! 3192: }
! 3193:
! 3194: attente.tv_sec = 0;
! 3195: attente.tv_nsec = GRANULARITE_us * 1000;
! 3196:
! 3197: while(read_atomic(s_etat_processus, pipe,
! 3198: (*((struct_fonction *) (*s_objet).objet))
! 3199: .nom_fonction, longueur) != (ssize_t) longueur)
! 3200: {
! 3201: nanosleep(&attente, NULL);
! 3202: INCR_GRANULARITE(attente.tv_nsec);
! 3203: }
! 3204:
! 3205: attente.tv_sec = 0;
! 3206: attente.tv_nsec = GRANULARITE_us * 1000;
! 3207:
! 3208: while(read_atomic(s_etat_processus, pipe,
! 3209: &((*((struct_fonction *) (*s_objet).objet))
! 3210: .nombre_arguments), sizeof(unsigned long)) !=
! 3211: sizeof(unsigned long))
! 3212: {
! 3213: nanosleep(&attente, NULL);
! 3214: INCR_GRANULARITE(attente.tv_nsec);
! 3215: }
! 3216:
! 3217: (*((struct_fonction *) (*s_objet).objet)).fonction = NULL;
! 3218: (*((struct_fonction *) (*s_objet).objet)).prediction_saut = NULL;
! 3219: (*((struct_fonction *) (*s_objet).objet)).prediction_execution = d_faux;
! 3220: }
! 3221: else if ((*s_objet).type == CHN)
! 3222: {
! 3223: attente.tv_sec = 0;
! 3224: attente.tv_nsec = GRANULARITE_us * 1000;
! 3225:
! 3226: while(read_atomic(s_etat_processus, pipe,
! 3227: &longueur, sizeof(size_t)) != sizeof(size_t))
! 3228: {
! 3229: nanosleep(&attente, NULL);
! 3230: INCR_GRANULARITE(attente.tv_nsec);
! 3231: }
! 3232:
! 3233: if (((*s_objet).objet = malloc(longueur *
! 3234: sizeof(unsigned char))) == NULL)
! 3235: {
! 3236: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3237: return(NULL);
! 3238: }
! 3239:
! 3240: attente.tv_sec = 0;
! 3241: attente.tv_nsec = GRANULARITE_us * 1000;
! 3242:
! 3243: while(read_atomic(s_etat_processus, pipe, (unsigned char *)
! 3244: (*s_objet).objet, longueur) != (ssize_t) longueur)
! 3245: {
! 3246: nanosleep(&attente, NULL);
! 3247: INCR_GRANULARITE(attente.tv_nsec);
! 3248: }
! 3249: }
! 3250: else if (((*s_objet).type == LST) ||
! 3251: ((*s_objet).type == ALG) ||
! 3252: ((*s_objet).type == RPN))
! 3253: {
! 3254: attente.tv_sec = 0;
! 3255: attente.tv_nsec = GRANULARITE_us * 1000;
! 3256:
! 3257: while(read_atomic(s_etat_processus, pipe, &j, sizeof(j)) != sizeof(j))
! 3258: {
! 3259: nanosleep(&attente, NULL);
! 3260: INCR_GRANULARITE(attente.tv_nsec);
! 3261: }
! 3262:
! 3263: l_element_courant = NULL;
! 3264:
! 3265: for(i = 0; i < j; i++)
! 3266: {
! 3267: if (l_element_courant == NULL)
! 3268: {
! 3269: if ((l_element_courant =
! 3270: malloc(sizeof(struct_liste_chainee))) == NULL)
! 3271: {
! 3272: (*s_etat_processus).erreur_systeme =
! 3273: d_es_allocation_memoire;
! 3274: return(NULL);
! 3275: }
! 3276:
! 3277: (*s_objet).objet = l_element_courant;
! 3278: }
! 3279: else
! 3280: {
! 3281: if (((*l_element_courant).suivant =
! 3282: malloc(sizeof(struct_liste_chainee))) == NULL)
! 3283: {
! 3284: (*s_etat_processus).erreur_systeme =
! 3285: d_es_allocation_memoire;
! 3286: return(NULL);
! 3287: }
! 3288:
! 3289: l_element_courant = (*l_element_courant).suivant;
! 3290: (*l_element_courant).suivant = NULL;
! 3291: }
! 3292:
! 3293: attente.tv_sec = 0;
! 3294: attente.tv_nsec = GRANULARITE_us * 1000;
! 3295:
! 3296: while(((*l_element_courant).donnee = lecture_pipe(s_etat_processus,
! 3297: pipe)) == NULL)
! 3298: {
! 3299: if ((*s_etat_processus).erreur_systeme != d_es)
! 3300: {
! 3301: return(NULL);
! 3302: }
! 3303:
! 3304: nanosleep(&attente, NULL);
! 3305: INCR_GRANULARITE(attente.tv_nsec);
! 3306: }
! 3307: }
! 3308:
! 3309: if (l_element_courant == NULL)
! 3310: {
! 3311: (*s_objet).objet = NULL;
! 3312: }
! 3313: else
! 3314: {
! 3315: (*l_element_courant).suivant = NULL;
! 3316: }
! 3317: }
! 3318: else if ((*s_objet).type == TBL)
! 3319: {
! 3320: if (((*s_objet).objet = malloc(sizeof(struct_tableau))) == NULL)
! 3321: {
! 3322: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3323: return(NULL);
! 3324: }
! 3325:
! 3326: attente.tv_sec = 0;
! 3327: attente.tv_nsec = GRANULARITE_us * 1000;
! 3328:
! 3329: while(read_atomic(s_etat_processus, pipe, &((*((struct_tableau *)
! 3330: (*s_objet).objet)).nombre_elements),
! 3331: sizeof(unsigned long)) != sizeof(unsigned long))
! 3332: {
! 3333: nanosleep(&attente, NULL);
! 3334: INCR_GRANULARITE(attente.tv_nsec);
! 3335: }
! 3336:
! 3337: if (((*((struct_tableau *) (*s_objet).objet)).elements = malloc(
! 3338: (*((struct_tableau *) (*s_objet).objet)).nombre_elements *
! 3339: sizeof(struct_objet *))) == NULL)
! 3340: {
! 3341: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3342: return(NULL);
! 3343: }
! 3344:
! 3345: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet)).nombre_elements;
! 3346: i++)
! 3347: {
! 3348: attente.tv_sec = 0;
! 3349: attente.tv_nsec = GRANULARITE_us * 1000;
! 3350:
! 3351: while(((*((struct_tableau *) (*s_objet).objet)).elements[i] =
! 3352: lecture_pipe(s_etat_processus, pipe)) == NULL)
! 3353: {
! 3354: if ((*s_etat_processus).erreur_systeme != d_es)
! 3355: {
! 3356: return(NULL);
! 3357: }
! 3358:
! 3359: nanosleep(&attente, NULL);
! 3360: INCR_GRANULARITE(attente.tv_nsec);
! 3361: }
! 3362: }
! 3363: }
! 3364:
! 3365: return(s_objet);
! 3366: }
! 3367:
! 3368:
! 3369: /*
! 3370: ================================================================================
! 3371: Fonction de scrutation des données injectées par le processus père
! 3372: ================================================================================
! 3373: Entrées : pointeur sur une structure
! 3374: --------------------------------------------------------------------------------
! 3375: Sorties :
! 3376: --------------------------------------------------------------------------------
! 3377: Effets de bord : néant
! 3378: ================================================================================
! 3379: */
! 3380:
! 3381: inline void
! 3382: scrutation_injection(struct_processus *s_etat_processus)
! 3383: {
! 3384: fd_set ensemble_descripteurs;
! 3385:
! 3386: struct timespec timeout;
! 3387:
! 3388: unsigned char tampon;
! 3389:
! 3390: // Si on est dans le processus père, il n'y a rien à surveiller.
! 3391:
! 3392: if ((*s_etat_processus).var_volatile_processus_pere == 0)
! 3393: {
! 3394: FD_ZERO(&ensemble_descripteurs);
! 3395: FD_SET((*s_etat_processus).pipe_nombre_injections,
! 3396: &ensemble_descripteurs);
! 3397:
! 3398: timeout.tv_sec = 0;
! 3399: timeout.tv_nsec = 0;
! 3400:
! 3401: if (pselect((*s_etat_processus).pipe_nombre_injections + 1,
! 3402: &ensemble_descripteurs, NULL, NULL, &timeout, NULL) > 0)
! 3403: {
! 3404: if (read_atomic(s_etat_processus,
! 3405: (*s_etat_processus).pipe_nombre_injections,
! 3406: &tampon, sizeof(unsigned char)) == sizeof(unsigned char))
! 3407: {
! 3408: if (tampon == '-')
! 3409: {
! 3410: (*s_etat_processus).nombre_objets_injectes++;
! 3411: }
! 3412: else if (tampon == '+')
! 3413: {
! 3414: (*s_etat_processus).nombre_objets_envoyes_non_lus--;
! 3415:
! 3416: BUG((*s_etat_processus).nombre_objets_envoyes_non_lus < 0,
! 3417: printf("(*s_etat_processus).nombre_objets_envoyes_"
! 3418: "non_lus=%d\n", (*s_etat_processus)
! 3419: .nombre_objets_envoyes_non_lus));
! 3420: }
! 3421: else
! 3422: {
! 3423: BUG(1, printf("tampon='%c' (%d)\n", tampon, tampon));
! 3424: }
! 3425: }
! 3426: }
! 3427: }
! 3428:
! 3429: return;
! 3430: }
! 3431:
! 3432:
! 3433: /*
! 3434: ================================================================================
! 3435: Fonction de test du draeau d'arrêt
! 3436: ================================================================================
! 3437: Entrées : pointeur sur une structure
! 3438: --------------------------------------------------------------------------------
! 3439: Sorties :
! 3440: --------------------------------------------------------------------------------
! 3441: Effets de bord : néant
! 3442: ================================================================================
! 3443: */
! 3444:
! 3445: inline int test_arret(struct_processus *s_etat_processus)
! 3446: {
! 3447: return((int) (*s_etat_processus).var_volatile_requete_arret);
! 3448: }
! 3449:
! 3450: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>