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