1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.23
4: Copyright (C) 1989-2011 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: Routines de gestion du nombre d'occurrences comme grandeur atomique
29: ================================================================================
30: entrées : structure sur l'état du processus et objet à afficher
31: --------------------------------------------------------------------------------
32: sorties : chaine de caractères
33: --------------------------------------------------------------------------------
34: effets de bord : néant
35: ================================================================================
36: */
37:
38: static inline void
39: incrementation_atomique(struct_objet *s_objet)
40: {
41: // Le mutex est sur l'objet.
42:
43: (*s_objet).nombre_occurrences++;
44:
45: BUG((*s_objet).nombre_occurrences <= 0,
46: uprintf("Capacity exceeded %ld\n", (*s_objet).nombre_occurrences));
47:
48: return;
49: }
50:
51: static inline long
52: decrementation_atomique(struct_objet *s_objet)
53: {
54: // Le mutex est sur l'objet.
55:
56: (*s_objet).nombre_occurrences--;
57: return((*s_objet).nombre_occurrences);
58: }
59:
60: void
61: initialisation_objet(struct_objet *s_objet)
62: {
63: pthread_mutexattr_t attributs_mutex;
64:
65: pthread_mutexattr_init(&attributs_mutex);
66: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);
67: pthread_mutex_init(&((*s_objet).mutex), &attributs_mutex);
68: pthread_mutexattr_destroy(&attributs_mutex);
69:
70: (*s_objet).nombre_occurrences = 1;
71:
72: return;
73: }
74:
75:
76: /*
77: ================================================================================
78: Routines d'initialisation et de purge de l'allocateur
79: ================================================================================
80: Entrées : structure sur l'état du processus et objet à afficher
81: --------------------------------------------------------------------------------
82: Sorties : chaine de caractères
83: --------------------------------------------------------------------------------
84: Effets de bord : néant
85: ================================================================================
86: */
87:
88: void
89: initialisation_allocateur(struct_processus *s_etat_processus)
90: {
91: (*s_etat_processus).estimation_taille_pile_tampon = 0;
92: (*s_etat_processus).taille_pile_tampon = 0;
93: (*s_etat_processus).pile_tampon = NULL;
94:
95: (*s_etat_processus).estimation_taille_pile_systeme_tampon = 0;
96: (*s_etat_processus).taille_pile_systeme_tampon = 0;
97: (*s_etat_processus).pile_systeme_tampon = NULL;
98:
99: (*s_etat_processus).taille_pile_objets = 0;
100: (*s_etat_processus).pile_objets = NULL;
101:
102: (*s_etat_processus).pointeur_adr = 0;
103: (*s_etat_processus).pointeur_bin = 0;
104: (*s_etat_processus).pointeur_cpl = 0;
105: (*s_etat_processus).pointeur_fct = 0;
106: (*s_etat_processus).pointeur_int = 0;
107: (*s_etat_processus).pointeur_mat = 0;
108: (*s_etat_processus).pointeur_nom = 0;
109: (*s_etat_processus).pointeur_rel = 0;
110: (*s_etat_processus).pointeur_tab = 0;
111: (*s_etat_processus).pointeur_vec = 0;
112: (*s_etat_processus).pointeur_maillons = 0;
113:
114: return;
115: }
116:
117:
118: void
119: liberation_allocateur(struct_processus *s_etat_processus)
120: {
121: int i;
122:
123: for(i = 0; i < (*s_etat_processus).pointeur_adr;
124: free((*s_etat_processus).objets_adr[i++]));
125: for(i = 0; i < (*s_etat_processus).pointeur_bin;
126: free((*s_etat_processus).objets_bin[i++]));
127: for(i = 0; i < (*s_etat_processus).pointeur_cpl;
128: free((*s_etat_processus).objets_cpl[i++]));
129: for(i = 0; i < (*s_etat_processus).pointeur_fct;
130: free((*s_etat_processus).objets_fct[i++]));
131: for(i = 0; i < (*s_etat_processus).pointeur_int;
132: free((*s_etat_processus).objets_int[i++]));
133: for(i = 0; i < (*s_etat_processus).pointeur_mat;
134: free((*s_etat_processus).objets_mat[i++]));
135: for(i = 0; i < (*s_etat_processus).pointeur_nom;
136: free((*s_etat_processus).objets_nom[i++]));
137: for(i = 0; i < (*s_etat_processus).pointeur_rel;
138: free((*s_etat_processus).objets_rel[i++]));
139: for(i = 0; i < (*s_etat_processus).pointeur_tab;
140: free((*s_etat_processus).objets_tab[i++]));
141: for(i = 0; i < (*s_etat_processus).pointeur_vec;
142: free((*s_etat_processus).objets_vec[i++]));
143: for(i = 0; i < (*s_etat_processus).pointeur_maillons;
144: free((*s_etat_processus).maillons[i++]));
145:
146: {
147: struct_liste_chainee *l_element_courant;
148: struct_liste_chainee *l_element_suivant;
149:
150: l_element_courant = (*s_etat_processus).pile_tampon;
151:
152: while(l_element_courant != NULL)
153: {
154: l_element_suivant = (*l_element_courant).suivant;
155: liberation(s_etat_processus, (*l_element_courant).donnee);
156: free(l_element_courant);
157: l_element_courant = l_element_suivant;
158: }
159: }
160:
161: {
162: struct_liste_pile_systeme *l_element_courant;
163: struct_liste_pile_systeme *l_element_suivant;
164:
165: l_element_courant = (*s_etat_processus).pile_systeme_tampon;
166:
167: while(l_element_courant != NULL)
168: {
169: l_element_suivant = (*l_element_courant).suivant;
170: free(l_element_courant);
171: l_element_courant = l_element_suivant;
172: }
173: }
174:
175: {
176: struct_objet *l_element_courant;
177: struct_objet *l_element_suivant;
178:
179: l_element_courant = (*s_etat_processus).pile_objets;
180:
181: while(l_element_courant != NULL)
182: {
183: l_element_suivant = (*l_element_courant).objet;
184:
185: if (pthread_mutex_destroy(&((*l_element_courant).mutex)) != 0)
186: {
187: (*s_etat_processus).erreur_systeme = d_es_processus;
188: BUG(1, printf("Mutex error\n"));
189: return;
190: }
191:
192: free(l_element_courant);
193: l_element_courant = l_element_suivant;
194: }
195: }
196:
197: return;
198: }
199:
200:
201: /*
202: ================================================================================
203: Routine d'allocation d'un maillon d'un objet (liste, expression...)
204: ================================================================================
205: Entrées : structure sur l'état du processus et objet à afficher
206: --------------------------------------------------------------------------------
207: Sorties : chaine de caractères
208: --------------------------------------------------------------------------------
209: Effets de bord : néant
210: ================================================================================
211: */
212:
213: void *
214: allocation_maillon(struct_processus *s_etat_processus)
215: {
216: struct_liste_chainee *s_maillon;
217:
218: if ((*s_etat_processus).pointeur_maillons > 0)
219: {
220: s_maillon = (*s_etat_processus).maillons
221: [--(*s_etat_processus).pointeur_maillons];
222: }
223: else
224: {
225: if ((s_maillon = malloc(sizeof(struct_liste_chainee))) == NULL)
226: {
227: return(NULL);
228: }
229: }
230:
231: return(s_maillon);
232: }
233:
234:
235: /*
236: ================================================================================
237: Routine d'allocation d'un maillon d'un objet (liste, expression...)
238: ================================================================================
239: Entrées : structure sur l'état du processus et objet à afficher
240: --------------------------------------------------------------------------------
241: Sorties : chaine de caractères
242: --------------------------------------------------------------------------------
243: Effets de bord : néant
244: ================================================================================
245: */
246:
247: void
248: liberation_maillon(struct_processus *s_etat_processus,
249: struct_liste_chainee *maillon)
250: {
251: if ((*s_etat_processus).pointeur_maillons < TAILLE_CACHE)
252: {
253: (*s_etat_processus).maillons
254: [(*s_etat_processus).pointeur_maillons++] = maillon;
255: }
256: else
257: {
258: free(maillon);
259: }
260:
261: return;
262: }
263:
264:
265: /*
266: ================================================================================
267: Routine d'allocation d'une structure *s_objet
268: ================================================================================
269: Entrées : structure sur l'état du processus et objet à allouer
270: --------------------------------------------------------------------------------
271: Sorties : chaine de caractères
272: --------------------------------------------------------------------------------
273: Effets de bord : néant
274: ================================================================================
275: */
276:
277: void *
278: allocation(struct_processus *s_etat_processus, enum t_type type)
279: {
280: struct_objet *s_objet;
281:
282: if (pthread_mutex_lock(&((*s_etat_processus).mutex_allocation)) != 0)
283: {
284: (*s_etat_processus).erreur_systeme = d_es_processus;
285: return(NULL);
286: }
287:
288: if ((*s_etat_processus).pile_objets == NULL)
289: {
290: if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation)) != 0)
291: {
292: (*s_etat_processus).erreur_systeme = d_es_processus;
293: return(NULL);
294: }
295:
296: // Il n'existe aucune structure struct_objet disponible dans le cache.
297:
298: if ((s_objet = malloc(sizeof(struct_objet))) == NULL)
299: {
300: return(NULL);
301: }
302:
303: initialisation_objet(s_objet);
304: }
305: else
306: {
307: // Récupération d'une structure dans le cache.
308:
309: s_objet = (*s_etat_processus).pile_objets;
310: (*s_etat_processus).pile_objets = (*s_objet).objet;
311: (*s_etat_processus).taille_pile_objets--;
312:
313: (*s_objet).nombre_occurrences = 1;
314:
315: if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation)) != 0)
316: {
317: (*s_etat_processus).erreur_systeme = d_es_processus;
318: return(NULL);
319: }
320: }
321:
322: (*s_objet).type = type;
323:
324: switch(type)
325: {
326: case ADR :
327: {
328: if ((*s_etat_processus).pointeur_adr > 0)
329: {
330: (*s_objet).objet = (*s_etat_processus).objets_adr
331: [--(*s_etat_processus).pointeur_adr];
332: }
333: else
334: {
335: if (((*s_objet).objet = malloc(sizeof(unsigned long))) == NULL)
336: {
337: free(s_objet);
338: return(NULL);
339: }
340: }
341:
342: break;
343: }
344:
345: case ALG :
346: {
347: (*s_objet).objet = NULL;
348: break;
349: }
350:
351: case BIN :
352: {
353: if ((*s_etat_processus).pointeur_bin > 0)
354: {
355: (*s_objet).objet = (*s_etat_processus).objets_bin
356: [--(*s_etat_processus).pointeur_bin];
357: }
358: else
359: {
360: if (((*s_objet).objet = malloc(sizeof(logical8))) == NULL)
361: {
362: free(s_objet);
363: return(NULL);
364: }
365: }
366:
367: break;
368: }
369:
370: case CHN :
371: {
372: (*s_objet).objet = NULL;
373: break;
374: }
375:
376: case CPL :
377: {
378: if ((*s_etat_processus).pointeur_cpl > 0)
379: {
380: (*s_objet).objet = (*s_etat_processus).objets_cpl
381: [--(*s_etat_processus).pointeur_cpl];
382: }
383: else
384: {
385: if (((*s_objet).objet = malloc(sizeof(struct_complexe16)))
386: == NULL)
387: {
388: free(s_objet);
389: return(NULL);
390: }
391: }
392:
393: break;
394: }
395:
396: case FCH :
397: {
398: if (((*s_objet).objet = malloc(sizeof(struct_fichier))) == NULL)
399: {
400: free(s_objet);
401: return(NULL);
402: }
403:
404: break;
405: }
406:
407: case FCT :
408: {
409: if ((*s_etat_processus).pointeur_fct > 0)
410: {
411: (*s_objet).objet = (*s_etat_processus).objets_fct
412: [--(*s_etat_processus).pointeur_fct];
413: }
414: else
415: {
416: if (((*s_objet).objet = malloc(sizeof(struct_fonction)))
417: == NULL)
418: {
419: free(s_objet);
420: return(NULL);
421: }
422: }
423:
424: (*((struct_fonction *) (*s_objet).objet)).fonction = NULL;
425: (*((struct_fonction *) (*s_objet).objet)).prediction_saut = NULL;
426: (*((struct_fonction *) (*s_objet).objet)).prediction_execution
427: = d_faux;
428: break;
429: }
430:
431: case INT :
432: {
433: if ((*s_etat_processus).pointeur_int > 0)
434: {
435: (*s_objet).objet = (*s_etat_processus).objets_int
436: [--(*s_etat_processus).pointeur_int];
437: }
438: else
439: {
440: if (((*s_objet).objet = malloc(sizeof(integer8))) == NULL)
441: {
442: free(s_objet);
443: return(NULL);
444: }
445: }
446:
447: break;
448: }
449:
450: case LST :
451: {
452: (*s_objet).objet = NULL;
453: break;
454: }
455:
456: case MCX :
457: {
458: if ((*s_etat_processus).pointeur_mat > 0)
459: {
460: (*s_objet).objet = (*s_etat_processus).objets_mat
461: [--(*s_etat_processus).pointeur_mat];
462: }
463: else
464: {
465: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
466: {
467: free(s_objet);
468: return(NULL);
469: }
470: }
471:
472: (*((struct_matrice *) (*s_objet).objet)).type = 'C';
473: (*((struct_matrice *) (*s_objet).objet)).nombre_lignes = 0;
474: (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes = 0;
475: (*((struct_matrice *) (*s_objet).objet)).tableau = NULL;
476: break;
477: }
478:
479: case MIN :
480: {
481: if ((*s_etat_processus).pointeur_mat > 0)
482: {
483: (*s_objet).objet = (*s_etat_processus).objets_mat
484: [--(*s_etat_processus).pointeur_mat];
485: }
486: else
487: {
488: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
489: {
490: free(s_objet);
491: return(NULL);
492: }
493: }
494:
495: (*((struct_matrice *) (*s_objet).objet)).type = 'I';
496: (*((struct_matrice *) (*s_objet).objet)).nombre_lignes = 0;
497: (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes = 0;
498: (*((struct_matrice *) (*s_objet).objet)).tableau = NULL;
499: break;
500: }
501:
502: case MRL :
503: {
504: if ((*s_etat_processus).pointeur_mat > 0)
505: {
506: (*s_objet).objet = (*s_etat_processus).objets_mat
507: [--(*s_etat_processus).pointeur_mat];
508: }
509: else
510: {
511: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
512: {
513: free(s_objet);
514: return(NULL);
515: }
516: }
517:
518: (*((struct_matrice *) (*s_objet).objet)).type = 'R';
519: (*((struct_matrice *) (*s_objet).objet)).nombre_lignes = 0;
520: (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes = 0;
521: (*((struct_matrice *) (*s_objet).objet)).tableau = NULL;
522: break;
523: }
524:
525: case MTX :
526: {
527: if (((*s_objet).objet = malloc(sizeof(struct_mutex))) == NULL)
528: {
529: free(s_objet);
530: return(NULL);
531: }
532:
533: break;
534: }
535:
536: case NOM :
537: {
538: if ((*s_etat_processus).pointeur_nom > 0)
539: {
540: (*s_objet).objet = (*s_etat_processus).objets_nom
541: [--(*s_etat_processus).pointeur_nom];
542: }
543: else
544: {
545: if (((*s_objet).objet = malloc(sizeof(struct_nom))) == NULL)
546: {
547: free(s_objet);
548: return(NULL);
549: }
550: }
551:
552: break;
553: }
554:
555: case NON :
556: {
557: (*s_objet).objet = NULL;
558: break;
559: }
560:
561: case PRC :
562: {
563: if (((*s_objet).objet = malloc(sizeof(struct_processus_fils)))
564: == NULL)
565: {
566: free(s_objet);
567: return(NULL);
568: }
569:
570: break;
571: }
572:
573: case REL :
574: {
575: if ((*s_etat_processus).pointeur_rel > 0)
576: {
577: (*s_objet).objet = (*s_etat_processus).objets_rel
578: [--(*s_etat_processus).pointeur_rel];
579: }
580: else
581: {
582: if (((*s_objet).objet = malloc(sizeof(real8))) == NULL)
583: {
584: free(s_objet);
585: return(NULL);
586: }
587: }
588:
589: break;
590: }
591:
592: case RPN :
593: {
594: (*s_objet).objet = NULL;
595: break;
596: }
597:
598: case SCK :
599: {
600: if (((*s_objet).objet = malloc(sizeof(struct_socket))) == NULL)
601: {
602: free(s_objet);
603: return(NULL);
604: }
605:
606: break;
607: }
608:
609: case SLB :
610: {
611: if (((*s_objet).objet = malloc(sizeof(struct_bibliotheque)))
612: == NULL)
613: {
614: free(s_objet);
615: return(NULL);
616: }
617:
618: break;
619: }
620:
621: case SPH :
622: {
623: if (((*s_objet).objet = malloc(sizeof(struct_semaphore))) == NULL)
624: {
625: free(s_objet);
626: return(NULL);
627: }
628:
629: break;
630: }
631:
632: case SQL :
633: {
634: if (((*s_objet).objet = malloc(sizeof(struct_connecteur_sql)))
635: == NULL)
636: {
637: free(s_objet);
638: return(NULL);
639: }
640:
641: break;
642: }
643:
644: case TBL :
645: {
646: if ((*s_etat_processus).pointeur_tab > 0)
647: {
648: (*s_objet).objet = (*s_etat_processus).objets_tab
649: [--(*s_etat_processus).pointeur_tab];
650: }
651: else
652: {
653: if (((*s_objet).objet = malloc(sizeof(struct_tableau))) == NULL)
654: {
655: free(s_objet);
656: return(NULL);
657: }
658: }
659:
660: (*((struct_tableau *) (*s_objet).objet)).nombre_elements = 0;
661: (*((struct_tableau *) (*s_objet).objet)).elements = NULL;
662: break;
663: }
664:
665: case VCX :
666: {
667: if ((*s_etat_processus).pointeur_vec > 0)
668: {
669: (*s_objet).objet = (*s_etat_processus).objets_vec
670: [--(*s_etat_processus).pointeur_vec];
671: }
672: else
673: {
674: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
675: {
676: free(s_objet);
677: return(NULL);
678: }
679: }
680:
681: (*((struct_vecteur *) (*s_objet).objet)).type = 'C';
682: (*((struct_vecteur *) (*s_objet).objet)).taille = 0;
683: (*((struct_vecteur *) (*s_objet).objet)).tableau = NULL;
684: break;
685: }
686:
687: case VIN :
688: {
689: if ((*s_etat_processus).pointeur_vec > 0)
690: {
691: (*s_objet).objet = (*s_etat_processus).objets_vec
692: [--(*s_etat_processus).pointeur_vec];
693: }
694: else
695: {
696: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
697: {
698: free(s_objet);
699: return(NULL);
700: }
701: }
702:
703: (*((struct_vecteur *) (*s_objet).objet)).type = 'I';
704: (*((struct_vecteur *) (*s_objet).objet)).taille = 0;
705: (*((struct_vecteur *) (*s_objet).objet)).tableau = NULL;
706: break;
707: }
708:
709: case VRL :
710: {
711: if ((*s_etat_processus).pointeur_vec > 0)
712: {
713: (*s_objet).objet = (*s_etat_processus).objets_vec
714: [--(*s_etat_processus).pointeur_vec];
715: }
716: else
717: {
718: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
719: {
720: free(s_objet);
721: return(NULL);
722: }
723: }
724:
725: (*((struct_vecteur *) (*s_objet).objet)).type = 'R';
726: (*((struct_vecteur *) (*s_objet).objet)).taille = 0;
727: (*((struct_vecteur *) (*s_objet).objet)).tableau = NULL;
728: break;
729: }
730:
731: default :
732: {
733: free(s_objet);
734: BUG(1, printf("Allocation failure (type %d)\n", type));
735:
736: return(NULL);
737: }
738: }
739:
740: return(s_objet);
741: }
742:
743:
744: /*
745: ================================================================================
746: Routine de libération d'une structure *s_objet
747: ================================================================================
748: Entrées : structure sur l'état du processus et objet à afficher
749: --------------------------------------------------------------------------------
750: Sorties : chaine de caractères
751: --------------------------------------------------------------------------------
752: Effets de bord : néant
753: ================================================================================
754: */
755:
756: void
757: liberation(struct_processus *s_etat_processus, struct_objet *s_objet)
758: {
759: logical1 drapeau;
760:
761: sigset_t oldset;
762: sigset_t set;
763:
764: struct_liste_chainee *l_element_courant;
765: struct_liste_chainee *l_element_suivant;
766:
767: unsigned long i;
768:
769: if (s_objet == NULL)
770: {
771: return;
772: }
773:
774: if (pthread_mutex_lock(&((*s_objet).mutex)) != 0)
775: {
776: (*s_etat_processus).erreur_systeme = d_es_processus;
777: return;
778: }
779:
780: #define return \
781: if (pthread_mutex_unlock(&((*s_objet).mutex)) != 0) \
782: { (*s_etat_processus).erreur_systeme = d_es_processus; return; } \
783: return
784:
785: BUG((*s_objet).nombre_occurrences <= 0,
786: pthread_mutex_unlock(&((*s_objet).mutex)),
787: printf("(*s_objet).nombre_occurrences=%ld\n",
788: (*s_objet).nombre_occurrences));
789:
790: switch((*s_objet).type)
791: {
792: case ADR :
793: {
794: if (decrementation_atomique(s_objet) > 0)
795: {
796: return;
797: }
798:
799: if ((*s_etat_processus).pointeur_adr < TAILLE_CACHE)
800: {
801: (*s_etat_processus).objets_adr
802: [(*s_etat_processus).pointeur_adr++] = (*s_objet).objet;
803: }
804: else
805: {
806: free((unsigned long *) ((*s_objet).objet));
807: }
808:
809: break;
810: }
811:
812: case ALG :
813: {
814: l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
815:
816: if (decrementation_atomique(s_objet) > 0)
817: { // Il reste un pointeur sur l'objet.
818: while(l_element_courant != NULL)
819: {
820: BUG((*(*l_element_courant).donnee).nombre_occurrences <= 1,
821: pthread_mutex_unlock(&((*s_objet).mutex)),
822: printf("(*(*l_element_courant).donnee)"
823: ".nombre_occurrences=%ld\n",
824: (*(*l_element_courant).donnee).nombre_occurrences));
825:
826: liberation(s_etat_processus, (*l_element_courant).donnee);
827: l_element_courant = (*l_element_courant).suivant;
828: }
829:
830: return;
831: }
832: else
833: { // Il ne reste plus aucun pointeur sur l'objet.
834: while(l_element_courant != NULL)
835: {
836: l_element_suivant = (*l_element_courant).suivant;
837: liberation(s_etat_processus, (*l_element_courant).donnee);
838: liberation_maillon(s_etat_processus, l_element_courant);
839: l_element_courant = l_element_suivant;
840: }
841: }
842:
843: break;
844: }
845:
846: case BIN :
847: {
848: if (decrementation_atomique(s_objet) > 0)
849: {
850: return;
851: }
852:
853: if ((*s_etat_processus).pointeur_bin < TAILLE_CACHE)
854: {
855: (*s_etat_processus).objets_bin
856: [(*s_etat_processus).pointeur_bin++] = (*s_objet).objet;
857: }
858: else
859: {
860: free((logical8 *) ((*s_objet).objet));
861: }
862:
863: break;
864: }
865:
866: case CHN :
867: {
868: if (decrementation_atomique(s_objet) > 0)
869: {
870: return;
871: }
872:
873: free((unsigned char *) ((*s_objet).objet));
874: break;
875: }
876:
877: case CPL :
878: {
879: if (decrementation_atomique(s_objet) > 0)
880: {
881: return;
882: }
883:
884: if ((*s_etat_processus).pointeur_cpl < TAILLE_CACHE)
885: {
886: (*s_etat_processus).objets_cpl
887: [(*s_etat_processus).pointeur_cpl++] = (*s_objet).objet;
888: }
889: else
890: {
891: free((struct_complexe16 *) ((*s_objet).objet));
892: }
893:
894: break;
895: }
896:
897: case FCH :
898: {
899: if (decrementation_atomique(s_objet) > 0)
900: {
901: BUG((*(*((struct_fichier *) (*s_objet).objet)).format)
902: .nombre_occurrences <= 1,
903: pthread_mutex_unlock(&((*s_objet).mutex)),
904: printf("(*(*((struct_fichier *) (*s_objet).objet))"
905: ".format).nombre_occurrences=%ld\n",
906: (*(*((struct_fichier *) (*s_objet).objet)).format)
907: .nombre_occurrences));
908:
909: liberation(s_etat_processus,
910: (*((struct_fichier *) (*s_objet).objet)).format);
911: return;
912: }
913:
914: liberation(s_etat_processus,
915: (*((struct_fichier *) (*s_objet).objet)).format);
916: free((unsigned char *) (*((struct_fichier *)
917: (*s_objet).objet)).nom);
918: free((struct_fichier *) ((*s_objet).objet));
919: break;
920: }
921:
922: case FCT :
923: {
924: if (decrementation_atomique(s_objet) > 0)
925: {
926: return;
927: }
928:
929: free((unsigned char *) (*((struct_fonction *)
930: (*s_objet).objet)).nom_fonction);
931:
932: if ((*s_etat_processus).pointeur_fct < TAILLE_CACHE)
933: {
934: (*s_etat_processus).objets_fct
935: [(*s_etat_processus).pointeur_fct++] = (*s_objet).objet;
936: }
937: else
938: {
939: free((struct_fonction *) (*s_objet).objet);
940: }
941:
942: break;
943: }
944:
945: case INT :
946: {
947: if (decrementation_atomique(s_objet) > 0)
948: {
949: return;
950: }
951:
952: if ((*s_etat_processus).pointeur_int < TAILLE_CACHE)
953: {
954: (*s_etat_processus).objets_int
955: [(*s_etat_processus).pointeur_int++] = (*s_objet).objet;
956: }
957: else
958: {
959: free((integer8 *) ((*s_objet).objet));
960: }
961:
962: break;
963: }
964:
965: case LST :
966: {
967: l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
968:
969: if (decrementation_atomique(s_objet) > 0)
970: { // Il reste un pointeur sur l'objet.
971: while(l_element_courant != NULL)
972: {
973: BUG((*(*l_element_courant).donnee).nombre_occurrences <= 1,
974: pthread_mutex_unlock(&((*s_objet).mutex)),
975: printf("(*(*l_element_courant).donnee)"
976: ".nombre_occurrences=%ld\n",
977: (*(*l_element_courant).donnee).nombre_occurrences));
978:
979: liberation(s_etat_processus, (*l_element_courant).donnee);
980: l_element_courant = (*l_element_courant).suivant;
981: }
982:
983: return;
984: }
985: else
986: { // Il ne reste plus aucun pointeur sur l'objet.
987: while(l_element_courant != NULL)
988: {
989: l_element_suivant = (*l_element_courant).suivant;
990: liberation(s_etat_processus, (*l_element_courant).donnee);
991: liberation_maillon(s_etat_processus, l_element_courant);
992: l_element_courant = l_element_suivant;
993: }
994: }
995:
996: break;
997: }
998:
999: case MIN :
1000: {
1001: if (decrementation_atomique(s_objet) > 0)
1002: {
1003: return;
1004: }
1005:
1006: for(i = 0; i < (*((struct_matrice *)
1007: ((*s_objet).objet))).nombre_lignes; i++)
1008: {
1009: free(((integer8 **) (*((struct_matrice *)
1010: (*s_objet).objet)).tableau)[i]);
1011: }
1012:
1013: free((integer8 **) (*((struct_matrice *)
1014: (*s_objet).objet)).tableau);
1015:
1016: if ((*s_etat_processus).pointeur_mat < TAILLE_CACHE)
1017: {
1018: (*s_etat_processus).objets_mat
1019: [(*s_etat_processus).pointeur_mat++] = (*s_objet).objet;
1020: }
1021: else
1022: {
1023: free((struct_matrice *) (*s_objet).objet);
1024: }
1025:
1026: break;
1027: }
1028:
1029: case MCX :
1030: {
1031: if (decrementation_atomique(s_objet) > 0)
1032: {
1033: return;
1034: }
1035:
1036: for(i = 0; i < (*((struct_matrice *)
1037: ((*s_objet).objet))).nombre_lignes; i++)
1038: {
1039: free(((struct_complexe16 **) (*((struct_matrice *)
1040: (*s_objet).objet)).tableau)[i]);
1041: }
1042:
1043: free((struct_complexe16 **) (*((struct_matrice *)
1044: (*s_objet).objet)).tableau);
1045:
1046: if ((*s_etat_processus).pointeur_mat < TAILLE_CACHE)
1047: {
1048: (*s_etat_processus).objets_mat
1049: [(*s_etat_processus).pointeur_mat++] = (*s_objet).objet;
1050: }
1051: else
1052: {
1053: free((struct_matrice *) (*s_objet).objet);
1054: }
1055:
1056: break;
1057: }
1058:
1059: case MRL :
1060: {
1061: if (decrementation_atomique(s_objet) > 0)
1062: {
1063: return;
1064: }
1065:
1066: for(i = 0; i < (*((struct_matrice *)
1067: ((*s_objet).objet))).nombre_lignes; i++)
1068: {
1069: free(((real8 **) (*((struct_matrice *)
1070: (*s_objet).objet)).tableau)[i]);
1071: }
1072:
1073: free((real8 **) (*((struct_matrice *) (*s_objet).objet)).tableau);
1074:
1075: if ((*s_etat_processus).pointeur_mat < TAILLE_CACHE)
1076: {
1077: (*s_etat_processus).objets_mat
1078: [(*s_etat_processus).pointeur_mat++] = (*s_objet).objet;
1079: }
1080: else
1081: {
1082: free((struct_matrice *) (*s_objet).objet);
1083: }
1084:
1085: break;
1086: }
1087:
1088: case MTX :
1089: {
1090: if (decrementation_atomique(s_objet) > 0)
1091: {
1092: return;
1093: }
1094:
1095: free((struct_mutex *) (*s_objet).objet);
1096: break;
1097: }
1098:
1099: case NOM :
1100: {
1101: if (decrementation_atomique(s_objet) > 0)
1102: {
1103: return;
1104: }
1105:
1106: free((*((struct_nom *) (*s_objet).objet)).nom);
1107:
1108: if ((*s_etat_processus).pointeur_nom < TAILLE_CACHE)
1109: {
1110: (*s_etat_processus).objets_nom
1111: [(*s_etat_processus).pointeur_nom++] = (*s_objet).objet;
1112: }
1113: else
1114: {
1115: free((struct_nom *) (*s_objet).objet);
1116: }
1117:
1118: break;
1119: }
1120:
1121: case NON :
1122: {
1123: if (decrementation_atomique(s_objet) > 0)
1124: {
1125: return;
1126: }
1127:
1128: break;
1129: }
1130:
1131: case PRC :
1132: {
1133: sigfillset(&set);
1134: pthread_sigmask(SIG_BLOCK, &set, &oldset);
1135:
1136: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
1137: (*s_objet).objet)).thread).mutex_nombre_references)) != 0)
1138: {
1139: pthread_sigmask(SIG_SETMASK, &oldset, NULL);
1140: sigpending(&set);
1141:
1142: (*s_etat_processus).erreur_systeme = d_es_processus;
1143: return;
1144: }
1145:
1146: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1147: .nombre_references--;
1148:
1149: BUG((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1150: .nombre_references < 0, uprintf(
1151: "(*(*((struct_processus_fils"
1152: " *) (*s_objet).objet)).thread).nombre_references = %d\n",
1153: (int) (*(*((struct_processus_fils *) (*s_objet).objet))
1154: .thread).nombre_references));
1155:
1156: if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1157: .nombre_references == 0)
1158: {
1159: drapeau = d_vrai;
1160: }
1161: else
1162: {
1163: drapeau = d_faux;
1164: }
1165:
1166: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
1167: (*s_objet).objet)).thread).mutex_nombre_references)) != 0)
1168: {
1169: pthread_sigmask(SIG_SETMASK, &oldset, NULL);
1170: sigpending(&set);
1171:
1172: (*s_etat_processus).erreur_systeme = d_es_processus;
1173: return;
1174: }
1175:
1176: pthread_sigmask(SIG_SETMASK, &oldset, NULL);
1177: sigpending(&set);
1178:
1179: if (drapeau == d_vrai)
1180: {
1181: pthread_mutex_destroy(&((*(*((struct_processus_fils *)
1182: (*s_objet).objet)).thread).mutex));
1183: pthread_mutex_destroy(&((*(*((struct_processus_fils *)
1184: (*s_objet).objet)).thread).mutex_nombre_references));
1185: free((*((struct_processus_fils *) (*s_objet).objet)).thread);
1186: }
1187:
1188: if (decrementation_atomique(s_objet) > 0)
1189: {
1190: BUG(drapeau == d_vrai, uprintf("(*(*((struct_processus_fils"
1191: " *) (*s_objet).objet)).thread).nombre_references "
1192: "= 0 with nombre_occurrences > 0\n"));
1193: return;
1194: }
1195:
1196: free((struct_processus_fils *) ((*s_objet).objet));
1197: break;
1198: }
1199:
1200: case REL :
1201: {
1202: if (decrementation_atomique(s_objet) > 0)
1203: {
1204: return;
1205: }
1206:
1207: if ((*s_etat_processus).pointeur_rel < TAILLE_CACHE)
1208: {
1209: (*s_etat_processus).objets_rel
1210: [(*s_etat_processus).pointeur_rel++] = (*s_objet).objet;
1211: }
1212: else
1213: {
1214: free((real8 *) ((*s_objet).objet));
1215: }
1216:
1217: break;
1218: }
1219:
1220: case RPN :
1221: {
1222: l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
1223:
1224: if (decrementation_atomique(s_objet) > 0)
1225: { // Il reste un pointeur sur l'objet.
1226: while(l_element_courant != NULL)
1227: {
1228: BUG((*(*l_element_courant).donnee).nombre_occurrences <= 1,
1229: pthread_mutex_unlock(&((*s_objet).mutex)),
1230: printf("(*(*l_element_courant).donnee)"
1231: ".nombre_occurrences=%ld\n",
1232: (*(*l_element_courant).donnee).nombre_occurrences));
1233:
1234: liberation(s_etat_processus, (*l_element_courant).donnee);
1235: l_element_courant = (*l_element_courant).suivant;
1236: }
1237:
1238: return;
1239: }
1240: else
1241: { // Il ne reste plus aucun pointeur sur l'objet.
1242: while(l_element_courant != NULL)
1243: {
1244: l_element_suivant = (*l_element_courant).suivant;
1245: liberation(s_etat_processus, (*l_element_courant).donnee);
1246: liberation_maillon(s_etat_processus, l_element_courant);
1247: l_element_courant = l_element_suivant;
1248: }
1249: }
1250:
1251: break;
1252: }
1253:
1254: case SCK :
1255: {
1256: if (decrementation_atomique(s_objet) > 0)
1257: {
1258: BUG((*(*((struct_socket *) (*s_objet).objet)).format)
1259: .nombre_occurrences <= 1,
1260: pthread_mutex_unlock(&((*s_objet).mutex)),
1261: printf("(*(*((struct_socket *) (*s_objet).objet))"
1262: ".format).nombre_occurrences=%ld\n",
1263: (*(*((struct_socket *) (*s_objet).objet)).format)
1264: .nombre_occurrences));
1265:
1266: liberation(s_etat_processus, (*((struct_socket *)
1267: (*s_objet).objet)).format);
1268: return;
1269: }
1270:
1271: liberation(s_etat_processus, (*((struct_socket *)
1272: (*s_objet).objet)).format);
1273:
1274: free((unsigned char *) (*((struct_socket *) (*s_objet).objet))
1275: .adresse);
1276: free((unsigned char *) (*((struct_socket *) (*s_objet).objet))
1277: .adresse_distante);
1278: free((struct_socket *) ((*s_objet).objet));
1279: break;
1280: }
1281:
1282: case SLB :
1283: {
1284: if (decrementation_atomique(s_objet) > 0)
1285: {
1286: return;
1287: }
1288:
1289: free((*((struct_bibliotheque *) (*s_objet).objet)).nom);
1290: free((struct_bibliotheque *) (*s_objet).objet);
1291: break;
1292: }
1293:
1294: case SPH :
1295: {
1296: if (decrementation_atomique(s_objet) > 0)
1297: {
1298: return;
1299: }
1300:
1301: free((*((struct_semaphore *) (*s_objet).objet)).nom);
1302: free((struct_bibliotheque *) (*s_objet).objet);
1303: break;
1304: }
1305:
1306: case SQL :
1307: {
1308: if (decrementation_atomique(s_objet) > 0)
1309: {
1310: return;
1311: }
1312:
1313: free((*((struct_connecteur_sql *) (*s_objet).objet)).type);
1314: free((*((struct_connecteur_sql *) (*s_objet).objet)).locale);
1315: free((struct_connecteur_sql *) (*s_objet).objet);
1316: break;
1317: }
1318:
1319: case TBL :
1320: {
1321: if (decrementation_atomique(s_objet) > 0)
1322: {
1323: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
1324: .nombre_elements; i++)
1325: {
1326: BUG((*((*((struct_tableau *)
1327: (*s_objet).objet)).elements[i]))
1328: .nombre_occurrences <= 1,
1329: pthread_mutex_unlock(&((*s_objet).mutex)),
1330: printf("(*((*((struct_tableau *) (*s_objet).objet))"
1331: ".element[%lu])).nombre_occurrences=%ld\n", i,
1332: (*((*((struct_tableau *) (*s_objet).objet))
1333: .elements[i])).nombre_occurrences));
1334: liberation(s_etat_processus, (*((struct_tableau *)
1335: (*s_objet).objet)).elements[i]);
1336: }
1337:
1338: return;
1339: }
1340:
1341: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
1342: .nombre_elements; i++)
1343: {
1344: liberation(s_etat_processus, (*((struct_tableau *)
1345: (*s_objet).objet)).elements[i]);
1346: }
1347:
1348: free((*((struct_tableau *) (*s_objet).objet)).elements);
1349:
1350: if ((*s_etat_processus).pointeur_tab < TAILLE_CACHE)
1351: {
1352: (*s_etat_processus).objets_tab
1353: [(*s_etat_processus).pointeur_tab++] = (*s_objet).objet;
1354: }
1355: else
1356: {
1357: free((struct_tableau *) (*s_objet).objet);
1358: }
1359:
1360: break;
1361: }
1362:
1363: case VIN :
1364: {
1365: if (decrementation_atomique(s_objet) > 0)
1366: {
1367: return;
1368: }
1369:
1370: free((integer8 *) (*((struct_vecteur *) (*s_objet).objet)).tableau);
1371:
1372: if ((*s_etat_processus).pointeur_vec < TAILLE_CACHE)
1373: {
1374: (*s_etat_processus).objets_vec
1375: [(*s_etat_processus).pointeur_vec++] = (*s_objet).objet;
1376: }
1377: else
1378: {
1379: free((struct_vecteur *) (*s_objet).objet);
1380: }
1381:
1382: break;
1383: }
1384:
1385: case VCX :
1386: {
1387: if (decrementation_atomique(s_objet) > 0)
1388: {
1389: return;
1390: }
1391:
1392: free((struct_complexe16 *) (*((struct_vecteur *)
1393: (*s_objet).objet)).tableau);
1394:
1395: if ((*s_etat_processus).pointeur_vec < TAILLE_CACHE)
1396: {
1397: (*s_etat_processus).objets_vec
1398: [(*s_etat_processus).pointeur_vec++] = (*s_objet).objet;
1399: }
1400: else
1401: {
1402: free((struct_vecteur *) (*s_objet).objet);
1403: }
1404:
1405: break;
1406: }
1407:
1408: case VRL :
1409: {
1410: if (decrementation_atomique(s_objet) > 0)
1411: {
1412: return;
1413: }
1414:
1415: free((real8 *) (*((struct_vecteur *) (*s_objet).objet)).tableau);
1416:
1417: if ((*s_etat_processus).pointeur_vec < TAILLE_CACHE)
1418: {
1419: (*s_etat_processus).objets_vec
1420: [(*s_etat_processus).pointeur_vec++] = (*s_objet).objet;
1421: }
1422: else
1423: {
1424: free((struct_vecteur *) (*s_objet).objet);
1425: }
1426:
1427: break;
1428: }
1429:
1430: default :
1431: {
1432: if (pthread_mutex_unlock(&((*s_objet).mutex)) != 0)
1433: {
1434: (*s_etat_processus).erreur_systeme = d_es_processus;
1435: return;
1436: }
1437:
1438: if (pthread_mutex_destroy(&((*s_objet).mutex)) != 0)
1439: {
1440: (*s_etat_processus).erreur_systeme = d_es_processus;
1441: return;
1442: }
1443:
1444: BUG(1, printf("Free failure (type %d)\n", (*s_objet).type));
1445: return;
1446: }
1447: }
1448:
1449: #undef return
1450:
1451: if (pthread_mutex_unlock(&((*s_objet).mutex)) != 0)
1452: {
1453: (*s_etat_processus).erreur_systeme = d_es_processus;
1454: return;
1455: }
1456:
1457: if (pthread_mutex_lock(&((*s_etat_processus).mutex_allocation)) != 0)
1458: {
1459: (*s_etat_processus).erreur_systeme = d_es_processus;
1460: return;
1461: }
1462:
1463: if ((*s_etat_processus).taille_pile_objets < TAILLE_CACHE)
1464: {
1465: (*s_objet).objet = (*s_etat_processus).pile_objets;
1466: (*s_etat_processus).pile_objets = s_objet;
1467: (*s_etat_processus).taille_pile_objets++;
1468: }
1469: else
1470: {
1471: if (pthread_mutex_destroy(&((*s_objet).mutex)) != 0)
1472: {
1473: pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation));
1474: (*s_etat_processus).erreur_systeme = d_es_processus;
1475: return;
1476: }
1477:
1478: free(s_objet);
1479: }
1480:
1481: if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation)) != 0)
1482: {
1483: (*s_etat_processus).erreur_systeme = d_es_processus;
1484: return;
1485: }
1486:
1487: return;
1488: }
1489:
1490:
1491: /*
1492: ================================================================================
1493: Routine de copie d'une structure *s_objet
1494: ================================================================================
1495: Entrées : structure *s_objet à copier
1496: type :
1497: 'P' : renvoie le même objet en incrémentant le nombre
1498: d'occurrence de chaque objet élémentaire ;
1499: 'O' : crée un nouvel objet en copiant chaque objet élémentaire ;
1500: 'N' : crée un nouvel objet mais les objets élémentaires
1501: sont réutilisés (voir 'P'). Dans le cas d'un objet
1502: élémentaire, 'N' et 'P' sont identiques.
1503: 'Q' : 'P' si nombre_occurrences vaut 1, 'O' sinon.
1504: 'R' : 'P' si nombre_occurrences vaut 1, 'N' sinon.
1505: --------------------------------------------------------------------------------
1506: Sorties : structure identique (tous les objets sont copiés)
1507: --------------------------------------------------------------------------------
1508: Effets de bord : néant
1509: ================================================================================
1510: */
1511:
1512: struct_objet *
1513: copie_objet(struct_processus *s_etat_processus,
1514: struct_objet *s_objet, unsigned char type)
1515: {
1516: sigset_t oldset;
1517: sigset_t set;
1518:
1519: struct_liste_chainee *l_element_base;
1520: struct_liste_chainee *l_element_courant;
1521: struct_liste_chainee *l_element_courant_ecriture;
1522: struct_liste_chainee *l_element_courant_lecture;
1523: struct_liste_chainee *l_element_suivant_ecriture;
1524: struct_liste_chainee *l_element_suivant_lecture;
1525:
1526: struct_objet *s_nouvel_objet;
1527: struct_objet *s_objet_tampon;
1528:
1529: unsigned long i;
1530: unsigned long j;
1531:
1532: if (pthread_mutex_lock(&((*s_objet).mutex)) != 0)
1533: {
1534: (*s_etat_processus).erreur_systeme = d_es_processus;
1535: return(NULL);
1536: }
1537:
1538: if (type == 'Q')
1539: {
1540: if ((*s_objet).nombre_occurrences == 1)
1541: {
1542: type = 'P';
1543: }
1544: else
1545: {
1546: type = 'O';
1547: }
1548: }
1549: else if (type == 'R')
1550: {
1551: if ((*s_objet).nombre_occurrences == 1)
1552: {
1553: type = 'P';
1554: }
1555: else
1556: {
1557: type = 'N';
1558: }
1559: }
1560:
1561: #define return(pointeur) \
1562: if (pthread_mutex_unlock(&((*s_objet).mutex))) \
1563: { (*s_etat_processus).erreur_systeme = d_es_processus; return(NULL); } \
1564: return(pointeur)
1565:
1566: switch((*s_objet).type)
1567: {
1568: case ADR :
1569: {
1570: if (type != 'O')
1571: {
1572: incrementation_atomique(s_objet);
1573: return(s_objet);
1574: }
1575:
1576: if ((s_nouvel_objet = allocation(s_etat_processus, ADR)) == NULL)
1577: {
1578: return(NULL);
1579: }
1580:
1581: (*((unsigned long *) ((*s_nouvel_objet).objet))) =
1582: (*((unsigned long *) ((*s_objet).objet)));
1583: break;
1584: }
1585:
1586: case ALG :
1587: {
1588: if (type != 'P')
1589: {
1590: if ((s_nouvel_objet = allocation(s_etat_processus, ALG))
1591: == NULL)
1592: {
1593: return(NULL);
1594: }
1595:
1596: l_element_courant_lecture = (struct_liste_chainee *)
1597: ((*s_objet).objet);
1598:
1599: l_element_base = NULL;
1600: l_element_courant_ecriture = l_element_base;
1601:
1602: while(l_element_courant_lecture != NULL)
1603: {
1604: s_objet_tampon = copie_objet(s_etat_processus,
1605: (*l_element_courant_lecture).donnee, type);
1606: l_element_suivant_ecriture = (struct_liste_chainee *)
1607: malloc(sizeof(struct_liste_chainee));
1608:
1609: if ((s_objet_tampon == NULL) ||
1610: (l_element_suivant_ecriture == NULL))
1611: {
1612: l_element_courant_lecture = (struct_liste_chainee *)
1613: ((*s_nouvel_objet).objet);
1614:
1615: while(l_element_courant_lecture != NULL)
1616: {
1617: l_element_suivant_lecture =
1618: (*l_element_courant_lecture).suivant;
1619: liberation(s_etat_processus,
1620: (*l_element_courant_lecture).donnee);
1621: free(l_element_courant_lecture);
1622: l_element_courant_lecture =
1623: l_element_suivant_lecture;
1624: }
1625:
1626: return(NULL);
1627: }
1628:
1629: if (l_element_courant_ecriture == NULL)
1630: {
1631: l_element_base = l_element_suivant_ecriture;
1632: }
1633: else
1634: {
1635: (*l_element_courant_ecriture).suivant =
1636: l_element_suivant_ecriture;
1637: }
1638:
1639: l_element_courant_ecriture = l_element_suivant_ecriture;
1640:
1641: (*l_element_courant_ecriture).donnee = s_objet_tampon;
1642: (*l_element_courant_ecriture).suivant = NULL;
1643: l_element_courant_lecture =
1644: (*l_element_courant_lecture).suivant;
1645: }
1646:
1647: (*s_nouvel_objet).objet = (void *) ((struct_liste_chainee *)
1648: l_element_base);
1649: }
1650: else // type == 'P'
1651: {
1652: incrementation_atomique(s_objet);
1653: l_element_courant = (*s_objet).objet;
1654:
1655: while(l_element_courant != NULL)
1656: {
1657: (*l_element_courant).donnee = copie_objet(s_etat_processus,
1658: (*l_element_courant).donnee, 'P');
1659: l_element_courant = (*l_element_courant).suivant;
1660: }
1661:
1662: return(s_objet);
1663: }
1664:
1665: break;
1666: }
1667:
1668: case BIN :
1669: {
1670: if (type != 'O')
1671: {
1672: incrementation_atomique(s_objet);
1673: return(s_objet);
1674: }
1675:
1676: if ((s_nouvel_objet = allocation(s_etat_processus, BIN)) == NULL)
1677: {
1678: return(NULL);
1679: }
1680:
1681: (*((logical8 *) ((*s_nouvel_objet).objet))) =
1682: (*((logical8 *) ((*s_objet).objet)));
1683: break;
1684: }
1685:
1686: case CHN :
1687: {
1688: if (type != 'O')
1689: {
1690: incrementation_atomique(s_objet);
1691: return(s_objet);
1692: }
1693:
1694: if ((s_nouvel_objet = allocation(s_etat_processus, CHN)) == NULL)
1695: {
1696: return(NULL);
1697: }
1698:
1699: (*s_nouvel_objet).objet = (void *) ((unsigned char *)
1700: malloc((strlen((unsigned char *) ((*s_objet).objet)) + 1)
1701: * sizeof(unsigned char)));
1702:
1703: if ((*s_nouvel_objet).objet == NULL)
1704: {
1705: free(s_nouvel_objet);
1706: return(NULL);
1707: }
1708:
1709: strcpy((unsigned char *) ((*s_nouvel_objet).objet),
1710: (unsigned char *) ((*s_objet).objet));
1711: break;
1712: }
1713:
1714: case CPL :
1715: {
1716: if (type != 'O')
1717: {
1718: incrementation_atomique(s_objet);
1719: return(s_objet);
1720: }
1721:
1722: if ((s_nouvel_objet = allocation(s_etat_processus, CPL)) == NULL)
1723: {
1724: return(NULL);
1725: }
1726:
1727: (*((struct_complexe16 *) ((*s_nouvel_objet).objet))) =
1728: (*((struct_complexe16 *) ((*s_objet).objet)));
1729: break;
1730: }
1731:
1732: case RPN :
1733: {
1734: if (type != 'P')
1735: {
1736: if ((s_nouvel_objet = allocation(s_etat_processus, RPN))
1737: == NULL)
1738: {
1739: return(NULL);
1740: }
1741:
1742: l_element_courant_lecture = (struct_liste_chainee *)
1743: ((*s_objet).objet);
1744:
1745: l_element_base = NULL;
1746: l_element_courant_ecriture = l_element_base;
1747:
1748: while(l_element_courant_lecture != NULL)
1749: {
1750: s_objet_tampon = copie_objet(s_etat_processus,
1751: (*l_element_courant_lecture).donnee, type);
1752: l_element_suivant_ecriture = (struct_liste_chainee *)
1753: malloc(sizeof(struct_liste_chainee));
1754:
1755: if ((s_objet_tampon == NULL) ||
1756: (l_element_suivant_ecriture == NULL))
1757: {
1758: l_element_courant_lecture = (struct_liste_chainee *)
1759: ((*s_nouvel_objet).objet);
1760:
1761: while(l_element_courant_lecture != NULL)
1762: {
1763: l_element_suivant_lecture =
1764: (*l_element_courant_lecture).suivant;
1765: liberation(s_etat_processus,
1766: (*l_element_courant_lecture).donnee);
1767: free(l_element_courant_lecture);
1768: l_element_courant_lecture =
1769: l_element_suivant_lecture;
1770: }
1771:
1772: return(NULL);
1773: }
1774:
1775: if (l_element_courant_ecriture == NULL)
1776: {
1777: l_element_base = l_element_suivant_ecriture;
1778: }
1779: else
1780: {
1781: (*l_element_courant_ecriture).suivant =
1782: l_element_suivant_ecriture;
1783: }
1784:
1785: l_element_courant_ecriture = l_element_suivant_ecriture;
1786:
1787: (*l_element_courant_ecriture).donnee = s_objet_tampon;
1788: (*l_element_courant_ecriture).suivant = NULL;
1789: l_element_courant_lecture =
1790: (*l_element_courant_lecture).suivant;
1791: }
1792:
1793: (*s_nouvel_objet).objet = (void *) ((struct_liste_chainee *)
1794: l_element_base);
1795: }
1796: else // type == 'P'
1797: {
1798: incrementation_atomique(s_objet);
1799: l_element_courant = (*s_objet).objet;
1800:
1801: while(l_element_courant != NULL)
1802: {
1803: (*l_element_courant).donnee = copie_objet(s_etat_processus,
1804: (*l_element_courant).donnee, 'P');
1805: l_element_courant = (*l_element_courant).suivant;
1806: }
1807:
1808: return(s_objet);
1809: }
1810:
1811: break;
1812: }
1813:
1814: case FCH :
1815: {
1816: if (type == 'P')
1817: {
1818: incrementation_atomique(s_objet);
1819:
1820: if (((*((struct_fichier *) ((*s_objet).objet))).format =
1821: copie_objet(s_etat_processus, (*((struct_fichier *)
1822: ((*s_objet).objet))).format, 'P')) == NULL)
1823: {
1824: return(NULL);
1825: }
1826:
1827: return(s_objet);
1828: }
1829:
1830: if ((s_nouvel_objet = allocation(s_etat_processus, FCH)) == NULL)
1831: {
1832: return(NULL);
1833: }
1834:
1835: (*((struct_fichier *) ((*s_nouvel_objet).objet))).descripteur =
1836: (*((struct_fichier *) ((*s_objet).objet))).descripteur;
1837: (*((struct_fichier *) ((*s_nouvel_objet).objet))).acces =
1838: (*((struct_fichier *) ((*s_objet).objet))).acces;
1839: (*((struct_fichier *) ((*s_nouvel_objet).objet))).binaire =
1840: (*((struct_fichier *) ((*s_objet).objet))).binaire;
1841: (*((struct_fichier *) ((*s_nouvel_objet).objet))).ouverture =
1842: (*((struct_fichier *) ((*s_objet).objet))).ouverture;
1843: (*((struct_fichier *) ((*s_nouvel_objet).objet))).protection =
1844: (*((struct_fichier *) ((*s_objet).objet))).protection;
1845: (*((struct_fichier *) ((*s_nouvel_objet).objet)))
1846: .position_clef = (*((struct_fichier *)
1847: ((*s_objet).objet))).position_clef;
1848: (*((struct_fichier *) ((*s_nouvel_objet).objet))).pid =
1849: (*((struct_fichier *) ((*s_objet).objet))).pid;
1850: (*((struct_fichier *) ((*s_nouvel_objet).objet))).tid =
1851: (*((struct_fichier *) ((*s_objet).objet))).tid;
1852:
1853: if (((*((struct_fichier *) ((*s_nouvel_objet).objet))).format =
1854: copie_objet(s_etat_processus, (*((struct_fichier *)
1855: ((*s_objet).objet))).format, type)) == NULL)
1856: {
1857: free((*s_nouvel_objet).objet);
1858: free(s_nouvel_objet);
1859: return(NULL);
1860: }
1861:
1862: if (((*((struct_fichier *) ((*s_nouvel_objet).objet))).nom =
1863: (unsigned char *) malloc((strlen((*((struct_fichier *)
1864: ((*s_objet).objet))).nom) + 1) * sizeof(unsigned char)))
1865: == NULL)
1866: {
1867: liberation(s_etat_processus, (*((struct_fichier *)
1868: (*s_nouvel_objet).objet)).format);
1869: free((*s_nouvel_objet).objet);
1870: free(s_nouvel_objet);
1871: return(NULL);
1872: }
1873:
1874: strcpy((*((struct_fichier *) ((*s_nouvel_objet).objet))).nom,
1875: (*((struct_fichier *) ((*s_objet).objet))).nom);
1876: break;
1877: }
1878:
1879: case FCT :
1880: {
1881: if (type != 'O')
1882: {
1883: /*
1884: * Remise à zéro de la prédiction pour respecter la cohérence
1885: * du saut dans les cas EXSUB et OBSUB.
1886: */
1887:
1888: (*((struct_fonction *) ((*s_objet).objet)))
1889: .prediction_saut = NULL;
1890: incrementation_atomique(s_objet);
1891: return(s_objet);
1892: }
1893:
1894: if ((s_nouvel_objet = allocation(s_etat_processus, FCT)) == NULL)
1895: {
1896: return(NULL);
1897: }
1898:
1899: if (((*((struct_fonction *) ((*s_nouvel_objet).objet)))
1900: .nom_fonction = (unsigned char *)
1901: malloc((strlen((*((struct_fonction *)
1902: ((*s_objet).objet))).nom_fonction) + 1) *
1903: sizeof(unsigned char))) == NULL)
1904: {
1905: free(s_nouvel_objet);
1906: return(NULL);
1907: }
1908:
1909: strcpy((unsigned char *) (*((struct_fonction *)
1910: ((*s_nouvel_objet).objet))).nom_fonction,
1911: (unsigned char *) (*((struct_fonction *)
1912: ((*s_objet).objet))).nom_fonction);
1913: (*((struct_fonction *) ((*s_nouvel_objet).objet)))
1914: .nombre_arguments = (*((struct_fonction *)
1915: ((*s_objet).objet))).nombre_arguments;
1916: (*((struct_fonction *) ((*s_nouvel_objet).objet))).fonction =
1917: (*((struct_fonction *) ((*s_objet).objet))).fonction;
1918: break;
1919: }
1920:
1921: case INT :
1922: {
1923: if (type != 'O')
1924: {
1925: incrementation_atomique(s_objet);
1926: return(s_objet);
1927: }
1928:
1929: if ((s_nouvel_objet = allocation(s_etat_processus, INT)) == NULL)
1930: {
1931: return(NULL);
1932: }
1933:
1934: (*((integer8 *) ((*s_nouvel_objet).objet))) =
1935: (*((integer8 *) ((*s_objet).objet)));
1936: break;
1937: }
1938:
1939: case LST :
1940: {
1941: if (type != 'P')
1942: {
1943: if ((s_nouvel_objet = allocation(s_etat_processus, LST))
1944: == NULL)
1945: {
1946: return(NULL);
1947: }
1948:
1949: l_element_courant_lecture = (struct_liste_chainee *)
1950: ((*s_objet).objet);
1951:
1952: l_element_base = NULL;
1953: l_element_courant_ecriture = l_element_base;
1954:
1955: while(l_element_courant_lecture != NULL)
1956: {
1957: s_objet_tampon = copie_objet(s_etat_processus,
1958: (*l_element_courant_lecture).donnee, type);
1959: l_element_suivant_ecriture = (struct_liste_chainee *)
1960: malloc(sizeof(struct_liste_chainee));
1961:
1962: if ((s_objet_tampon == NULL) ||
1963: (l_element_suivant_ecriture == NULL))
1964: {
1965: l_element_courant_lecture = (struct_liste_chainee *)
1966: ((*s_nouvel_objet).objet);
1967:
1968: while(l_element_courant_lecture != NULL)
1969: {
1970: l_element_suivant_lecture =
1971: (*l_element_courant_lecture).suivant;
1972: liberation(s_etat_processus,
1973: (*l_element_courant_lecture).donnee);
1974: free(l_element_courant_lecture);
1975: l_element_courant_lecture =
1976: l_element_suivant_lecture;
1977: }
1978:
1979: return(NULL);
1980: }
1981:
1982: if (l_element_courant_ecriture == NULL)
1983: {
1984: l_element_base = l_element_suivant_ecriture;
1985: }
1986: else
1987: {
1988: (*l_element_courant_ecriture).suivant =
1989: l_element_suivant_ecriture;
1990: }
1991:
1992: l_element_courant_ecriture = l_element_suivant_ecriture;
1993:
1994: (*l_element_courant_ecriture).donnee = s_objet_tampon;
1995: (*l_element_courant_ecriture).suivant = NULL;
1996: l_element_courant_lecture =
1997: (*l_element_courant_lecture).suivant;
1998: }
1999:
2000: (*s_nouvel_objet).objet = (void *) ((struct_liste_chainee *)
2001: l_element_base);
2002: }
2003: else
2004: {
2005: incrementation_atomique(s_objet);
2006: l_element_courant = (*s_objet).objet;
2007:
2008: while(l_element_courant != NULL)
2009: {
2010: (*l_element_courant).donnee = copie_objet(s_etat_processus,
2011: (*l_element_courant).donnee, 'P');
2012: l_element_courant = (*l_element_courant).suivant;
2013: }
2014:
2015: return(s_objet);
2016: }
2017:
2018: break;
2019: }
2020:
2021: case MIN :
2022: {
2023: if (type != 'O')
2024: {
2025: incrementation_atomique(s_objet);
2026: return(s_objet);
2027: }
2028:
2029: if ((s_nouvel_objet = allocation(s_etat_processus, MIN)) == NULL)
2030: {
2031: return(NULL);
2032: }
2033:
2034: (*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau =
2035: (void **) ((integer8 **) malloc(
2036: ((*((struct_matrice *) ((*s_objet).objet))).nombre_lignes)
2037: * sizeof(integer8 *)));
2038:
2039: if ((*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau
2040: == NULL)
2041: {
2042: free((*s_nouvel_objet).objet);
2043: free(s_nouvel_objet);
2044: return(NULL);
2045: }
2046:
2047: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_colonnes =
2048: (*((struct_matrice *) ((*s_objet).objet))).nombre_colonnes;
2049: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_lignes =
2050: (*((struct_matrice *) ((*s_objet).objet))).nombre_lignes;
2051: (*((struct_matrice *) ((*s_nouvel_objet).objet))).type =
2052: (*((struct_matrice *) ((*s_objet).objet))).type;
2053:
2054: for(i = 0; i < (*((struct_matrice *)
2055: ((*s_objet).objet))).nombre_lignes; i++)
2056: {
2057: if ((((integer8 **) ((*((struct_matrice *)
2058: ((*s_nouvel_objet).objet))).tableau))[i] =
2059: (void *) ((integer8 *) malloc(
2060: ((*((struct_matrice *) ((*s_objet).objet)))
2061: .nombre_colonnes) * sizeof(integer8)))) == NULL)
2062: {
2063: for(j = 0; j < i; j++)
2064: {
2065: free(((integer8 **) ((*((struct_matrice *)
2066: ((*s_nouvel_objet).objet))).tableau))[j]);
2067: }
2068:
2069: free((*s_nouvel_objet).objet);
2070: free(s_nouvel_objet);
2071: return(NULL);
2072: }
2073:
2074: for(j = 0; j < (*((struct_matrice *)
2075: ((*s_objet).objet))).nombre_colonnes; j++)
2076: {
2077: ((integer8 **) ((*((struct_matrice *)
2078: ((*s_nouvel_objet).objet))).tableau))[i][j] =
2079: ((integer8 **) ((*((struct_matrice *)
2080: ((*s_objet).objet))).tableau))[i][j];
2081: }
2082: }
2083:
2084: break;
2085: }
2086:
2087: case MCX :
2088: {
2089: if (type != 'O')
2090: {
2091: incrementation_atomique(s_objet);
2092: return(s_objet);
2093: }
2094:
2095: if ((s_nouvel_objet = allocation(s_etat_processus, MCX))
2096: == NULL)
2097: {
2098: return(NULL);
2099: }
2100:
2101: (*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau =
2102: (void **) ((struct_complexe16 **) malloc(
2103: ((*((struct_matrice *) ((*s_objet).objet))).nombre_lignes)
2104: * sizeof(struct_complexe16 *)));
2105:
2106: if ((*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau
2107: == NULL)
2108: {
2109: free((*s_nouvel_objet).objet);
2110: free(s_nouvel_objet);
2111: return(NULL);
2112: }
2113:
2114: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_colonnes =
2115: (*((struct_matrice *) ((*s_objet).objet))).nombre_colonnes;
2116: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_lignes =
2117: (*((struct_matrice *) ((*s_objet).objet))).nombre_lignes;
2118: (*((struct_matrice *) ((*s_nouvel_objet).objet))).type =
2119: (*((struct_matrice *) ((*s_objet).objet))).type;
2120:
2121: for(i = 0; i < (*((struct_matrice *)
2122: ((*s_objet).objet))).nombre_lignes; i++)
2123: {
2124: if ((((struct_complexe16 **) ((*((struct_matrice *)
2125: ((*s_nouvel_objet).objet))).tableau))[i] =
2126: (void *) ((struct_complexe16 *) malloc(
2127: ((*((struct_matrice *) ((*s_objet).objet)))
2128: .nombre_colonnes) * sizeof(struct_complexe16))))
2129: == NULL)
2130: {
2131: for(j = 0; j < i; j++)
2132: {
2133: free(((struct_complexe16 **) ((*((struct_matrice *)
2134: ((*s_nouvel_objet).objet))).tableau))[j]);
2135: }
2136:
2137: free((*s_nouvel_objet).objet);
2138: free(s_nouvel_objet);
2139: return(NULL);
2140: }
2141:
2142: for(j = 0; j < (*((struct_matrice *)
2143: ((*s_objet).objet))).nombre_colonnes; j++)
2144: {
2145: ((struct_complexe16 **) ((*((struct_matrice *)
2146: ((*s_nouvel_objet).objet))).tableau))[i][j] =
2147: ((struct_complexe16 **) ((*((struct_matrice *)
2148: ((*s_objet).objet))).tableau))[i][j];
2149: }
2150: }
2151:
2152: break;
2153: }
2154:
2155: case MRL :
2156: {
2157: if (type != 'O')
2158: {
2159: incrementation_atomique(s_objet);
2160: return(s_objet);
2161: }
2162:
2163: if ((s_nouvel_objet = allocation(s_etat_processus, MRL)) == NULL)
2164: {
2165: return(NULL);
2166: }
2167:
2168: (*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau =
2169: (void **) ((real8 **) malloc(
2170: ((*((struct_matrice *) ((*s_objet).objet))).nombre_lignes)
2171: * sizeof(real8 *)));
2172:
2173: if ((*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau
2174: == NULL)
2175: {
2176: free((*s_nouvel_objet).objet);
2177: free(s_nouvel_objet);
2178: return(NULL);
2179: }
2180:
2181: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_colonnes =
2182: (*((struct_matrice *) ((*s_objet).objet))).nombre_colonnes;
2183: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_lignes =
2184: (*((struct_matrice *) ((*s_objet).objet))).nombre_lignes;
2185: (*((struct_matrice *) ((*s_nouvel_objet).objet))).type =
2186: (*((struct_matrice *) ((*s_objet).objet))).type;
2187:
2188: for(i = 0; i < (*((struct_matrice *)
2189: ((*s_objet).objet))).nombre_lignes; i++)
2190: {
2191: if ((((real8 **) ((*((struct_matrice *)
2192: ((*s_nouvel_objet).objet))).tableau))[i] =
2193: (void *) ((real8 *) malloc(
2194: ((*((struct_matrice *) ((*s_objet).objet)))
2195: .nombre_colonnes) * sizeof(real8)))) == NULL)
2196: {
2197: for(j = 0; j < i; j++)
2198: {
2199: free(((real8 **) ((*((struct_matrice *)
2200: ((*s_nouvel_objet).objet))).tableau))[j]);
2201: }
2202:
2203: free((*s_nouvel_objet).objet);
2204: free(s_nouvel_objet);
2205: return(NULL);
2206: }
2207:
2208: for(j = 0; j < (*((struct_matrice *)
2209: ((*s_objet).objet))).nombre_colonnes; j++)
2210: {
2211: ((real8 **) ((*((struct_matrice *)
2212: ((*s_nouvel_objet).objet))).tableau))[i][j] =
2213: ((real8 **) ((*((struct_matrice *)
2214: ((*s_objet).objet))).tableau))[i][j];
2215: }
2216: }
2217:
2218: break;
2219: }
2220:
2221: case MTX :
2222: {
2223: if (type != 'O')
2224: {
2225: incrementation_atomique(s_objet);
2226: return(s_objet);
2227: }
2228:
2229: if ((s_nouvel_objet = allocation(s_etat_processus, MTX)) == NULL)
2230: {
2231: return(NULL);
2232: }
2233:
2234: (*((struct_mutex *) ((*s_nouvel_objet).objet))).mutex =
2235: (*((struct_mutex *) ((*s_objet).objet))).mutex;
2236: break;
2237: }
2238:
2239: case NOM :
2240: {
2241: if (type != 'O')
2242: {
2243: incrementation_atomique(s_objet);
2244: return(s_objet);
2245: }
2246:
2247: if ((s_nouvel_objet = allocation(s_etat_processus, NOM)) == NULL)
2248: {
2249: return(NULL);
2250: }
2251:
2252: (*((struct_nom *) (*s_nouvel_objet).objet)).nom = malloc((
2253: strlen((*((struct_nom *) (*s_objet).objet)).nom) + 1) *
2254: sizeof(unsigned char));
2255:
2256: if ((*((struct_nom *) (*s_nouvel_objet).objet)).nom == NULL)
2257: {
2258: free((*s_nouvel_objet).objet);
2259: free(s_nouvel_objet);
2260: return(NULL);
2261: }
2262:
2263: strcpy((*((struct_nom *) (*s_nouvel_objet).objet)).nom,
2264: (*((struct_nom *) (*s_objet).objet)).nom);
2265: (*((struct_nom *) (*s_nouvel_objet).objet)).symbole =
2266: (*((struct_nom *) (*s_objet).objet)).symbole;
2267: break;
2268: }
2269:
2270: case NON :
2271: {
2272: if (type != 'O')
2273: {
2274: incrementation_atomique(s_objet);
2275: return(s_objet);
2276: }
2277:
2278: if ((s_nouvel_objet = allocation(s_etat_processus, NON)) == NULL)
2279: {
2280: return(NULL);
2281: }
2282:
2283: (*s_nouvel_objet).objet = NULL;
2284: break;
2285: }
2286:
2287: case PRC :
2288: {
2289: sigfillset(&set);
2290: pthread_sigmask(SIG_BLOCK, &set, &oldset);
2291:
2292: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
2293: (*s_objet).objet)).thread).mutex_nombre_references)) != 0)
2294: {
2295: pthread_sigmask(SIG_SETMASK, &oldset, NULL);
2296: sigpending(&set);
2297:
2298: return(NULL);
2299: }
2300:
2301: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
2302: .nombre_references++;
2303:
2304: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
2305: (*s_objet).objet)).thread).mutex_nombre_references)) != 0)
2306: {
2307: pthread_sigmask(SIG_SETMASK, &oldset, NULL);
2308: sigpending(&set);
2309:
2310: return(NULL);
2311: }
2312:
2313: pthread_sigmask(SIG_SETMASK, &oldset, NULL);
2314: sigpending(&set);
2315:
2316: if (type != 'O')
2317: {
2318: incrementation_atomique(s_objet);
2319: return(s_objet);
2320: }
2321:
2322: if ((s_nouvel_objet = allocation(s_etat_processus, PRC)) == NULL)
2323: {
2324: return(NULL);
2325: }
2326:
2327: (*((struct_processus_fils *) (*s_nouvel_objet).objet)) =
2328: (*((struct_processus_fils *) (*s_objet).objet));
2329: break;
2330: }
2331:
2332: case REL :
2333: {
2334: if (type != 'O')
2335: {
2336: incrementation_atomique(s_objet);
2337: return(s_objet);
2338: }
2339:
2340: if ((s_nouvel_objet = allocation(s_etat_processus, REL)) == NULL)
2341: {
2342: return(NULL);
2343: }
2344:
2345: (*((real8 *) ((*s_nouvel_objet).objet))) =
2346: (*((real8 *) ((*s_objet).objet)));
2347: break;
2348: }
2349:
2350: case SCK :
2351: {
2352: if (type == 'P')
2353: {
2354: incrementation_atomique(s_objet);
2355:
2356: if (((*((struct_socket *) ((*s_objet).objet)))
2357: .format = copie_objet(s_etat_processus,
2358: (*((struct_socket *) ((*s_objet).objet))).format, 'P'))
2359: == NULL)
2360: {
2361: return(NULL);
2362: }
2363:
2364: return(s_objet);
2365: }
2366:
2367: if ((s_nouvel_objet = allocation(s_etat_processus, SCK)) == NULL)
2368: {
2369: return(NULL);
2370: }
2371:
2372: (*((struct_socket *) ((*s_nouvel_objet).objet))).socket =
2373: (*((struct_socket *) ((*s_objet).objet))).socket;
2374: (*((struct_socket *) ((*s_nouvel_objet).objet))).domaine =
2375: (*((struct_socket *) ((*s_objet).objet))).domaine;
2376: (*((struct_socket *) ((*s_nouvel_objet).objet))).socket_en_ecoute =
2377: (*((struct_socket *) ((*s_objet).objet))).socket_en_ecoute;
2378: (*((struct_socket *) ((*s_nouvel_objet).objet))).socket_connectee =
2379: (*((struct_socket *) ((*s_objet).objet))).socket_connectee;
2380: (*((struct_socket *) ((*s_nouvel_objet).objet))).pid =
2381: (*((struct_socket *) ((*s_objet).objet))).pid;
2382: (*((struct_socket *) ((*s_nouvel_objet).objet))).binaire =
2383: (*((struct_socket *) ((*s_objet).objet))).binaire;
2384: (*((struct_socket *) ((*s_nouvel_objet).objet))).effacement =
2385: (*((struct_socket *) ((*s_objet).objet))).effacement;
2386: (*((struct_socket *) ((*s_nouvel_objet).objet))).protection =
2387: (*((struct_socket *) ((*s_objet).objet))).protection;
2388: (*((struct_socket *) ((*s_nouvel_objet).objet))).localisation =
2389: (*((struct_socket *) ((*s_objet).objet))).localisation;
2390: (*((struct_socket *) ((*s_nouvel_objet).objet))).pid =
2391: (*((struct_socket *) ((*s_objet).objet))).pid;
2392: (*((struct_socket *) ((*s_nouvel_objet).objet))).tid =
2393: (*((struct_socket *) ((*s_objet).objet))).tid;
2394:
2395: if (((*((struct_socket *) ((*s_nouvel_objet).objet))).format =
2396: copie_objet(s_etat_processus, (*((struct_socket *)
2397: ((*s_objet).objet))).format, type)) == NULL)
2398: {
2399: free((*s_nouvel_objet).objet);
2400: free(s_nouvel_objet);
2401: return(NULL);
2402: }
2403:
2404: if (((*((struct_socket *) ((*s_nouvel_objet).objet))).adresse =
2405: (unsigned char *) malloc((strlen((*((struct_socket *)
2406: ((*s_objet).objet))).adresse) + 1) * sizeof(unsigned char)))
2407: == NULL)
2408: {
2409: liberation(s_etat_processus, (*((struct_fichier *)
2410: (*s_nouvel_objet).objet)).format);
2411: free((*s_nouvel_objet).objet);
2412: free(s_nouvel_objet);
2413: return(NULL);
2414: }
2415:
2416: strcpy((*((struct_socket *) ((*s_nouvel_objet).objet)))
2417: .adresse, (*((struct_socket *) ((*s_objet).objet)))
2418: .adresse);
2419:
2420: if (((*((struct_socket *) ((*s_nouvel_objet).objet)))
2421: .adresse_distante = malloc((strlen((*((struct_socket *)
2422: ((*s_objet).objet))).adresse_distante) + 1) *
2423: sizeof(unsigned char))) == NULL)
2424: {
2425: liberation(s_etat_processus, (*((struct_fichier *)
2426: (*s_nouvel_objet).objet)).format);
2427: free((*s_nouvel_objet).objet);
2428: free(s_nouvel_objet);
2429: return(NULL);
2430: }
2431:
2432: strcpy((*((struct_socket *) ((*s_nouvel_objet).objet)))
2433: .adresse_distante, (*((struct_socket *) ((*s_objet).objet)))
2434: .adresse_distante);
2435:
2436: strcpy((*((struct_socket *) ((*s_nouvel_objet).objet))).type,
2437: (*((struct_socket *) ((*s_objet).objet))).type);
2438: break;
2439: }
2440:
2441: case SLB :
2442: {
2443: if (type != 'O')
2444: {
2445: incrementation_atomique(s_objet);
2446: return(s_objet);
2447: }
2448:
2449: if ((s_nouvel_objet = allocation(s_etat_processus, SLB)) == NULL)
2450: {
2451: return(NULL);
2452: }
2453:
2454: if (((*((struct_bibliotheque *) ((*s_nouvel_objet).objet))).nom =
2455: (unsigned char *) malloc((strlen((*((struct_bibliotheque *)
2456: ((*s_objet).objet))).nom) + 1) * sizeof(unsigned char)))
2457: == NULL)
2458: {
2459: free((*s_nouvel_objet).objet);
2460: free(s_nouvel_objet);
2461: return(NULL);
2462: }
2463:
2464: strcpy((*((struct_bibliotheque *) ((*s_nouvel_objet).objet))).nom,
2465: (*((struct_bibliotheque *) ((*s_objet).objet))).nom);
2466:
2467: /*
2468: * C'est objet est non modifiable et est un pointeur
2469: * sur un objet système. Seul la référence est copiée.
2470: */
2471:
2472: (*((struct_bibliotheque *) (*s_nouvel_objet).objet)).descripteur =
2473: (*((struct_bibliotheque *) (*s_objet).objet)).descripteur;
2474: (*((struct_bibliotheque *) (*s_nouvel_objet).objet)).pid =
2475: (*((struct_bibliotheque *) (*s_objet).objet)).pid;
2476: (*((struct_bibliotheque *) (*s_nouvel_objet).objet)).tid =
2477: (*((struct_bibliotheque *) (*s_objet).objet)).tid;
2478: break;
2479: }
2480:
2481: case SPH :
2482: {
2483: if (type != 'O')
2484: {
2485: incrementation_atomique(s_objet);
2486: return(s_objet);
2487: }
2488:
2489: if ((s_nouvel_objet = allocation(s_etat_processus, SPH)) == NULL)
2490: {
2491: return(NULL);
2492: }
2493:
2494: if (((*((struct_semaphore *) (*s_nouvel_objet).objet)).nom =
2495: malloc((strlen((*((struct_semaphore *) (*s_objet).objet))
2496: .nom) + 1) * sizeof(unsigned char))) == NULL)
2497: {
2498: free((*s_nouvel_objet).objet);
2499: free(s_nouvel_objet);
2500: return(NULL);
2501: }
2502:
2503: strcpy((*((struct_semaphore *) (*s_nouvel_objet).objet)).nom,
2504: (*((struct_semaphore *) (*s_objet).objet)).nom);
2505: break;
2506: }
2507:
2508: case SQL :
2509: {
2510: if (type != 'O')
2511: {
2512: incrementation_atomique(s_objet);
2513: return(s_objet);
2514: }
2515:
2516: if ((s_nouvel_objet = allocation(s_etat_processus, SQL)) == NULL)
2517: {
2518: return(NULL);
2519: }
2520:
2521: (*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).pid =
2522: (*((struct_connecteur_sql *) (*s_objet).objet)).pid;
2523: (*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).tid =
2524: (*((struct_connecteur_sql *) (*s_objet).objet)).tid;
2525: (*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).descripteur =
2526: (*((struct_connecteur_sql *) (*s_objet).objet)).descripteur;
2527:
2528: if (((*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).type =
2529: malloc((strlen((*((struct_connecteur_sql *)
2530: (*s_objet).objet)).type) + 1) * sizeof(unsigned char)))
2531: == NULL)
2532: {
2533: free(s_nouvel_objet);
2534: return(NULL);
2535: }
2536:
2537: strcpy((*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).type,
2538: (*((struct_connecteur_sql *) (*s_objet).objet)).type);
2539:
2540: if ((*((struct_connecteur_sql *) (*s_objet).objet)).locale != NULL)
2541: {
2542: if (((*((struct_connecteur_sql *) (*s_nouvel_objet).objet))
2543: .locale = malloc((strlen((*((struct_connecteur_sql *)
2544: (*s_objet).objet)).locale) + 1) *
2545: sizeof(unsigned char))) == NULL)
2546: {
2547: free((*((struct_connecteur_sql *) (*s_nouvel_objet).objet))
2548: .locale);
2549: free(s_nouvel_objet);
2550: return(NULL);
2551: }
2552:
2553: strcpy((*((struct_connecteur_sql *) (*s_nouvel_objet).objet))
2554: .locale, (*((struct_connecteur_sql *)
2555: (*s_objet).objet)).locale);
2556: }
2557: else
2558: {
2559: (*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).locale
2560: = NULL;
2561: }
2562:
2563: break;
2564: }
2565:
2566: case TBL :
2567: {
2568: if (type != 'P')
2569: {
2570: if ((s_nouvel_objet = allocation(s_etat_processus, TBL))
2571: == NULL)
2572: {
2573: return(NULL);
2574: }
2575:
2576: (*((struct_tableau *) (*s_nouvel_objet).objet))
2577: .nombre_elements = (*((struct_tableau *)
2578: (*s_objet).objet)).nombre_elements;
2579:
2580: if (((*((struct_tableau *) (*s_nouvel_objet).objet)).elements =
2581: malloc((*((struct_tableau *) (*s_objet).objet))
2582: .nombre_elements * sizeof(struct_objet *))) == NULL)
2583: {
2584: return(NULL);
2585: }
2586:
2587: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
2588: .nombre_elements; i++)
2589: {
2590: if (((*((struct_tableau *) (*s_nouvel_objet).objet))
2591: .elements[i] = copie_objet(s_etat_processus,
2592: (*((struct_tableau *) (*s_objet).objet))
2593: .elements[i], type)) == NULL)
2594: {
2595: for(j = 0; j < i; j++)
2596: {
2597: liberation(s_etat_processus, (*((struct_tableau *)
2598: (*s_nouvel_objet).objet)).elements[j]);
2599: }
2600:
2601: free((*((struct_tableau *) (*s_nouvel_objet).objet))
2602: .elements);
2603: free((*s_nouvel_objet).objet);
2604: free(s_nouvel_objet);
2605:
2606: return(NULL);
2607: }
2608: }
2609: }
2610: else
2611: {
2612: incrementation_atomique(s_objet);
2613:
2614: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
2615: .nombre_elements; i++)
2616: {
2617: (*((struct_tableau *) (*s_objet).objet)).elements[i] =
2618: copie_objet(s_etat_processus, (*((struct_tableau *)
2619: (*s_objet).objet)).elements[i], 'P');
2620: }
2621:
2622: return(s_objet);
2623: }
2624:
2625: break;
2626: }
2627:
2628: case VIN :
2629: {
2630: if (type != 'O')
2631: {
2632: incrementation_atomique(s_objet);
2633: return(s_objet);
2634: }
2635:
2636: if ((s_nouvel_objet = allocation(s_etat_processus, VIN)) == NULL)
2637: {
2638: return(NULL);
2639: }
2640:
2641: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau =
2642: (void *) ((integer8 *) malloc(
2643: ((*((struct_vecteur *) ((*s_objet).objet))).taille)
2644: * sizeof(integer8)));
2645:
2646: if ((*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau
2647: == NULL)
2648: {
2649: free((*s_nouvel_objet).objet);
2650: free(s_nouvel_objet);
2651: return(NULL);
2652: }
2653:
2654: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).taille =
2655: (*((struct_vecteur *) ((*s_objet).objet))).taille;
2656: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).type =
2657: (*((struct_vecteur *) ((*s_objet).objet))).type;
2658:
2659: for(i = 0; i < (*((struct_vecteur *) ((*s_objet).objet))).taille;
2660: i++)
2661: {
2662: ((integer8 *) ((*((struct_vecteur *)
2663: ((*s_nouvel_objet).objet))).tableau))[i] =
2664: ((integer8 *) ((*((struct_vecteur *)
2665: ((*s_objet).objet))).tableau))[i];
2666: }
2667:
2668: break;
2669: }
2670:
2671: case VCX :
2672: {
2673: if (type != 'O')
2674: {
2675: incrementation_atomique(s_objet);
2676: return(s_objet);
2677: }
2678:
2679: if ((s_nouvel_objet = allocation(s_etat_processus, VCX)) == NULL)
2680: {
2681: return(NULL);
2682: }
2683:
2684: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau =
2685: (void *) ((struct_complexe16 *) malloc(
2686: ((*((struct_vecteur *) ((*s_objet).objet))).taille)
2687: * sizeof(struct_complexe16)));
2688:
2689: if ((*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau
2690: == NULL)
2691: {
2692: free((*s_nouvel_objet).objet);
2693: free(s_nouvel_objet);
2694: return(NULL);
2695: }
2696:
2697: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).taille =
2698: (*((struct_vecteur *) ((*s_objet).objet))).taille;
2699: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).type =
2700: (*((struct_vecteur *) ((*s_objet).objet))).type;
2701:
2702: for(i = 0; i < (*((struct_vecteur *) ((*s_objet).objet))).taille;
2703: i++)
2704: {
2705: ((struct_complexe16 *) ((*((struct_vecteur *)
2706: ((*s_nouvel_objet).objet))).tableau))[i] =
2707: ((struct_complexe16 *) ((*((struct_vecteur *)
2708: ((*s_objet).objet))).tableau))[i];
2709: }
2710:
2711: break;
2712: }
2713:
2714: case VRL :
2715: {
2716: if (type != 'O')
2717: {
2718: incrementation_atomique(s_objet);
2719: return(s_objet);
2720: }
2721:
2722: if ((s_nouvel_objet = allocation(s_etat_processus, VRL)) == NULL)
2723: {
2724: return(NULL);
2725: }
2726:
2727: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau =
2728: (void *) ((real8 *) malloc(
2729: ((*((struct_vecteur *) ((*s_objet).objet))).taille)
2730: * sizeof(real8)));
2731:
2732: if ((*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau
2733: == NULL)
2734: {
2735: free((*s_nouvel_objet).objet);
2736: free(s_nouvel_objet);
2737: return(NULL);
2738: }
2739:
2740: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).taille =
2741: (*((struct_vecteur *) ((*s_objet).objet))).taille;
2742: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).type =
2743: (*((struct_vecteur *) ((*s_objet).objet))).type;
2744:
2745: for(i = 0; i < (*((struct_vecteur *) ((*s_objet).objet))).taille;
2746: i++)
2747: {
2748: ((real8 *) ((*((struct_vecteur *)
2749: ((*s_nouvel_objet).objet))).tableau))[i] =
2750: ((real8 *) ((*((struct_vecteur *)
2751: ((*s_objet).objet))).tableau))[i];
2752: }
2753:
2754: break;
2755: }
2756:
2757: default :
2758: {
2759: return(NULL);
2760: }
2761: }
2762:
2763: return(s_nouvel_objet);
2764:
2765: #undef return
2766: }
2767:
2768:
2769: /*
2770: ================================================================================
2771: Routine de copie d'une structure de description d'un processus
2772: ================================================================================
2773: Entrées : pointeur sur la structure de description d'un processus
2774: --------------------------------------------------------------------------------
2775: Sorties : structure identique (tous les objets sont copiés)
2776: --------------------------------------------------------------------------------
2777: Effets de bord : néant
2778: ================================================================================
2779: */
2780:
2781: struct_processus *
2782: copie_etat_processus(struct_processus *s_etat_processus)
2783: {
2784: pthread_mutexattr_t attributs_mutex;
2785:
2786: struct_liste_chainee *l_element_lecture;
2787: struct_liste_chainee *l_element_precedent;
2788: struct_liste_chainee *l_element_suivant;
2789:
2790: struct_processus *s_nouvel_etat_processus;
2791:
2792: unsigned long i;
2793:
2794: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
2795: {
2796: (*s_etat_processus).erreur_systeme = d_es_processus;
2797: return(NULL);
2798: }
2799:
2800: if ((s_nouvel_etat_processus = malloc(sizeof(struct_processus))) == NULL)
2801: {
2802: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2803: return(NULL);
2804: }
2805:
2806: (*s_nouvel_etat_processus) = (*s_etat_processus);
2807:
2808: // On réinitialise l'allocateur.
2809:
2810: initialisation_allocateur(s_nouvel_etat_processus);
2811:
2812: /*
2813: * (*s_etat_processus).definition_chainee,
2814: * (*s_etat_processus).nom_fichier_source,
2815: * (*s_etat_processus).nom_fichier_historique et
2816: * (*s_etat_processus).chemin_fichier_temporaires
2817: * n'ont aucune raison de changer.
2818: */
2819:
2820: # ifndef SEMAPHORES_NOMMES
2821: sem_init(&((*s_nouvel_etat_processus).semaphore_fork), 0, 0);
2822: # else
2823: if (((*s_nouvel_etat_processus).semaphore_fork = sem_init2(0, sem_fork))
2824: == SEM_FAILED)
2825: {
2826: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2827: return(NULL);
2828: }
2829: # endif
2830:
2831: (*s_nouvel_etat_processus).var_volatile_processus_pere = 0;
2832: (*s_nouvel_etat_processus).var_volatile_processus_racine = 0;
2833: (*s_nouvel_etat_processus).fichiers_graphiques = NULL;
2834: (*s_nouvel_etat_processus).entree_standard = NULL;
2835: (*s_nouvel_etat_processus).s_marques = NULL;
2836: (*s_nouvel_etat_processus).requete_nouveau_plan = d_vrai;
2837: (*s_nouvel_etat_processus).mise_a_jour_trace_requise = d_faux;
2838: (*s_nouvel_etat_processus).nom_fichier_impression = NULL;
2839: (*s_nouvel_etat_processus).expression_courante = NULL;
2840: (*s_nouvel_etat_processus).objet_courant = NULL;
2841: (*s_nouvel_etat_processus).processus_detache = d_faux;
2842: (*s_nouvel_etat_processus).evaluation_forcee = 'N';
2843:
2844: (*s_nouvel_etat_processus).nombre_objets_envoyes_non_lus = 0;
2845: (*s_nouvel_etat_processus).nombre_objets_injectes = 0;
2846: (*s_nouvel_etat_processus).presence_fusible = d_faux;
2847: (*s_nouvel_etat_processus).thread_fusible = 0;
2848: (*s_nouvel_etat_processus).niveau_initial =
2849: (*s_etat_processus).niveau_courant;
2850: (*s_nouvel_etat_processus).presence_pipes = d_faux;
2851: (*s_nouvel_etat_processus).debug_programme = d_faux;
2852: (*s_nouvel_etat_processus).s_fichiers = NULL;
2853: (*s_nouvel_etat_processus).s_connecteurs_sql = NULL;
2854:
2855: // On réinitialise toutes les interruptions.
2856:
2857: (*s_nouvel_etat_processus).traitement_interruption = 'N';
2858: (*s_nouvel_etat_processus).traitement_interruptible = 'Y';
2859: (*s_nouvel_etat_processus).nombre_interruptions_en_queue = 0;
2860: (*s_nouvel_etat_processus).nombre_interruptions_non_affectees = 0;
2861:
2862: (*s_nouvel_etat_processus).at_exit = NULL;
2863: (*s_nouvel_etat_processus).at_poke = NULL;
2864: (*s_nouvel_etat_processus).traitement_at_poke = 'N';
2865:
2866: for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
2867: {
2868: (*s_nouvel_etat_processus).corps_interruptions[i] = NULL;
2869: (*s_nouvel_etat_processus).masque_interruptions[i] = 'N';
2870: (*s_nouvel_etat_processus).queue_interruptions[i] = 0;
2871: (*s_nouvel_etat_processus).pile_origine_interruptions[i] = NULL;
2872: }
2873:
2874: if ((*s_nouvel_etat_processus).generateur_aleatoire != NULL)
2875: {
2876: if (((*s_nouvel_etat_processus).generateur_aleatoire =
2877: gsl_rng_clone((*s_etat_processus).generateur_aleatoire))
2878: == NULL)
2879: {
2880: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2881: return(NULL);
2882: }
2883:
2884: gsl_rng_set((*s_nouvel_etat_processus).generateur_aleatoire,
2885: gsl_rng_get((*s_etat_processus).generateur_aleatoire));
2886: }
2887:
2888: // Copie de la localisation
2889:
2890: if (((*s_nouvel_etat_processus).localisation = malloc((strlen(
2891: (*s_etat_processus).localisation) + 1) * sizeof(unsigned char)))
2892: == NULL)
2893: {
2894: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2895: return(NULL);
2896: }
2897:
2898: strcpy((*s_nouvel_etat_processus).localisation,
2899: (*s_etat_processus).localisation);
2900:
2901: if ((*s_etat_processus).indep != NULL)
2902: {
2903: if (((*s_nouvel_etat_processus).indep = copie_objet(s_etat_processus,
2904: (*s_etat_processus).indep, 'P')) == NULL)
2905: {
2906: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
2907: {
2908: (*s_etat_processus).erreur_systeme = d_es_processus;
2909: return(NULL);
2910: }
2911:
2912: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2913: return(NULL);
2914: }
2915: }
2916: else
2917: {
2918: (*s_nouvel_etat_processus).indep = NULL;
2919: }
2920:
2921: if ((*s_etat_processus).depend != NULL)
2922: {
2923: if (((*s_nouvel_etat_processus).depend = copie_objet(s_etat_processus,
2924: (*s_etat_processus).depend, 'P')) == NULL)
2925: {
2926: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
2927: {
2928: (*s_etat_processus).erreur_systeme = d_es_processus;
2929: return(NULL);
2930: }
2931:
2932: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2933: return(NULL);
2934: }
2935: }
2936: else
2937: {
2938: (*s_nouvel_etat_processus).depend = NULL;
2939: }
2940:
2941: if ((*s_etat_processus).parametres_courbes_de_niveau != NULL)
2942: {
2943: if (((*s_nouvel_etat_processus).parametres_courbes_de_niveau =
2944: copie_objet(s_etat_processus, (*s_etat_processus)
2945: .parametres_courbes_de_niveau, 'P')) == NULL)
2946: {
2947: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
2948: {
2949: (*s_etat_processus).erreur_systeme = d_es_processus;
2950: return(NULL);
2951: }
2952:
2953: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2954: return(NULL);
2955: }
2956: }
2957: else
2958: {
2959: (*s_nouvel_etat_processus).parametres_courbes_de_niveau = NULL;
2960: }
2961:
2962: (*s_nouvel_etat_processus).instruction_derniere_erreur = NULL;
2963:
2964: if (((*s_etat_processus).instruction_courante != NULL) &&
2965: (*s_etat_processus).evaluation_expression_compilee == 'N')
2966: {
2967: if (((*s_nouvel_etat_processus).instruction_courante = malloc((strlen(
2968: (*s_etat_processus).instruction_courante) + 1) *
2969: sizeof(unsigned char))) == NULL)
2970: {
2971: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
2972: {
2973: (*s_etat_processus).erreur_systeme = d_es_processus;
2974: return(NULL);
2975: }
2976:
2977: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2978: return(NULL);
2979: }
2980:
2981: strcpy((*s_nouvel_etat_processus).instruction_courante,
2982: (*s_etat_processus).instruction_courante);
2983: }
2984: else
2985: {
2986: (*s_nouvel_etat_processus).instruction_courante = NULL;
2987: }
2988:
2989: if ((*s_etat_processus).label_x != NULL)
2990: {
2991: if (((*s_nouvel_etat_processus).label_x = malloc((strlen(
2992: (*s_etat_processus).label_x) + 1) *
2993: sizeof(unsigned char))) == NULL)
2994: {
2995: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
2996: {
2997: (*s_etat_processus).erreur_systeme = d_es_processus;
2998: return(NULL);
2999: }
3000:
3001: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3002: return(NULL);
3003: }
3004:
3005: strcpy((*s_nouvel_etat_processus).label_x,
3006: (*s_etat_processus).label_x);
3007: }
3008: else
3009: {
3010: (*s_nouvel_etat_processus).label_x = NULL;
3011: }
3012:
3013: if ((*s_etat_processus).label_y != NULL)
3014: {
3015: if (((*s_nouvel_etat_processus).label_y = malloc((strlen(
3016: (*s_etat_processus).label_y) + 1) *
3017: sizeof(unsigned char))) == NULL)
3018: {
3019: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3020: {
3021: (*s_etat_processus).erreur_systeme = d_es_processus;
3022: return(NULL);
3023: }
3024:
3025: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3026: return(NULL);
3027: }
3028:
3029: strcpy((*s_nouvel_etat_processus).label_y,
3030: (*s_etat_processus).label_y);
3031: }
3032: else
3033: {
3034: (*s_nouvel_etat_processus).label_y = NULL;
3035: }
3036:
3037: if ((*s_etat_processus).label_z != NULL)
3038: {
3039: if (((*s_nouvel_etat_processus).label_z = malloc((strlen(
3040: (*s_etat_processus).label_z) + 1) *
3041: sizeof(unsigned char))) == NULL)
3042: {
3043: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3044: {
3045: (*s_etat_processus).erreur_systeme = d_es_processus;
3046: return(NULL);
3047: }
3048:
3049: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3050: return(NULL);
3051: }
3052:
3053: strcpy((*s_nouvel_etat_processus).label_z,
3054: (*s_etat_processus).label_z);
3055: }
3056: else
3057: {
3058: (*s_nouvel_etat_processus).label_z = NULL;
3059: }
3060:
3061: if ((*s_etat_processus).titre != NULL)
3062: {
3063: if (((*s_nouvel_etat_processus).titre = malloc((strlen(
3064: (*s_etat_processus).titre) + 1) *
3065: sizeof(unsigned char))) == NULL)
3066: {
3067: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3068: {
3069: (*s_etat_processus).erreur_systeme = d_es_processus;
3070: return(NULL);
3071: }
3072:
3073: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3074: return(NULL);
3075: }
3076:
3077: strcpy((*s_nouvel_etat_processus).titre,
3078: (*s_etat_processus).titre);
3079: }
3080: else
3081: {
3082: (*s_nouvel_etat_processus).titre = NULL;
3083: }
3084:
3085: if ((*s_etat_processus).legende != NULL)
3086: {
3087: if (((*s_nouvel_etat_processus).legende = malloc((strlen(
3088: (*s_etat_processus).legende) + 1) *
3089: sizeof(unsigned char))) == NULL)
3090: {
3091: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3092: {
3093: (*s_etat_processus).erreur_systeme = d_es_processus;
3094: return(NULL);
3095: }
3096:
3097: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3098: return(NULL);
3099: }
3100:
3101: strcpy((*s_nouvel_etat_processus).legende,
3102: (*s_etat_processus).legende);
3103: }
3104: else
3105: {
3106: (*s_nouvel_etat_processus).legende = NULL;
3107: }
3108:
3109: /*
3110: * Copie de la table des variables
3111: */
3112:
3113: if (((*s_nouvel_etat_processus).s_liste_variables =
3114: malloc((*s_etat_processus).nombre_variables_allouees *
3115: sizeof(struct_variable))) == NULL)
3116: {
3117: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3118: {
3119: (*s_etat_processus).erreur_systeme = d_es_processus;
3120: return(NULL);
3121: }
3122:
3123: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3124: return(NULL);
3125: }
3126:
3127: for(i = 0; i < (*s_etat_processus).nombre_variables; i++)
3128: {
3129: if (((*s_nouvel_etat_processus).s_liste_variables[i].nom =
3130: malloc((strlen((*s_etat_processus).s_liste_variables[i].nom)
3131: + 1) * sizeof(unsigned char))) == NULL)
3132: {
3133: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3134: {
3135: (*s_etat_processus).erreur_systeme = d_es_processus;
3136: return(NULL);
3137: }
3138:
3139: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3140: return(NULL);
3141: }
3142:
3143: strcpy((*s_nouvel_etat_processus).s_liste_variables[i].nom,
3144: (*s_etat_processus).s_liste_variables[i].nom);
3145:
3146: (*s_nouvel_etat_processus).s_liste_variables[i].origine =
3147: (*s_etat_processus).s_liste_variables[i].origine;
3148: (*s_nouvel_etat_processus).s_liste_variables[i].niveau =
3149: (*s_etat_processus).s_liste_variables[i].niveau;
3150: (*s_nouvel_etat_processus).s_liste_variables[i].variable_statique =
3151: (*s_etat_processus).s_liste_variables[i].variable_statique;
3152: (*s_nouvel_etat_processus).s_liste_variables[i].variable_partagee =
3153: (*s_etat_processus).s_liste_variables[i].variable_partagee;
3154: (*s_nouvel_etat_processus).s_liste_variables[i].variable_verrouillee =
3155: (*s_etat_processus).s_liste_variables[i].variable_verrouillee;
3156:
3157: // Les définitions sont partagées entre tous les threads.
3158:
3159: if ((*s_etat_processus).s_liste_variables[i].niveau == 0)
3160: {
3161: (*s_nouvel_etat_processus).s_liste_variables[i].objet =
3162: (*s_etat_processus).s_liste_variables[i].objet;
3163: }
3164: else
3165: {
3166: if (((*s_nouvel_etat_processus).s_liste_variables[i].objet =
3167: copie_objet(s_etat_processus,
3168: (*s_etat_processus).s_liste_variables[i]
3169: .objet, 'P')) == NULL)
3170: {
3171: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3172: {
3173: (*s_etat_processus).erreur_systeme = d_es_processus;
3174: return(NULL);
3175: }
3176:
3177: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3178: return(NULL);
3179: }
3180: }
3181: }
3182:
3183: /*
3184: * Copie de la table des variables statiques
3185: */
3186:
3187: if (((*s_nouvel_etat_processus).s_liste_variables_statiques =
3188: malloc((*s_etat_processus).nombre_variables_statiques_allouees *
3189: sizeof(struct_variable_statique))) == NULL)
3190: {
3191: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3192: {
3193: (*s_etat_processus).erreur_systeme = d_es_processus;
3194: return(NULL);
3195: }
3196:
3197: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3198: return(NULL);
3199: }
3200:
3201: for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++)
3202: {
3203: if (((*s_nouvel_etat_processus).s_liste_variables_statiques[i].nom =
3204: malloc((strlen((*s_etat_processus).s_liste_variables_statiques
3205: [i].nom) + 1) * sizeof(unsigned char))) == NULL)
3206: {
3207: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3208: {
3209: (*s_etat_processus).erreur_systeme = d_es_processus;
3210: return(NULL);
3211: }
3212:
3213: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3214: return(NULL);
3215: }
3216:
3217: strcpy((*s_nouvel_etat_processus).s_liste_variables_statiques[i].nom,
3218: (*s_etat_processus).s_liste_variables_statiques[i].nom);
3219:
3220: (*s_nouvel_etat_processus).s_liste_variables_statiques[i].origine =
3221: (*s_etat_processus).s_liste_variables_statiques[i].origine;
3222: (*s_nouvel_etat_processus).s_liste_variables_statiques[i].niveau =
3223: (*s_etat_processus).s_liste_variables_statiques[i].niveau;
3224: (*s_nouvel_etat_processus).s_liste_variables_statiques[i]
3225: .variable_statique = (*s_etat_processus)
3226: .s_liste_variables_statiques[i].variable_statique;
3227:
3228: if (((*s_nouvel_etat_processus).s_liste_variables_statiques[i].objet =
3229: copie_objet(s_etat_processus, (*s_etat_processus)
3230: .s_liste_variables_statiques[i].objet, 'P')) == NULL)
3231: {
3232: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3233: {
3234: (*s_etat_processus).erreur_systeme = d_es_processus;
3235: return(NULL);
3236: }
3237:
3238: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3239: return(NULL);
3240: }
3241: }
3242:
3243: /*
3244: * Copie de la pile opérationnelle
3245: */
3246:
3247: (*s_nouvel_etat_processus).l_base_pile = NULL;
3248: l_element_lecture = (*s_etat_processus).l_base_pile;
3249: l_element_precedent = NULL;
3250:
3251: while(l_element_lecture != NULL)
3252: {
3253: if ((l_element_suivant = malloc(sizeof(struct_liste_chainee))) == NULL)
3254: {
3255: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3256: {
3257: (*s_etat_processus).erreur_systeme = d_es_processus;
3258: return(NULL);
3259: }
3260:
3261: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3262: return(NULL);
3263: }
3264:
3265: if (((*l_element_suivant).donnee = copie_objet(s_etat_processus,
3266: (*l_element_lecture).donnee, 'P')) == NULL)
3267: {
3268: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3269: {
3270: (*s_etat_processus).erreur_systeme = d_es_processus;
3271: return(NULL);
3272: }
3273:
3274: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3275: return(NULL);
3276: }
3277:
3278: (*l_element_suivant).suivant = NULL;
3279:
3280: if ((*s_nouvel_etat_processus).l_base_pile == NULL)
3281: {
3282: (*s_nouvel_etat_processus).l_base_pile = l_element_suivant;
3283: }
3284: else
3285: {
3286: (*l_element_precedent).suivant = l_element_suivant;
3287: }
3288:
3289: l_element_precedent = l_element_suivant;
3290: l_element_lecture = (*l_element_lecture).suivant;
3291: }
3292:
3293: /*
3294: * Copie de la pile système
3295: */
3296:
3297: (*s_nouvel_etat_processus).l_base_pile_systeme = NULL;
3298: (*s_nouvel_etat_processus).hauteur_pile_systeme = 0;
3299:
3300: empilement_pile_systeme(s_nouvel_etat_processus);
3301:
3302: if ((*s_nouvel_etat_processus).erreur_systeme != d_es)
3303: {
3304: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3305: {
3306: (*s_etat_processus).erreur_systeme = d_es_processus;
3307: return(NULL);
3308: }
3309:
3310: (*s_etat_processus).erreur_systeme =
3311: (*s_nouvel_etat_processus).erreur_systeme;
3312: return(NULL);
3313: }
3314:
3315: (*(*s_nouvel_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
3316:
3317: /*
3318: * On empile deux valeurs retour_definition pour pouvoir récupérer
3319: * les variables dans le cas d'un programme compilé.
3320: */
3321:
3322: empilement_pile_systeme(s_nouvel_etat_processus);
3323:
3324: if ((*s_nouvel_etat_processus).erreur_systeme != d_es)
3325: {
3326: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3327: {
3328: (*s_etat_processus).erreur_systeme = d_es_processus;
3329: return(NULL);
3330: }
3331:
3332: (*s_etat_processus).erreur_systeme =
3333: (*s_nouvel_etat_processus).erreur_systeme;
3334: return(NULL);
3335: }
3336:
3337: (*(*s_nouvel_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
3338:
3339: /*
3340: * Destruction de la pile last pour le thread en cours.
3341: */
3342:
3343: (*s_nouvel_etat_processus).l_base_pile_last = NULL;
3344: (*s_nouvel_etat_processus).l_base_pile_processus = NULL;
3345:
3346: /*
3347: * Copie des différents contextes
3348: */
3349:
3350: (*s_nouvel_etat_processus).l_base_pile_contextes = NULL;
3351: l_element_lecture = (*s_etat_processus).l_base_pile_contextes;
3352:
3353: while(l_element_lecture != NULL)
3354: {
3355: if ((l_element_suivant = malloc(sizeof(struct_liste_chainee))) == NULL)
3356: {
3357: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3358: {
3359: (*s_etat_processus).erreur_systeme = d_es_processus;
3360: return(NULL);
3361: }
3362:
3363: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3364: return(NULL);
3365: }
3366:
3367: if (((*l_element_suivant).donnee = copie_objet(s_etat_processus,
3368: (*l_element_lecture).donnee, 'P')) == NULL)
3369: {
3370: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3371: {
3372: (*s_etat_processus).erreur_systeme = d_es_processus;
3373: return(NULL);
3374: }
3375:
3376: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3377: return(NULL);
3378: }
3379:
3380: (*l_element_suivant).suivant = NULL;
3381:
3382: if ((*s_nouvel_etat_processus).l_base_pile_contextes == NULL)
3383: {
3384: (*s_nouvel_etat_processus).l_base_pile_contextes =
3385: l_element_suivant;
3386: }
3387: else
3388: {
3389: (*l_element_precedent).suivant = l_element_suivant;
3390: }
3391:
3392: l_element_precedent = l_element_suivant;
3393: l_element_lecture = (*l_element_lecture).suivant;
3394: }
3395:
3396: (*s_nouvel_etat_processus).l_base_pile_taille_contextes = NULL;
3397: l_element_lecture = (*s_etat_processus).l_base_pile_taille_contextes;
3398:
3399: while(l_element_lecture != NULL)
3400: {
3401: if ((l_element_suivant = malloc(sizeof(struct_liste_chainee))) == NULL)
3402: {
3403: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3404: {
3405: (*s_etat_processus).erreur_systeme = d_es_processus;
3406: return(NULL);
3407: }
3408:
3409: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3410: return(NULL);
3411: }
3412:
3413: if (((*l_element_suivant).donnee = copie_objet(s_etat_processus,
3414: (*l_element_lecture).donnee, 'P')) == NULL)
3415: {
3416: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3417: {
3418: (*s_etat_processus).erreur_systeme = d_es_processus;
3419: return(NULL);
3420: }
3421:
3422: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3423: return(NULL);
3424: }
3425:
3426: (*l_element_suivant).suivant = NULL;
3427:
3428: if ((*s_nouvel_etat_processus).l_base_pile_taille_contextes == NULL)
3429: {
3430: (*s_nouvel_etat_processus).l_base_pile_taille_contextes =
3431: l_element_suivant;
3432: }
3433: else
3434: {
3435: (*l_element_precedent).suivant = l_element_suivant;
3436: }
3437:
3438: l_element_precedent = l_element_suivant;
3439: l_element_lecture = (*l_element_lecture).suivant;
3440: }
3441:
3442: /*
3443: * Copies des piles s_sockets, s_bibliotheques et
3444: * s_instructions_externes.
3445: */
3446:
3447: (*s_nouvel_etat_processus).s_sockets = NULL;
3448: l_element_lecture = (*s_etat_processus).s_sockets;
3449:
3450: while(l_element_lecture != NULL)
3451: {
3452: if ((l_element_suivant = malloc(sizeof(struct_liste_chainee))) == NULL)
3453: {
3454: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3455: {
3456: (*s_etat_processus).erreur_systeme = d_es_processus;
3457: return(NULL);
3458: }
3459:
3460: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3461: return(NULL);
3462: }
3463:
3464: if (((*l_element_suivant).donnee = copie_objet(s_etat_processus,
3465: (*l_element_lecture).donnee, 'P')) == NULL)
3466: {
3467: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3468: {
3469: (*s_etat_processus).erreur_systeme = d_es_processus;
3470: return(NULL);
3471: }
3472:
3473: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3474: return(NULL);
3475: }
3476:
3477: (*l_element_suivant).suivant = NULL;
3478:
3479: if ((*s_nouvel_etat_processus).s_sockets == NULL)
3480: {
3481: (*s_nouvel_etat_processus).s_sockets = l_element_suivant;
3482: }
3483: else
3484: {
3485: (*l_element_precedent).suivant = l_element_suivant;
3486: }
3487:
3488: l_element_precedent = l_element_suivant;
3489: l_element_lecture = (*l_element_lecture).suivant;
3490: }
3491:
3492: (*s_nouvel_etat_processus).s_bibliotheques = NULL;
3493: l_element_precedent = NULL;
3494: l_element_lecture = (*s_etat_processus).s_bibliotheques;
3495:
3496: while(l_element_lecture != NULL)
3497: {
3498: if ((l_element_suivant = malloc(sizeof(struct_liste_chainee))) == NULL)
3499: {
3500: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3501: {
3502: (*s_etat_processus).erreur_systeme = d_es_processus;
3503: return(NULL);
3504: }
3505:
3506: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3507: return(NULL);
3508: }
3509:
3510: if (((*l_element_suivant).donnee = malloc(sizeof(struct_bibliotheque)))
3511: == NULL)
3512: {
3513: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3514: return(NULL);
3515: }
3516:
3517: (*((struct_bibliotheque *) (*l_element_suivant).donnee)).descripteur
3518: = (*((struct_bibliotheque *) (*l_element_lecture).donnee))
3519: .descripteur;
3520: (*((struct_bibliotheque *) (*l_element_suivant).donnee)).pid
3521: = (*((struct_bibliotheque *) (*l_element_lecture).donnee)).pid;
3522: (*((struct_bibliotheque *) (*l_element_suivant).donnee)).tid
3523: = (*((struct_bibliotheque *) (*l_element_lecture).donnee)).tid;
3524:
3525: if (((*((struct_bibliotheque *) (*l_element_suivant).donnee)).nom =
3526: malloc((strlen((*((struct_bibliotheque *) (*l_element_lecture)
3527: .donnee)).nom) + 1) * sizeof(unsigned char))) == NULL)
3528: {
3529: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3530: {
3531: (*s_etat_processus).erreur_systeme = d_es_processus;
3532: return(NULL);
3533: }
3534:
3535: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3536: return(NULL);
3537: }
3538:
3539: strcpy((*((struct_bibliotheque *) (*l_element_suivant).donnee)).nom,
3540: (*((struct_bibliotheque *) (*l_element_lecture).donnee)).nom);
3541:
3542: (*l_element_suivant).suivant = NULL;
3543:
3544: if ((*s_nouvel_etat_processus).s_bibliotheques == NULL)
3545: {
3546: (*s_nouvel_etat_processus).s_bibliotheques = l_element_suivant;
3547: }
3548: else
3549: {
3550: (*l_element_precedent).suivant = l_element_suivant;
3551: }
3552:
3553: l_element_precedent = l_element_suivant;
3554: l_element_lecture = (*l_element_lecture).suivant;
3555: }
3556:
3557: if ((*s_etat_processus).nombre_instructions_externes != 0)
3558: {
3559: if (((*s_nouvel_etat_processus).s_instructions_externes =
3560: malloc((*s_etat_processus).nombre_instructions_externes *
3561: sizeof(struct_instruction_externe))) == NULL)
3562: {
3563: (*s_etat_processus).erreur_systeme = d_es_processus;
3564: return(NULL);
3565: }
3566:
3567: for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
3568: {
3569: if (((*s_nouvel_etat_processus).s_instructions_externes[i].nom =
3570: malloc((strlen((*s_etat_processus).s_instructions_externes
3571: [i].nom) + 1) * sizeof(unsigned char))) == NULL)
3572: {
3573: (*s_etat_processus).erreur_systeme = d_es_processus;
3574: return(NULL);
3575: }
3576:
3577: strcpy((*s_nouvel_etat_processus).s_instructions_externes[i].nom,
3578: (*s_etat_processus).s_instructions_externes[i].nom);
3579:
3580: if (((*s_nouvel_etat_processus).s_instructions_externes[i]
3581: .nom_bibliotheque = malloc((strlen((*s_etat_processus)
3582: .s_instructions_externes[i].nom_bibliotheque) + 1) *
3583: sizeof(unsigned char))) == NULL)
3584: {
3585: (*s_etat_processus).erreur_systeme = d_es_processus;
3586: return(NULL);
3587: }
3588:
3589: strcpy((*s_nouvel_etat_processus).s_instructions_externes[i]
3590: .nom_bibliotheque, (*s_etat_processus)
3591: .s_instructions_externes[i].nom_bibliotheque);
3592:
3593: (*s_nouvel_etat_processus).s_instructions_externes[i]
3594: .descripteur_bibliotheque = (*s_etat_processus)
3595: .s_instructions_externes[i].descripteur_bibliotheque;
3596: }
3597: }
3598: else
3599: {
3600: (*s_nouvel_etat_processus).s_instructions_externes = NULL;
3601: }
3602:
3603: pthread_mutexattr_init(&attributs_mutex);
3604: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);
3605: pthread_mutex_init(&((*s_nouvel_etat_processus).mutex), &attributs_mutex);
3606: pthread_mutexattr_destroy(&attributs_mutex);
3607:
3608: pthread_mutexattr_init(&attributs_mutex);
3609: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);
3610: pthread_mutex_init(&((*s_nouvel_etat_processus).mutex_allocation),
3611: &attributs_mutex);
3612: pthread_mutexattr_destroy(&attributs_mutex);
3613:
3614: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
3615: {
3616: (*s_etat_processus).erreur_systeme = d_es_processus;
3617: return(NULL);
3618: }
3619:
3620: return(s_nouvel_etat_processus);
3621:
3622: #undef return
3623: }
3624:
3625:
3626: /*
3627: ================================================================================
3628: Routines de debug
3629: ================================================================================
3630: entrées :
3631: --------------------------------------------------------------------------------
3632: sorties :
3633: --------------------------------------------------------------------------------
3634: effets de bord : néant
3635: ================================================================================
3636: */
3637:
3638: #ifdef DEBUG_MEMOIRE
3639:
3640: #undef malloc
3641: #undef realloc
3642: #undef free
3643: #undef fork
3644:
3645: #ifdef return
3646: # undef return
3647: #endif
3648:
3649: #ifdef __BACKTRACE
3650: #define PROFONDEUR_PILE 64
3651: #define return(a) { if (a == NULL) \
3652: { BACKTRACE(PROFONDEUR_PILE); \
3653: fprintf(stderr, ">>> MEDITATION %d\n", __LINE__); } \
3654: return(a); } while(0)
3655: #endif
3656:
3657: #undef fprintf
3658: #define check(a, b) ((strcmp(#a, fonction) == 0) && (ligne == b))
3659: #undef CORE_DUMP
3660:
3661: typedef struct memoire
3662: {
3663: void *pointeur;
3664: unsigned char *fonction;
3665: unsigned char *argument;
3666: unsigned long ligne;
3667: size_t taille;
3668: unsigned long long ordre;
3669: # ifdef __BACKTRACE
3670: void *pile[PROFONDEUR_PILE];
3671: int profondeur;
3672: # endif
3673: struct memoire *suivant;
3674: } struct_memoire;
3675:
3676: static struct_memoire *debug = NULL;
3677: static unsigned long long ordre = 0;
3678: static pthread_mutex_t mutex_allocation;
3679:
3680: void
3681: debug_memoire_initialisation()
3682: {
3683: pthread_mutexattr_t attributs_mutex;
3684:
3685: pthread_mutexattr_init(&attributs_mutex);
3686: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
3687: pthread_mutex_init(&mutex_allocation, &attributs_mutex);
3688: pthread_mutexattr_destroy(&attributs_mutex);
3689:
3690: return;
3691: }
3692:
3693: void *
3694: debug_memoire_ajout(size_t taille, const unsigned char *fonction,
3695: unsigned long ligne, const unsigned char *argument)
3696: {
3697: struct_memoire *ancienne_base;
3698:
3699: void *pointeur;
3700:
3701: pthread_mutex_lock(&mutex_allocation);
3702:
3703: ancienne_base = debug;
3704:
3705: if ((debug = malloc(sizeof(struct_memoire))) == NULL)
3706: {
3707: pthread_mutex_unlock(&mutex_allocation);
3708: return(NULL);
3709: }
3710:
3711: if (((*debug).pointeur = malloc(taille)) == NULL)
3712: {
3713: pthread_mutex_unlock(&mutex_allocation);
3714: return(NULL);
3715: }
3716:
3717: (*debug).suivant = ancienne_base;
3718: (*debug).ligne = ligne;
3719: (*debug).taille = taille;
3720: (*debug).ordre = ordre;
3721:
3722: pointeur = (*debug).pointeur;
3723:
3724: # ifdef __BACKTRACE
3725: (*debug).profondeur = backtrace((*debug).pile, PROFONDEUR_PILE);
3726: # endif
3727:
3728: if (((*debug).fonction = malloc((strlen(fonction) + 1) *
3729: sizeof(unsigned char))) == NULL)
3730: {
3731: pthread_mutex_unlock(&mutex_allocation);
3732: return(NULL);
3733: }
3734:
3735: if (((*debug).argument = malloc((strlen(argument) + 1) *
3736: sizeof(unsigned char))) == NULL)
3737: {
3738: pthread_mutex_unlock(&mutex_allocation);
3739: return(NULL);
3740: }
3741:
3742: strcpy((*debug).fonction, fonction);
3743: strcpy((*debug).argument, argument);
3744:
3745: memset((*debug).pointeur, 0, (*debug).taille);
3746:
3747: pthread_mutex_unlock(&mutex_allocation);
3748: ordre++;
3749:
3750: return(pointeur);
3751: }
3752:
3753: void *
3754: debug_memoire_modification(void *pointeur, size_t taille,
3755: const unsigned char *fonction, unsigned long ligne,
3756: const unsigned char *argument)
3757: {
3758: struct_memoire *element_courant;
3759:
3760: if (pointeur != NULL)
3761: {
3762: if (taille == 0)
3763: {
3764: // Revient à free(). Il n'y a pas de parenthèses car on ne veut
3765: // pas utiliser la macro return().
3766:
3767: debug_memoire_retrait(pointeur);
3768: return NULL ;
3769: }
3770: else
3771: {
3772: // Réallocation réelle
3773:
3774: pthread_mutex_lock(&mutex_allocation);
3775:
3776: element_courant = debug;
3777:
3778: while(element_courant != NULL)
3779: {
3780: if ((*element_courant).pointeur == pointeur)
3781: {
3782: break;
3783: }
3784:
3785: element_courant = (*element_courant).suivant;
3786: }
3787:
3788: if (element_courant == NULL)
3789: {
3790: pthread_mutex_unlock(&mutex_allocation);
3791:
3792: uprintf("[%d-%llu] ILLEGAL POINTER (realloc)\n",
3793: getpid(), (unsigned long long) pthread_self());
3794: # ifdef __BACKTRACE
3795: BACKTRACE(PROFONDEUR_PILE);
3796: # endif
3797:
3798: return(realloc(pointeur, taille));
3799: }
3800: else
3801: {
3802: if (((*element_courant).pointeur = realloc(pointeur, taille))
3803: == NULL)
3804: {
3805: pthread_mutex_unlock(&mutex_allocation);
3806: return(NULL);
3807: }
3808:
3809: (*element_courant).ligne = ligne;
3810: (*element_courant).taille = taille;
3811: free((*element_courant).fonction);
3812: free((*element_courant).argument);
3813:
3814: if (((*element_courant).fonction = malloc((strlen(fonction)
3815: + 1) * sizeof(unsigned char))) == NULL)
3816: {
3817: pthread_mutex_unlock(&mutex_allocation);
3818: return(NULL);
3819: }
3820:
3821: if (((*element_courant).argument = malloc((strlen(argument)
3822: + 1) * sizeof(unsigned char))) == NULL)
3823: {
3824: pthread_mutex_unlock(&mutex_allocation);
3825: return(NULL);
3826: }
3827:
3828: strcpy((*element_courant).fonction, fonction);
3829: strcpy((*element_courant).argument, argument);
3830:
3831: pthread_mutex_unlock(&mutex_allocation);
3832:
3833: return((*element_courant).pointeur);
3834: }
3835: }
3836: }
3837: else
3838: {
3839: // Revient à malloc()
3840: pointeur = debug_memoire_ajout(taille, fonction, ligne, argument);
3841: return(pointeur);
3842: }
3843: }
3844:
3845: void
3846: debug_memoire_retrait(void *pointeur)
3847: {
3848: struct_memoire *element_courant;
3849: struct_memoire *element_precedent;
3850:
3851: pthread_mutex_lock(&mutex_allocation);
3852:
3853: element_courant = debug;
3854: element_precedent = NULL;
3855:
3856: while(element_courant != NULL)
3857: {
3858: if ((*element_courant).pointeur == pointeur)
3859: {
3860: if (element_precedent == NULL)
3861: {
3862: debug = (*debug).suivant;
3863: }
3864: else
3865: {
3866: (*element_precedent).suivant = (*element_courant).suivant;
3867: }
3868:
3869: if (pointeur != NULL)
3870: {
3871: memset(pointeur, 0, (*element_courant).taille);
3872: }
3873:
3874: free((*element_courant).fonction);
3875: free((*element_courant).argument);
3876: free(element_courant);
3877:
3878: break;
3879: }
3880:
3881: element_precedent = element_courant;
3882: element_courant = (*element_courant).suivant;
3883: }
3884:
3885: pthread_mutex_unlock(&mutex_allocation);
3886:
3887: if (element_courant == NULL)
3888: {
3889: uprintf("[%d-%llu] ILLEGAL POINTER (free)\n",
3890: getpid(), (unsigned long long) pthread_self());
3891: # ifdef __BACKTRACE
3892: BACKTRACE(PROFONDEUR_PILE);
3893: # endif
3894: }
3895:
3896: free(pointeur);
3897: return;
3898: }
3899:
3900: void
3901: debug_memoire_verification()
3902: {
3903: # ifdef __BACKTRACE
3904: char **appels;
3905:
3906: int j;
3907: # endif
3908:
3909: integer8 i;
3910:
3911: struct_memoire *element_courant;
3912: struct_memoire *element_suivant;
3913:
3914: fprintf(stderr, "[%d-%llu] LIST OF MEMORY LEAKS\n",
3915: getpid(), (unsigned long long) pthread_self());
3916:
3917: pthread_mutex_lock(&mutex_allocation);
3918:
3919: element_courant = debug;
3920: i = 1;
3921:
3922: while(element_courant != NULL)
3923: {
3924: fprintf(stderr, "[%d-%llu] MEDITATION %lld (%llu)\n", getpid(),
3925: (unsigned long long) pthread_self(), i,
3926: (*element_courant).ordre);
3927: fprintf(stderr, "[%d-%llu] P: %p, F: %s(), L: %lu, S: %d\n",
3928: getpid(), (unsigned long long) pthread_self(),
3929: (*element_courant).pointeur,
3930: (*element_courant).fonction, (*element_courant).ligne,
3931: (int) (*element_courant).taille);
3932: fprintf(stderr, "[%d-%llu] A: %s\n", getpid(),
3933: (unsigned long long) pthread_self(),
3934: (*element_courant).argument);
3935:
3936: if (strstr((*element_courant).argument, "sizeof(unsigned char)")
3937: != NULL)
3938: {
3939: fprintf(stderr, "[%d-%llu] ", getpid(),
3940: (unsigned long long) pthread_self());
3941: fprintf(stderr, "O: %s\n", (unsigned char *)
3942: (*element_courant).pointeur);
3943: }
3944: else if (strcmp((*element_courant).argument, "sizeof(struct_objet)")
3945: == 0)
3946: {
3947: fprintf(stderr, "[%d-%llu] ", getpid(),
3948: (unsigned long long) pthread_self());
3949: fprintf(stderr, "O: %d\n", (*((struct_objet *)
3950: (*element_courant).pointeur)).type);
3951: }
3952: else if (strcmp((*element_courant).argument,
3953: "sizeof(struct_liste_chainee)") == 0)
3954: {
3955: fprintf(stderr, "[%d-%llu] ", getpid(),
3956: (unsigned long long) pthread_self());
3957: fprintf(stderr, "O: data=%p next=%p\n", (*((struct_liste_chainee *)
3958: (*element_courant).pointeur)).donnee,
3959: (*((struct_liste_chainee *) (*element_courant).pointeur))
3960: .suivant);
3961: }
3962:
3963: # ifdef __BACKTRACE
3964: appels = backtrace_symbols((*element_courant).pile,
3965: (*element_courant).profondeur);
3966:
3967: fprintf(stderr, "[%d-%llu] BACKTRACE\n",
3968: getpid(), (unsigned long long) pthread_self());
3969:
3970: if (appels != NULL)
3971: {
3972: for(j = 0; j < (*element_courant).profondeur; j++)
3973: {
3974: fprintf(stderr, "[%d-%llu] %s\n", getpid(),
3975: (unsigned long long) pthread_self(), appels[j]);
3976: }
3977:
3978: free(appels);
3979: }
3980: # endif
3981:
3982: fprintf(stderr, "\n");
3983:
3984: i++;
3985:
3986: element_suivant = (*element_courant).suivant;
3987:
3988: # ifndef CORE_DUMP
3989: free((*element_courant).fonction);
3990: free((*element_courant).argument);
3991: free(element_courant);
3992: # endif
3993:
3994: element_courant = element_suivant;
3995: }
3996:
3997: pthread_mutex_unlock(&mutex_allocation);
3998: pthread_mutex_destroy(&mutex_allocation);
3999:
4000: fprintf(stderr, "[%d-%llu] END OF LIST\n", getpid(),
4001: (unsigned long long) pthread_self());
4002:
4003: return;
4004: }
4005:
4006: pid_t
4007: debug_fork()
4008: {
4009: pid_t pid;
4010:
4011: pthread_mutex_lock(&mutex_allocation);
4012: pid = fork();
4013:
4014: # ifdef OS2
4015: if (pid == 0)
4016: {
4017: sem_init(&semaphore_liste_threads, 0, 1);
4018: sem_init(&semaphore_gestionnaires_signaux, 0, 0);
4019: sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);
4020: sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);
4021: }
4022: # endif
4023:
4024: if (pid == 0)
4025: {
4026: # ifdef _BROKEN_SIGINFO
4027: liberation_fifos_signaux(s_etat_processus);
4028: creation_fifos_signaux(s_etat_processus);
4029: # endif
4030:
4031: pthread_mutex_destroy(&mutex_allocation);
4032: debug_memoire_initialisation();
4033: }
4034: else
4035: {
4036: pthread_mutex_unlock(&mutex_allocation);
4037: }
4038:
4039: // Pas de parenthèses pour ne pas remplacer return par sa macro.
4040: return pid;
4041: }
4042:
4043: void
4044: analyse_post_mortem()
4045: {
4046: # ifdef CORE_DUMP
4047: BUG(debug != NULL, uprintf("[%d-%llu] CREATE CORE DUMP FILE FOR "
4048: "POST MORTEM ANALYZE\n", getpid(),
4049: (unsigned long long) pthread_self()));
4050: # endif
4051:
4052: return;
4053: }
4054:
4055: #endif
4056:
4057: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>