Annotation of rpl/src/gestion_threads.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 lancement d'un thread
! 29: ================================================================================
! 30: Entrées : pointeur sur une structure
! 31: --------------------------------------------------------------------------------
! 32: Sorties :
! 33: --------------------------------------------------------------------------------
! 34: Effets de bord : néant
! 35: ================================================================================
! 36: */
! 37:
! 38: void *
! 39: lancement_thread(void *argument)
! 40: {
! 41: int status;
! 42:
! 43: pid_t ppid;
! 44:
! 45: pthread_t tid_final;
! 46:
! 47: sig_atomic_t registre_stop;
! 48:
! 49: sigset_t set;
! 50:
! 51: ssize_t longueur_ecriture;
! 52:
! 53: struct_descripteur_thread *s_argument_thread;
! 54:
! 55: struct_liste_chainee *l_element_courant;
! 56: struct_liste_chainee *l_element_suivant;
! 57:
! 58: struct_objet *s_objet_temporaire;
! 59:
! 60: struct_processus *s_etat_processus;
! 61:
! 62: struct sigaction action;
! 63: struct sigaction registre;
! 64:
! 65: struct timespec attente;
! 66:
! 67: unsigned char *message;
! 68:
! 69: unsigned int erreur;
! 70:
! 71: unsigned long i;
! 72:
! 73: attente.tv_sec = 0;
! 74: attente.tv_nsec = GRANULARITE_us * 1000;
! 75:
! 76: s_argument_thread = (struct_descripteur_thread *) argument;
! 77: (*s_argument_thread).tid = pthread_self();
! 78: (*s_argument_thread).thread_actif = d_vrai;
! 79: s_etat_processus = (*s_argument_thread).s_nouvel_etat_processus;
! 80:
! 81: if (pthread_setspecific(semaphore_fork_processus_courant,
! 82: &((*s_etat_processus).semaphore_fork)) != 0)
! 83: {
! 84: (*s_etat_processus).erreur_systeme = d_es_processus;
! 85:
! 86: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 87:
! 88: pthread_mutex_lock(&((*s_argument_thread).mutex));
! 89: pthread_mutex_unlock(&((*s_argument_thread).mutex));
! 90:
! 91: (*s_argument_thread).thread_actif = d_faux;
! 92:
! 93: tid_final = -2;
! 94:
! 95: while((longueur_ecriture = write_atomic(s_etat_processus,
! 96: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
! 97: &tid_final, sizeof(tid_final))) != sizeof(tid_final))
! 98: {
! 99: if (longueur_ecriture == -1)
! 100: {
! 101: break;
! 102: }
! 103: }
! 104:
! 105: while((longueur_ecriture = write_atomic(s_etat_processus,
! 106: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 107: &tid_final, sizeof(tid_final))) != sizeof(tid_final))
! 108: {
! 109: if (longueur_ecriture == -1)
! 110: {
! 111: break;
! 112: }
! 113: }
! 114:
! 115: pthread_exit(NULL);
! 116: }
! 117:
! 118: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 119: {
! 120: (*s_etat_processus).erreur_systeme = d_es_processus;
! 121:
! 122: pthread_mutex_lock(&((*s_argument_thread).mutex));
! 123: pthread_mutex_unlock(&((*s_argument_thread).mutex));
! 124:
! 125: (*s_argument_thread).thread_actif = d_faux;
! 126:
! 127: tid_final = -2;
! 128:
! 129: while((longueur_ecriture = write_atomic(s_etat_processus,
! 130: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
! 131: &tid_final, sizeof(tid_final))) != sizeof(tid_final))
! 132: {
! 133: if (longueur_ecriture == -1)
! 134: {
! 135: break;
! 136: }
! 137: }
! 138:
! 139: while((longueur_ecriture = write_atomic(s_etat_processus,
! 140: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 141: &tid_final, sizeof(tid_final))) != sizeof(tid_final))
! 142: {
! 143: if (longueur_ecriture == -1)
! 144: {
! 145: break;
! 146: }
! 147: }
! 148:
! 149: pthread_exit(NULL);
! 150: }
! 151:
! 152: insertion_thread(s_etat_processus, d_faux);
! 153:
! 154: // Envoi d'une donnée pour signaler le démarrage du thread au thread
! 155: // de surveillance.
! 156:
! 157: if (write_atomic(s_etat_processus,
! 158: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 159: "-", sizeof(unsigned char)) != sizeof(unsigned char))
! 160: {
! 161: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 162: (*s_etat_processus).erreur_systeme = d_es_processus;
! 163:
! 164: pthread_mutex_lock(&((*s_argument_thread).mutex));
! 165: pthread_mutex_unlock(&((*s_argument_thread).mutex));
! 166:
! 167: (*s_argument_thread).thread_actif = d_faux;
! 168:
! 169: tid_final = -2;
! 170:
! 171: while((longueur_ecriture = write_atomic(s_etat_processus,
! 172: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
! 173: &tid_final, sizeof(tid_final))) != sizeof(tid_final))
! 174: {
! 175: if (longueur_ecriture == -1)
! 176: {
! 177: break;
! 178: }
! 179: }
! 180:
! 181: while((longueur_ecriture = write_atomic(s_etat_processus,
! 182: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 183: &tid_final, sizeof(tid_final))) != sizeof(tid_final))
! 184: {
! 185: if (longueur_ecriture == -1)
! 186: {
! 187: break;
! 188: }
! 189: }
! 190:
! 191: pthread_exit(NULL);
! 192: }
! 193:
! 194: if ((*s_etat_processus).evaluation_expression_compilee == 'N')
! 195: {
! 196: free((*s_etat_processus).instruction_courante);
! 197: (*s_etat_processus).instruction_courante = NULL;
! 198: }
! 199:
! 200: set = (*s_argument_thread).set;
! 201:
! 202: if (sigpending(&set) != 0)
! 203: {
! 204: (*s_etat_processus).erreur_systeme = d_es_processus;
! 205: }
! 206: else if (sigismember(&set, SIGSTART) == 0)
! 207: {
! 208: while(sigismember(&set, SIGSTART) == 0)
! 209: {
! 210: if (sigpending(&set) != 0)
! 211: {
! 212: (*s_etat_processus).erreur_systeme = d_es_processus;
! 213: }
! 214:
! 215: nanosleep(&attente, NULL);
! 216: }
! 217: }
! 218:
! 219: if ((*s_etat_processus).debug == d_vrai)
! 220: if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
! 221: {
! 222: if ((*s_etat_processus).langue == 'F')
! 223: {
! 224: printf("[%d] Lancement du thread %llu\n", (int) getpid(),
! 225: (unsigned long long) pthread_self());
! 226: }
! 227: else
! 228: {
! 229: printf("[%d] Start thread %llu\n", (int) getpid(),
! 230: (unsigned long long) pthread_self());
! 231: }
! 232:
! 233: fflush(stdout);
! 234: }
! 235:
! 236: if (pthread_sigmask(SIG_SETMASK, &((*s_argument_thread).oldset), NULL) != 0)
! 237: {
! 238: (*s_etat_processus).erreur_systeme = d_es_processus;
! 239: }
! 240:
! 241: sigpending(&set);
! 242:
! 243: (*s_etat_processus).pid_erreur_processus_fils = getpid();
! 244:
! 245: // Évaluation de l'objet
! 246:
! 247: if ((*s_etat_processus).erreur_systeme == d_es)
! 248: {
! 249: if (evaluation(s_etat_processus, (*s_argument_thread).argument, 'E')
! 250: == d_erreur)
! 251: {
! 252: if (((*s_etat_processus).erreur_execution == d_ex) &&
! 253: ((*s_etat_processus).erreur_systeme == d_es))
! 254: {
! 255: (*s_etat_processus).erreur_execution =
! 256: d_ex_erreur_evaluation;
! 257: }
! 258: }
! 259:
! 260: if ((*s_argument_thread).destruction_objet == d_vrai)
! 261: {
! 262: liberation(s_etat_processus, (*s_argument_thread).argument);
! 263: }
! 264: }
! 265:
! 266: if ((*s_etat_processus).presence_fusible == d_vrai)
! 267: {
! 268: pthread_cancel((*s_etat_processus).thread_fusible);
! 269: }
! 270:
! 271: tid_final = -2;
! 272:
! 273: while((longueur_ecriture = write_atomic(s_etat_processus,
! 274: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
! 275: &tid_final, sizeof(tid_final))) != sizeof(tid_final))
! 276: {
! 277: if (longueur_ecriture == -1)
! 278: {
! 279: break;
! 280: }
! 281: }
! 282:
! 283: while((longueur_ecriture = write_atomic(s_etat_processus,
! 284: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 285: &tid_final, sizeof(tid_final))) != sizeof(tid_final))
! 286: {
! 287: if (longueur_ecriture == -1)
! 288: {
! 289: break;
! 290: }
! 291: }
! 292:
! 293: if ((*s_etat_processus).var_volatile_processus_pere != 0)
! 294: {
! 295: // Racine des processus atteinte
! 296:
! 297: erreur = d_ex;
! 298:
! 299: while((longueur_ecriture = write_atomic(s_etat_processus,
! 300: (*s_argument_thread).pipe_erreurs[1], &erreur,
! 301: sizeof((*s_etat_processus).erreur_execution))) !=
! 302: sizeof((*s_etat_processus).erreur_execution))
! 303: {
! 304: if (longueur_ecriture == -1)
! 305: {
! 306: break;
! 307: }
! 308: }
! 309: }
! 310: else
! 311: {
! 312: while((longueur_ecriture = write_atomic(s_etat_processus,
! 313: (*s_argument_thread).pipe_erreurs[1],
! 314: &((*s_etat_processus).erreur_execution),
! 315: sizeof((*s_etat_processus).erreur_execution))) !=
! 316: sizeof((*s_etat_processus).erreur_execution))
! 317: {
! 318: if (longueur_ecriture == -1)
! 319: {
! 320: break;
! 321: }
! 322: }
! 323: }
! 324:
! 325: if ((*s_etat_processus).var_volatile_processus_pere != 0)
! 326: {
! 327: // Racine des processus atteinte
! 328:
! 329: erreur = d_es;
! 330:
! 331: while((longueur_ecriture = write_atomic(s_etat_processus,
! 332: (*s_argument_thread).pipe_erreurs[1], &erreur,
! 333: sizeof((*s_etat_processus).erreur_systeme))) !=
! 334: sizeof((*s_etat_processus).erreur_systeme))
! 335: {
! 336: if (longueur_ecriture == -1)
! 337: {
! 338: break;
! 339: }
! 340: }
! 341: }
! 342: else
! 343: {
! 344: while((longueur_ecriture = write_atomic(s_etat_processus,
! 345: (*s_argument_thread).pipe_erreurs[1],
! 346: &((*s_etat_processus).erreur_systeme),
! 347: sizeof((*s_etat_processus).erreur_systeme))) !=
! 348: sizeof((*s_etat_processus).erreur_systeme))
! 349: {
! 350: if (longueur_ecriture == -1)
! 351: {
! 352: break;
! 353: }
! 354: }
! 355: }
! 356:
! 357: if ((*s_etat_processus).pid_erreur_processus_fils == 0)
! 358: {
! 359: ppid = getpid();
! 360:
! 361: while((longueur_ecriture = write_atomic(s_etat_processus,
! 362: (*s_argument_thread).pipe_erreurs[1],
! 363: &ppid, sizeof(ppid))) != sizeof(ppid))
! 364: {
! 365: if (longueur_ecriture == -1)
! 366: {
! 367: break;
! 368: }
! 369: }
! 370: }
! 371: else
! 372: {
! 373: while((longueur_ecriture = write_atomic(s_etat_processus,
! 374: (*s_argument_thread).pipe_erreurs[1],
! 375: &((*s_etat_processus).pid_erreur_processus_fils),
! 376: sizeof((*s_etat_processus).pid_erreur_processus_fils))) !=
! 377: sizeof((*s_etat_processus).pid_erreur_processus_fils))
! 378: {
! 379: if (longueur_ecriture == -1)
! 380: {
! 381: break;
! 382: }
! 383: }
! 384: }
! 385:
! 386: close((*s_argument_thread).pipe_erreurs[1]);
! 387: close((*s_argument_thread).pipe_interruptions[1]);
! 388: close((*s_argument_thread).pipe_nombre_interruptions_attente[1]);
! 389: close((*s_argument_thread).pipe_objets[1]);
! 390: close((*s_argument_thread).pipe_nombre_objets_attente[1]);
! 391: close((*s_argument_thread).pipe_injections[0]);
! 392: close((*s_argument_thread).pipe_nombre_injections[0]);
! 393: close((*s_argument_thread).pipe_acquittement[0]);
! 394:
! 395: l_element_courant = (*s_etat_processus).s_fichiers;
! 396:
! 397: while(l_element_courant != NULL)
! 398: {
! 399: l_element_suivant = (*l_element_courant).suivant;
! 400:
! 401: if ((*((struct_descripteur_fichier *) (*l_element_courant)
! 402: .donnee)).pid == getpid())
! 403: {
! 404: fclose((*((struct_descripteur_fichier *)
! 405: (*l_element_courant).donnee)).descripteur);
! 406:
! 407: if ((*((struct_descripteur_fichier *) (*l_element_courant)
! 408: .donnee)).effacement == 'Y')
! 409: {
! 410: unlink((*((struct_descripteur_fichier *)
! 411: (*l_element_courant).donnee)).nom);
! 412: }
! 413: }
! 414:
! 415: free((*((struct_descripteur_fichier *) (*l_element_courant)
! 416: .donnee)).nom);
! 417: free((struct_descripteur_fichier *) (*l_element_courant).donnee);
! 418: free(l_element_courant);
! 419:
! 420: l_element_courant = l_element_suivant;
! 421: }
! 422:
! 423: pthread_mutex_lock(&((*s_etat_processus).mutex));
! 424:
! 425: l_element_courant = (struct_liste_chainee *)
! 426: (*s_etat_processus).l_base_pile_processus;
! 427:
! 428: while(l_element_courant != NULL)
! 429: {
! 430: if ((*(*((struct_processus_fils *) (*(*l_element_courant).donnee)
! 431: .objet)).thread).processus_detache == d_vrai)
! 432: {
! 433: if ((*s_etat_processus).debug == d_vrai)
! 434: {
! 435: if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
! 436: {
! 437: if ((*s_etat_processus).langue == 'F')
! 438: {
! 439: printf("[%d] Signalement pour arrêt du processus %d\n",
! 440: (int) getpid(),
! 441: (int) (*(*((struct_processus_fils *)
! 442: (*(*l_element_courant).donnee).objet)).thread)
! 443: .pid);
! 444: }
! 445: else
! 446: {
! 447: printf("[%d] Send stop signal to process %d\n",
! 448: (int) getpid(),
! 449: (int) (*(*((struct_processus_fils *)
! 450: (*(*l_element_courant).donnee).objet)).thread)
! 451: .pid);
! 452: }
! 453: }
! 454: }
! 455:
! 456: if ((*s_etat_processus).var_volatile_alarme != 0)
! 457: {
! 458: kill((*(*((struct_processus_fils *) (*(*l_element_courant)
! 459: .donnee).objet)).thread).pid, SIGURG);
! 460: }
! 461: else
! 462: {
! 463: kill((*(*((struct_processus_fils *) (*(*l_element_courant)
! 464: .donnee).objet)).thread).pid, SIGFSTOP);
! 465: }
! 466: }
! 467: else
! 468: {
! 469: if ((*s_etat_processus).debug == d_vrai)
! 470: {
! 471: if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
! 472: {
! 473: if ((*s_etat_processus).langue == 'F')
! 474: {
! 475: printf("[%d] Signalement pour arrêt du thread %llu\n",
! 476: (int) getpid(), (unsigned long long)
! 477: (*(*((struct_processus_fils *)
! 478: (*(*l_element_courant).donnee).objet)).thread)
! 479: .tid);
! 480: }
! 481: else
! 482: {
! 483: printf("[%d] Send stop signal to thread %llu\n",
! 484: (int) getpid(), (unsigned long long)
! 485: (*(*((struct_processus_fils *)
! 486: (*(*l_element_courant).donnee).objet)).thread)
! 487: .tid);
! 488: }
! 489: }
! 490: }
! 491:
! 492: if ((*s_etat_processus).var_volatile_alarme != 0)
! 493: {
! 494: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
! 495: (*(*l_element_courant).donnee).objet)).thread).mutex))
! 496: != 0)
! 497: {
! 498: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 499: (*s_etat_processus).erreur_systeme = d_es_processus;
! 500:
! 501: pthread_mutex_lock(&((*s_argument_thread).mutex));
! 502: pthread_mutex_unlock(&((*s_argument_thread).mutex));
! 503:
! 504: (*s_argument_thread).thread_actif = d_faux;
! 505:
! 506: pthread_exit(NULL);
! 507: }
! 508:
! 509: if ((*(*((struct_processus_fils *)
! 510: (*(*l_element_courant).donnee).objet)).thread)
! 511: .thread_actif == d_vrai)
! 512: {
! 513: pthread_kill((*(*((struct_processus_fils *)
! 514: (*(*l_element_courant).donnee).objet)).thread).tid,
! 515: SIGURG);
! 516: }
! 517:
! 518: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
! 519: (*(*l_element_courant).donnee).objet)).thread)
! 520: .mutex)) != 0)
! 521: {
! 522: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 523: (*s_etat_processus).erreur_systeme = d_es_processus;
! 524:
! 525: pthread_mutex_lock(&((*s_argument_thread).mutex));
! 526: pthread_mutex_unlock(&((*s_argument_thread).mutex));
! 527:
! 528: (*s_argument_thread).thread_actif = d_faux;
! 529:
! 530: pthread_exit(NULL);
! 531: }
! 532: }
! 533: else
! 534: {
! 535: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
! 536: (*(*l_element_courant).donnee).objet)).thread).mutex))
! 537: != 0)
! 538: {
! 539: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 540: (*s_etat_processus).erreur_systeme = d_es_processus;
! 541:
! 542: pthread_mutex_lock(&((*s_argument_thread).mutex));
! 543: pthread_mutex_unlock(&((*s_argument_thread).mutex));
! 544:
! 545: (*s_argument_thread).thread_actif = d_faux;
! 546:
! 547: pthread_exit(NULL);
! 548: }
! 549:
! 550: if ((*(*((struct_processus_fils *)
! 551: (*(*l_element_courant).donnee).objet)).thread)
! 552: .thread_actif == d_vrai)
! 553: {
! 554: pthread_kill((*(*((struct_processus_fils *)
! 555: (*(*l_element_courant).donnee).objet)).thread).tid,
! 556: SIGFSTOP);
! 557: }
! 558:
! 559: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
! 560: (*(*l_element_courant).donnee).objet)).thread).mutex))
! 561: != 0)
! 562: {
! 563: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 564: (*s_etat_processus).erreur_systeme = d_es_processus;
! 565:
! 566: pthread_mutex_lock(&((*s_argument_thread).mutex));
! 567: pthread_mutex_unlock(&((*s_argument_thread).mutex));
! 568:
! 569: (*s_argument_thread).thread_actif = d_faux;
! 570:
! 571: pthread_exit(NULL);
! 572: }
! 573: }
! 574: }
! 575:
! 576: l_element_courant = (*l_element_courant).suivant;
! 577: }
! 578:
! 579: /*
! 580: * Attente de la fin de tous les processus fils
! 581: */
! 582:
! 583: for(i = 0; i < d_NOMBRE_INTERRUPTIONS;
! 584: (*s_etat_processus).masque_interruptions[i++] = 'I');
! 585:
! 586: attente.tv_sec = 0;
! 587: attente.tv_nsec = GRANULARITE_us * 1000;
! 588:
! 589: while((*s_etat_processus).l_base_pile_processus != NULL)
! 590: {
! 591: status = 0;
! 592:
! 593: l_element_courant = (struct_liste_chainee *)
! 594: (*s_etat_processus).l_base_pile_processus;
! 595:
! 596: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
! 597: {
! 598: affectation_interruptions_logicielles(s_etat_processus);
! 599: }
! 600:
! 601: registre_stop = (*s_etat_processus)
! 602: .var_volatile_traitement_retarde_stop;
! 603: (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
! 604:
! 605: for(i = 0; i < (unsigned long) (*(*((struct_processus_fils *)
! 606: (*(*l_element_courant).donnee).objet)).thread)
! 607: .nombre_objets_dans_pipe; i++)
! 608: {
! 609: if ((s_objet_temporaire = lecture_pipe(s_etat_processus,
! 610: (*(*((struct_processus_fils *) (*(*l_element_courant)
! 611: .donnee).objet)).thread).pipe_objets[0])) != NULL)
! 612: {
! 613: liberation(s_etat_processus, s_objet_temporaire);
! 614:
! 615: (*(*((struct_processus_fils *) (*(*l_element_courant)
! 616: .donnee).objet)).thread).nombre_objets_dans_pipe--;
! 617:
! 618: action.sa_handler = SIG_IGN;
! 619: action.sa_flags = SA_ONSTACK;
! 620:
! 621: if (sigaction(SIGPIPE, &action, ®istre) != 0)
! 622: {
! 623: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 624:
! 625: if (registre_stop == 0)
! 626: {
! 627: if ((*s_etat_processus)
! 628: .var_volatile_traitement_retarde_stop
! 629: == -1)
! 630: {
! 631: (*s_etat_processus)
! 632: .var_volatile_requete_arret = -1;
! 633: }
! 634:
! 635: (*s_etat_processus)
! 636: .var_volatile_traitement_retarde_stop =
! 637: registre_stop;
! 638: }
! 639:
! 640: (*s_etat_processus).erreur_systeme = d_es_signal;
! 641: exit(EXIT_FAILURE);
! 642: }
! 643:
! 644: while((longueur_ecriture = write_atomic(
! 645: s_etat_processus, (*(*((struct_processus_fils *)
! 646: (*(*l_element_courant).donnee).objet)).thread)
! 647: .pipe_nombre_injections[1], "+",
! 648: sizeof(unsigned char))) !=
! 649: sizeof(unsigned char))
! 650: {
! 651: if (longueur_ecriture == -1)
! 652: {
! 653: // Le processus n'existe plus.
! 654: break;
! 655: }
! 656: }
! 657:
! 658: if (registre_stop == 0)
! 659: {
! 660: if ((*s_etat_processus)
! 661: .var_volatile_traitement_retarde_stop == -1)
! 662: {
! 663: (*s_etat_processus).var_volatile_requete_arret
! 664: = -1;
! 665: }
! 666:
! 667: (*s_etat_processus)
! 668: .var_volatile_traitement_retarde_stop =
! 669: registre_stop;
! 670: }
! 671:
! 672: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
! 673: {
! 674: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 675:
! 676: (*s_etat_processus).erreur_systeme = d_es_signal;
! 677: exit(EXIT_FAILURE);
! 678: }
! 679: }
! 680: }
! 681:
! 682: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 683: .donnee).objet)).thread).processus_detache == d_vrai)
! 684: {
! 685: if (waitpid((*(*((struct_processus_fils *)
! 686: (*(*l_element_courant).donnee).objet)).thread).pid,
! 687: &status, WNOHANG) < 0)
! 688: {
! 689: }
! 690: }
! 691:
! 692: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 693: nanosleep(&attente, NULL);
! 694: pthread_mutex_lock(&((*s_etat_processus).mutex));
! 695: }
! 696:
! 697: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 698:
! 699: l_element_courant = (*s_etat_processus).s_sockets;
! 700:
! 701: while(l_element_courant != NULL)
! 702: {
! 703: l_element_suivant = (*l_element_courant).suivant;
! 704:
! 705: /*
! 706: * Fermeture des sockets créées dans le processus courant.
! 707: */
! 708:
! 709: if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
! 710: .pid == getpid()) && (pthread_equal((*((struct_socket *)
! 711: (*(*l_element_courant).donnee).objet)).tid, pthread_self())
! 712: != 0))
! 713: {
! 714: if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
! 715: .socket_connectee == d_vrai)
! 716: {
! 717: shutdown((*((struct_socket *) (*(*l_element_courant).donnee)
! 718: .objet)).socket, SHUT_RDWR);
! 719: }
! 720:
! 721: close((*((struct_socket *) (*(*l_element_courant).donnee).objet))
! 722: .socket);
! 723:
! 724: if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
! 725: .effacement == 'Y')
! 726: {
! 727: unlink((*((struct_socket *) (*(*l_element_courant).donnee)
! 728: .objet)).adresse);
! 729: }
! 730: }
! 731:
! 732: liberation(s_etat_processus, (*((struct_liste_chainee *)
! 733: l_element_courant)).donnee);
! 734: free(l_element_courant);
! 735:
! 736: l_element_courant = l_element_suivant;
! 737: }
! 738:
! 739: l_element_courant = (*s_etat_processus).s_connecteurs_sql;
! 740:
! 741: while(l_element_courant != NULL)
! 742: {
! 743: l_element_suivant = (*l_element_courant).suivant;
! 744:
! 745: /*
! 746: * Fermeture des connecteurs créés dans le processus courant.
! 747: */
! 748:
! 749: if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
! 750: .pid == getpid()) && (pthread_equal((*((struct_socket *)
! 751: (*(*l_element_courant).donnee).objet)).tid, pthread_self())
! 752: != 0))
! 753: {
! 754: sqlclose((*l_element_courant).donnee);
! 755: }
! 756:
! 757: liberation(s_etat_processus, (*((struct_liste_chainee *)
! 758: l_element_courant)).donnee);
! 759: free(l_element_courant);
! 760:
! 761: l_element_courant = l_element_suivant;
! 762: }
! 763:
! 764: if ((((*s_etat_processus).erreur_execution != d_ex) ||
! 765: ((*s_etat_processus).exception != d_ep) ||
! 766: ((*s_etat_processus).erreur_systeme != d_es)) &&
! 767: ((*s_etat_processus).var_volatile_traitement_sigint == 0))
! 768: {
! 769: printf("%s [%d]\n", message =
! 770: messages(s_etat_processus), (int) getpid());
! 771: free(message);
! 772:
! 773: if ((*s_etat_processus).core == d_vrai)
! 774: {
! 775: printf("\n");
! 776:
! 777: if ((*s_etat_processus).langue == 'F')
! 778: {
! 779: printf("+++Information : Génération du fichier rpl-core "
! 780: "[%d]\n", (int) getpid());
! 781: }
! 782: else
! 783: {
! 784: printf("+++Information : Writing rpl-core file [%d]\n",
! 785: (int) getpid());
! 786: }
! 787:
! 788: rplcore(s_etat_processus);
! 789:
! 790: if ((*s_etat_processus).langue == 'F')
! 791: {
! 792: printf("+++Information : Processus tracé [%d]\n",
! 793: (int) getpid());
! 794: }
! 795: else
! 796: {
! 797: printf("+++Information : Done [%d]\n", (int) getpid());
! 798: }
! 799:
! 800: printf("\n");
! 801: fflush(stdout);
! 802: }
! 803: }
! 804:
! 805: if ((*s_etat_processus).entree_standard != NULL)
! 806: {
! 807: pclose((*s_etat_processus).entree_standard);
! 808: (*s_etat_processus).entree_standard = NULL;
! 809: }
! 810:
! 811: if ((*s_etat_processus).fichiers_graphiques != NULL)
! 812: {
! 813: instruction_cllcd(s_etat_processus);
! 814: }
! 815:
! 816: liberation(s_etat_processus, (*s_etat_processus).indep);
! 817: liberation(s_etat_processus, (*s_etat_processus).depend);
! 818:
! 819: free((*s_etat_processus).label_x);
! 820: free((*s_etat_processus).label_y);
! 821: free((*s_etat_processus).label_z);
! 822: free((*s_etat_processus).titre);
! 823: free((*s_etat_processus).legende);
! 824:
! 825: liberation(s_etat_processus,
! 826: (*s_etat_processus).parametres_courbes_de_niveau);
! 827:
! 828: if ((*s_etat_processus).instruction_derniere_erreur != NULL)
! 829: {
! 830: free((*s_etat_processus).instruction_derniere_erreur);
! 831: (*s_etat_processus).instruction_derniere_erreur = NULL;
! 832: }
! 833:
! 834: for(i = 0; i < (*s_etat_processus).nombre_variables; i++)
! 835: {
! 836: // Les définitions ne sont pas libérées parce qu'elles sont partagées
! 837: // avec le thread père.
! 838:
! 839: if ((*s_etat_processus).s_liste_variables[i].niveau != 0)
! 840: {
! 841: liberation(s_etat_processus,
! 842: (*s_etat_processus).s_liste_variables[i].objet);
! 843: }
! 844:
! 845: free((*s_etat_processus).s_liste_variables[i].nom);
! 846: }
! 847:
! 848: free((*s_etat_processus).s_liste_variables);
! 849:
! 850: for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++)
! 851: {
! 852: liberation(s_etat_processus,
! 853: (*s_etat_processus).s_liste_variables_statiques[i].objet);
! 854: free((*s_etat_processus).s_liste_variables_statiques[i].nom);
! 855: }
! 856:
! 857: free((*s_etat_processus).s_liste_variables_statiques);
! 858:
! 859: l_element_courant = (*s_etat_processus).l_base_pile;
! 860: while(l_element_courant != NULL)
! 861: {
! 862: l_element_suivant = (*l_element_courant).suivant;
! 863:
! 864: liberation(s_etat_processus, (*l_element_courant).donnee);
! 865: free(l_element_courant);
! 866:
! 867: l_element_courant = l_element_suivant;
! 868: }
! 869:
! 870: l_element_courant = (*s_etat_processus).l_base_pile_last;
! 871: while(l_element_courant != NULL)
! 872: {
! 873: l_element_suivant = (*l_element_courant).suivant;
! 874:
! 875: liberation(s_etat_processus, (*l_element_courant).donnee);
! 876: free(l_element_courant);
! 877:
! 878: l_element_courant = l_element_suivant;
! 879: }
! 880:
! 881: l_element_courant = (*s_etat_processus).l_base_pile_contextes;
! 882: while(l_element_courant != NULL)
! 883: {
! 884: l_element_suivant = (*l_element_courant).suivant;
! 885:
! 886: liberation(s_etat_processus, (*l_element_courant).donnee);
! 887: free(l_element_courant);
! 888:
! 889: l_element_courant = l_element_suivant;
! 890: }
! 891:
! 892: l_element_courant = (*s_etat_processus).l_base_pile_taille_contextes;
! 893: while(l_element_courant != NULL)
! 894: {
! 895: l_element_suivant = (*l_element_courant).suivant;
! 896:
! 897: liberation(s_etat_processus, (*l_element_courant).donnee);
! 898: free(l_element_courant);
! 899:
! 900: l_element_courant = l_element_suivant;
! 901: }
! 902:
! 903: l_element_courant = (struct_liste_chainee *)
! 904: (*s_etat_processus).l_base_pile_systeme;
! 905: while(l_element_courant != NULL)
! 906: {
! 907: l_element_suivant = (struct_liste_chainee *)
! 908: (*((struct_liste_pile_systeme *)
! 909: l_element_courant)).suivant;
! 910:
! 911: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
! 912: l_element_courant)).indice_boucle);
! 913: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
! 914: l_element_courant)).limite_indice_boucle);
! 915: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
! 916: l_element_courant)).objet_de_test);
! 917:
! 918: if ((*((struct_liste_pile_systeme *)
! 919: l_element_courant)).nom_variable != NULL)
! 920: {
! 921: free((*((struct_liste_pile_systeme *)
! 922: l_element_courant)).nom_variable);
! 923: }
! 924:
! 925: free((struct_liste_pile_systeme *) l_element_courant);
! 926:
! 927: l_element_courant = l_element_suivant;
! 928: }
! 929:
! 930: l_element_courant = (*s_etat_processus).s_bibliotheques;
! 931:
! 932: while(l_element_courant != NULL)
! 933: {
! 934: l_element_suivant = (*l_element_courant).suivant;
! 935:
! 936: free((*((struct_bibliotheque *) (*l_element_courant).donnee)).nom);
! 937:
! 938: if (((*((struct_bibliotheque *) (*l_element_courant).donnee)).pid
! 939: == getpid()) && (pthread_equal((*((struct_bibliotheque *)
! 940: (*l_element_courant).donnee)).tid, pthread_self()) != 0))
! 941: {
! 942: dlclose((*((struct_bibliotheque *) (*l_element_courant).donnee))
! 943: .descripteur);
! 944: }
! 945:
! 946: free((*l_element_courant).donnee);
! 947: free(l_element_courant);
! 948:
! 949: l_element_courant = l_element_suivant;
! 950: }
! 951:
! 952: for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
! 953: {
! 954: free((*s_etat_processus).s_instructions_externes[i].nom);
! 955: free((*s_etat_processus).s_instructions_externes[i]
! 956: .nom_bibliotheque);
! 957: }
! 958:
! 959: if ((*s_etat_processus).nombre_instructions_externes != 0)
! 960: {
! 961: free((*s_etat_processus).s_instructions_externes);
! 962: }
! 963:
! 964: if ((*s_etat_processus).debug == d_vrai)
! 965: if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
! 966: {
! 967: if ((*s_etat_processus).langue == 'F')
! 968: {
! 969: printf("[%d] Fin du thread %llu\n", (int) getpid(),
! 970: (unsigned long long) pthread_self());
! 971: }
! 972: else
! 973: {
! 974: printf("[%d] End of thread %llu\n", (int) getpid(),
! 975: (unsigned long long) pthread_self());
! 976: }
! 977:
! 978: fflush(stdout);
! 979: }
! 980:
! 981: liberation(s_etat_processus, (*s_argument_thread).argument);
! 982:
! 983: for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
! 984: {
! 985: liberation(s_etat_processus,
! 986: (*s_etat_processus).corps_interruptions[i]);
! 987:
! 988: l_element_courant = (*s_etat_processus)
! 989: .pile_origine_interruptions[i];
! 990:
! 991: while(l_element_courant != NULL)
! 992: {
! 993: l_element_suivant = (*l_element_courant).suivant;
! 994:
! 995: liberation(s_etat_processus, (*l_element_courant).donnee);
! 996: free(l_element_courant);
! 997:
! 998: l_element_courant = l_element_suivant;
! 999: }
! 1000: }
! 1001:
! 1002: l_element_courant = (struct_liste_chainee *) (*s_etat_processus).s_marques;
! 1003:
! 1004: while(l_element_courant != NULL)
! 1005: {
! 1006: free((*((struct_marque *) l_element_courant)).label);
! 1007: free((*((struct_marque *) l_element_courant)).position);
! 1008: l_element_suivant = (struct_liste_chainee *)
! 1009: (*((struct_marque *) l_element_courant)).suivant;
! 1010: free((struct_marque *) l_element_courant);
! 1011: l_element_courant = l_element_suivant;
! 1012: }
! 1013:
! 1014: if ((*s_etat_processus).generateur_aleatoire != NULL)
! 1015: {
! 1016: liberation_generateur_aleatoire(s_etat_processus);
! 1017: }
! 1018:
! 1019: if ((*s_etat_processus).profilage == d_vrai)
! 1020: {
! 1021: ecriture_profil(s_etat_processus);
! 1022: liberation_profil(s_etat_processus);
! 1023: }
! 1024:
! 1025: liberation_allocateur(s_etat_processus);
! 1026:
! 1027: retrait_thread(s_etat_processus);
! 1028: pthread_mutex_destroy(&((*s_etat_processus).mutex));
! 1029:
! 1030: free((*s_etat_processus).localisation);
! 1031: free(s_etat_processus);
! 1032:
! 1033: pthread_mutex_lock(&((*s_argument_thread).mutex));
! 1034: pthread_mutex_unlock(&((*s_argument_thread).mutex));
! 1035:
! 1036: (*s_argument_thread).thread_actif = d_faux;
! 1037: pthread_exit(NULL);
! 1038: }
! 1039:
! 1040: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>