![]() ![]() | ![]() |
1.1 bertrand 1: /*
2: ================================================================================
1.63 bertrand 3: RPL/2 (R) version 4.1.17
1.64 ! bertrand 4: Copyright (C) 1989-2014 Dr. BERTRAND Joël
1.1 bertrand 5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
1.15 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
28: Fonction 'splash'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_splash(struct_processus *s_etat_processus)
40: {
41: real8 attente;
42:
43: struct_objet *s_objet;
44:
45: (*s_etat_processus).erreur_execution = d_ex;
46:
47: if ((*s_etat_processus).affichage_arguments == 'Y')
48: {
49: printf("\n SPLASH ");
50:
51: if ((*s_etat_processus).langue == 'F')
52: {
53: printf("(écran RPL/2)\n\n");
54: }
55: else
56: {
57: printf("(RPL/2 splash screen)\n\n");
58: }
59:
60: printf(" 1: %s, %s\n", d_INT, d_REL);
61:
62: return;
63: }
64: else if ((*s_etat_processus).test_instruction == 'Y')
65: {
66: (*s_etat_processus).nombre_arguments = -1;
67: return;
68: }
69:
70: if (test_cfsf(s_etat_processus, 31) == d_vrai)
71: {
72: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
73: {
74: return;
75: }
76: }
77:
78: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
79: &s_objet) == d_erreur)
80: {
81: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
82: return;
83: }
84:
85: if (((*s_objet).type == INT) ||
86: ((*s_objet).type == REL))
87: {
88: if ((*s_objet).type == INT)
89: {
90: attente = (real8) (*((integer8 *) (*s_objet).objet));
91: }
92: else
93: {
94: attente = (*((real8 *) (*s_objet).objet));
95: }
96:
97: if (attente < 0)
98: {
99: liberation(s_etat_processus, s_objet);
100:
101: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
102: return;
103: }
104:
1.57 bertrand 105: encart(s_etat_processus, (integer8) (attente * 1E6));
1.1 bertrand 106: }
107: else
108: {
109: liberation(s_etat_processus, s_objet);
110:
111: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
112: return;
113: }
114:
115: liberation(s_etat_processus, s_objet);
116:
117: return;
118: }
119:
120:
121: /*
122: ================================================================================
123: Fonction 'send'
124: ================================================================================
125: Entrées :
126: --------------------------------------------------------------------------------
127: Sorties :
128: --------------------------------------------------------------------------------
129: Effets de bord : néant
130: ================================================================================
131: */
132:
133: void
134: instruction_send(struct_processus *s_etat_processus)
135: {
136: sig_atomic_t registre;
137:
138: ssize_t longueur_ecriture;
139:
140: struct_objet *s_objet;
141:
142: struct timespec attente;
143:
1.59 bertrand 144: unsigned char caractere;
1.1 bertrand 145: unsigned char tampon;
146:
147: (*s_etat_processus).erreur_execution = d_ex;
148:
149: if ((*s_etat_processus).affichage_arguments == 'Y')
150: {
151: printf("\n SEND ");
152:
153: if ((*s_etat_processus).langue == 'F')
154: {
155: printf("(envoi de données au processus père)\n\n");
156: }
157: else
158: {
159: printf("(send data to parent process)\n\n");
160: }
161:
162: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
163: " %s, %s, %s, %s, %s,\n"
164: " %s, %s, %s, %s, %s\n",
165: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
166: d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_TAB);
167:
168: return;
169: }
170: else if ((*s_etat_processus).test_instruction == 'Y')
171: {
172: (*s_etat_processus).nombre_arguments = -1;
173: return;
174: }
175:
176: if (test_cfsf(s_etat_processus, 31) == d_vrai)
177: {
178: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
179: {
180: return;
181: }
182: }
183:
184: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
185: &s_objet) == d_erreur)
186: {
187: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
188: return;
189: }
190:
191: if ((*s_etat_processus).presence_pipes == d_faux)
192: {
193: liberation(s_etat_processus, s_objet);
194:
195: (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere;
196: return;
197: }
198:
199: if (((*s_objet).type != INT) &&
200: ((*s_objet).type != REL) &&
201: ((*s_objet).type != CPL) &&
202: ((*s_objet).type != VIN) &&
203: ((*s_objet).type != VRL) &&
204: ((*s_objet).type != VCX) &&
205: ((*s_objet).type != MIN) &&
206: ((*s_objet).type != MRL) &&
207: ((*s_objet).type != MCX) &&
208: ((*s_objet).type != BIN) &&
209: ((*s_objet).type != NOM) &&
210: ((*s_objet).type != CHN) &&
211: ((*s_objet).type != LST) &&
212: ((*s_objet).type != ALG) &&
213: ((*s_objet).type != RPN) &&
214: ((*s_objet).type != TBL))
215: {
216: liberation(s_etat_processus, s_objet);
217:
218: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
219: return;
220: }
221:
222: /*
223: * On signale au processus père qu'il y a un objet de plus
224: * dans le pipe de données.
225: */
226:
227: registre = (*s_etat_processus).var_volatile_traitement_retarde_stop;
228: (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
229:
230: if ((*s_etat_processus).processus_detache == d_vrai)
231: {
232: if ((*s_etat_processus).profilage == d_vrai)
233: {
234: profilage(s_etat_processus, "Interprocess communications (SEND)");
235:
236: if ((*s_etat_processus).erreur_systeme != d_es)
237: {
238: return;
239: }
240: }
241:
1.38 bertrand 242: # ifndef SEMAPHORES_NOMMES
243: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
244: # else
245: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
246: # endif
1.1 bertrand 247: {
248: (*s_etat_processus).erreur_systeme = d_es_processus;
249: return;
250: }
251:
1.59 bertrand 252: caractere = 1;
1.1 bertrand 253:
254: attente.tv_sec = 0;
255: attente.tv_nsec = GRANULARITE_us * 1000;
256:
257: while((longueur_ecriture = write_atomic(s_etat_processus,
1.59 bertrand 258: (*s_etat_processus).pipe_nombre_elements_attente,
259: &caractere, sizeof(caractere))) != sizeof(caractere))
1.1 bertrand 260: {
1.38 bertrand 261: # ifndef SEMAPHORES_NOMMES
262: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
263: # else
264: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
265: # endif
1.1 bertrand 266: {
1.37 bertrand 267: if (errno != EINTR)
268: {
269: (*s_etat_processus).erreur_systeme = d_es_processus;
270: return;
271: }
1.1 bertrand 272: }
273:
274: if (longueur_ecriture == -1)
275: {
276: if ((*s_etat_processus).profilage == d_vrai)
277: {
278: profilage(s_etat_processus, NULL);
279: }
280:
281: (*s_etat_processus).erreur_systeme = d_es_processus;
282: return;
283: }
284:
285: nanosleep(&attente, NULL);
286: INCR_GRANULARITE(attente.tv_nsec);
287:
1.38 bertrand 288: # ifndef SEMAPHORES_NOMMES
289: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
290: # else
291: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
292: # endif
1.1 bertrand 293: {
294: (*s_etat_processus).erreur_systeme = d_es_processus;
295: return;
296: }
1.35 bertrand 297:
298: scrutation_interruptions(s_etat_processus);
1.1 bertrand 299: }
300:
1.38 bertrand 301: # ifndef SEMAPHORES_NOMMES
302: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
303: # else
304: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
305: # endif
1.1 bertrand 306: {
1.37 bertrand 307: if (errno != EINTR)
308: {
309: (*s_etat_processus).erreur_systeme = d_es_processus;
310: return;
311: }
1.1 bertrand 312: }
313: }
314: else
315: {
316: if ((*s_etat_processus).profilage == d_vrai)
317: {
318: profilage(s_etat_processus, "Interthread communications (SEND)");
319:
320: if ((*s_etat_processus).erreur_systeme != d_es)
321: {
322: return;
323: }
324: }
325:
326: attente.tv_sec = 0;
327: attente.tv_nsec = GRANULARITE_us * 1000;
328:
1.38 bertrand 329: # ifndef SEMAPHORES_NOMMES
330: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
331: # else
332: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
333: # endif
1.1 bertrand 334: {
335: (*s_etat_processus).erreur_systeme = d_es_processus;
336: return;
337: }
338:
1.59 bertrand 339: caractere = 1;
1.1 bertrand 340:
341: attente.tv_sec = 0;
342: attente.tv_nsec = GRANULARITE_us * 1000;
343:
344: while((longueur_ecriture = write_atomic(s_etat_processus,
1.59 bertrand 345: (*s_etat_processus).pipe_nombre_elements_attente,
346: &caractere, sizeof(caractere))) != sizeof(caractere))
1.1 bertrand 347: {
1.38 bertrand 348: # ifndef SEMAPHORES_NOMMES
349: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
350: # else
351: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
352: # endif
1.1 bertrand 353: {
1.37 bertrand 354: if (errno != EINTR)
355: {
356: (*s_etat_processus).erreur_systeme = d_es_processus;
357: return;
358: }
1.1 bertrand 359: }
360:
361: if (longueur_ecriture == -1)
362: {
363: if ((*s_etat_processus).profilage == d_vrai)
364: {
365: profilage(s_etat_processus, NULL);
366: }
367:
368: (*s_etat_processus).erreur_systeme = d_es_processus;
369: return;
370: }
371:
372: nanosleep(&attente, NULL);
373: INCR_GRANULARITE(attente.tv_nsec);
374:
1.38 bertrand 375: # ifndef SEMAPHORES_NOMMES
376: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
377: # else
378: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
379: # endif
1.7 bertrand 380: {
381: (*s_etat_processus).erreur_systeme = d_es_processus;
382: return;
383: }
1.35 bertrand 384:
385: scrutation_interruptions(s_etat_processus);
1.1 bertrand 386: }
387:
1.38 bertrand 388: # ifndef SEMAPHORES_NOMMES
389: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
390: # else
391: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
392: # endif
1.1 bertrand 393: {
1.34 bertrand 394: (*s_etat_processus).erreur_systeme = d_es_processus;
395: return;
1.1 bertrand 396: }
397: }
398:
399: (*s_etat_processus).nombre_objets_envoyes_non_lus++;
400:
401: attente.tv_sec = 0;
402: attente.tv_nsec = GRANULARITE_us * 1000;
403:
1.38 bertrand 404: # ifndef SEMAPHORES_NOMMES
405: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
406: # else
407: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
408: # endif
1.7 bertrand 409: {
410: (*s_etat_processus).erreur_systeme = d_es_processus;
411: return;
412: }
1.1 bertrand 413:
414: while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement,
415: &tampon, sizeof(unsigned char)) != sizeof(unsigned char))
416: {
1.38 bertrand 417: # ifndef SEMAPHORES_NOMMES
418: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
419: # else
420: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
421: # endif
1.1 bertrand 422: {
1.37 bertrand 423: if (errno != EINTR)
424: {
425: (*s_etat_processus).erreur_systeme = d_es_processus;
426: return;
427: }
1.1 bertrand 428: }
429:
430: nanosleep(&attente, NULL);
431: INCR_GRANULARITE(attente.tv_nsec);
432:
1.38 bertrand 433: # ifndef SEMAPHORES_NOMMES
434: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
435: # else
436: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
437: # endif
1.1 bertrand 438: {
439: (*s_etat_processus).erreur_systeme = d_es_processus;
440: return;
441: }
1.35 bertrand 442:
443: scrutation_interruptions(s_etat_processus);
1.1 bertrand 444: }
445:
1.38 bertrand 446: # ifndef SEMAPHORES_NOMMES
447: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
448: # else
449: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
450: # endif
1.1 bertrand 451: {
1.37 bertrand 452: if (errno != EINTR)
453: {
454: (*s_etat_processus).erreur_systeme = d_es_processus;
455: return;
456: }
1.1 bertrand 457: }
458:
459: // ecriture_pipe() ne peut être interrompu par un signal.
460:
1.38 bertrand 461: # ifndef SEMAPHORES_NOMMES
462: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
463: # else
464: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
465: # endif
1.1 bertrand 466: {
467: (*s_etat_processus).erreur_systeme = d_es_processus;
468: return;
469: }
470:
471: if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees,
472: s_objet) == d_erreur)
473: {
1.38 bertrand 474: # ifndef SEMAPHORES_NOMMES
475: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
476: # else
477: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
478: # endif
1.1 bertrand 479: {
1.37 bertrand 480: if (errno != EINTR)
481: {
482: (*s_etat_processus).erreur_systeme = d_es_processus;
483: return;
484: }
1.1 bertrand 485: }
486:
487: if ((*s_etat_processus).profilage == d_vrai)
488: {
489: profilage(s_etat_processus, NULL);
490: }
491:
492: liberation(s_etat_processus, s_objet);
493: return;
494: }
495:
1.38 bertrand 496: # ifndef SEMAPHORES_NOMMES
497: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
498: # else
499: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
500: # endif
1.1 bertrand 501: {
1.37 bertrand 502: if (errno != EINTR)
503: {
504: (*s_etat_processus).erreur_systeme = d_es_processus;
505: return;
506: }
1.1 bertrand 507: }
508:
509: if ((*s_etat_processus).profilage == d_vrai)
510: {
511: profilage(s_etat_processus, NULL);
512: }
513:
514: if (registre == 0)
515: {
516: if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
517: {
518: (*s_etat_processus).var_volatile_requete_arret = -1;
519: }
520:
521: (*s_etat_processus).var_volatile_traitement_retarde_stop = registre;
522: }
523:
524: liberation(s_etat_processus, s_objet);
525: return;
526: }
527:
528:
529: /*
530: ================================================================================
531: Fonction 'sqlquery'
532: ================================================================================
533: Entrées :
534: --------------------------------------------------------------------------------
535: Sorties :
536: --------------------------------------------------------------------------------
537: Effets de bord : néant
538: ================================================================================
539: */
540:
541: void
542: instruction_sqlquery(struct_processus *s_etat_processus)
543: {
544: logical1 connexion_permanente;
545:
546: struct_objet *s_copie_1;
547: struct_objet *s_objet_1;
548: struct_objet *s_copie_2;
549: struct_objet *s_objet_2;
550:
551: unsigned char *tampon;
552:
553: (*s_etat_processus).erreur_execution = d_ex;
554:
555: if ((*s_etat_processus).affichage_arguments == 'Y')
556: {
557: printf("\n SQLQUERY ");
558:
559: if ((*s_etat_processus).langue == 'F')
560: {
561: printf("(requête SQL)\n\n");
562: }
563: else
564: {
565: printf("(SQL query)\n\n");
566: }
567:
568: printf(" 2: %s\n", d_CHN);
569: printf(" 1: %s\n", d_LST);
570: printf("-> 1: %s\n\n", d_LST);
571:
572: printf(" 2: %s\n", d_CHN);
573: printf(" 1: %s\n", d_SQL);
574: printf("-> 1: %s\n\n", d_LST);
575:
576: if ((*s_etat_processus).langue == 'F')
577: {
578: printf(" Utilisation :\n\n");
579: }
580: else
581: {
582: printf(" Usage:\n\n");
583: }
584:
585: printf(" \"select * from table\"\n");
586: printf(" { \"mysql\" \"server\" \"database\" "
587: "\"user\" \"password\" } SQLQUERY\n");
588: printf(" \"select field from table\"\n");
589: printf(" { \"postgresql:iso-8859-1\" \"server\" "
590: "\"database\" \"user\" \"password\" port }\n");
591: printf(" SQLQUERY\n");
1.53 bertrand 592: printf(" \"select * from table\"\n");
593: printf(" { \"sqlite\" \"file\" } SQLQUERY\n");
1.1 bertrand 594:
595: return;
596: }
597: else if ((*s_etat_processus).test_instruction == 'Y')
598: {
599: (*s_etat_processus).nombre_arguments = -1;
600: return;
601: }
602:
603: if (test_cfsf(s_etat_processus, 31) == d_vrai)
604: {
605: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
606: {
607: return;
608: }
609: }
610:
611: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
612: &s_objet_1) == d_erreur)
613: {
614: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
615: return;
616: }
617:
618: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
619: &s_objet_2) == d_erreur)
620: {
621: liberation(s_etat_processus, s_objet_1);
622:
623: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
624: return;
625: }
626:
627: if ((*s_objet_1).type == LST)
628: {
629: connexion_permanente = d_faux;
630:
631: s_copie_1 = s_objet_1;
632:
633: if ((s_objet_1 = parametres_sql(s_etat_processus, s_copie_1)) == NULL)
634: {
635: liberation(s_etat_processus, s_copie_1);
636: liberation(s_etat_processus, s_objet_2);
637: return;
638: }
639:
1.45 bertrand 640: if ((*s_etat_processus).erreur_execution ==
641: d_ex_instruction_indisponible)
642: {
643: liberation(s_etat_processus, s_objet_1);
644: liberation(s_etat_processus, s_objet_2);
645: liberation(s_etat_processus, s_copie_1);
646:
647: return;
648: }
649:
1.1 bertrand 650: liberation(s_etat_processus, s_copie_1);
651: }
652: else
653: {
654: if ((*s_objet_1).type == SQL)
655: {
656: if (((*((struct_connecteur_sql *) (*s_objet_1).objet)).pid !=
657: getpid()) || (pthread_equal((*((struct_connecteur_sql *)
658: (*s_objet_1).objet)).tid, pthread_self()) == 0))
659: {
660: (*s_etat_processus).erreur_execution =
661: d_ex_fichier_hors_contexte;
662:
663: liberation(s_etat_processus, s_objet_1);
664: liberation(s_etat_processus, s_objet_2);
665: return;
666: }
667: }
668:
669: connexion_permanente = d_vrai;
670: }
671:
672: if (((*s_objet_1).type == SQL) && ((*s_objet_2).type == CHN))
673: {
674: if ((*((struct_connecteur_sql *) (*s_objet_1).objet)).locale != NULL)
675: {
676: /*
677: * Transcodage de la commande SQL
678: */
679:
680: if ((s_copie_2 = copie_objet(s_etat_processus, s_objet_2, 'O'))
681: == NULL)
682: {
683: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
684: return;
685: }
686:
687: liberation(s_etat_processus, s_objet_2);
688: s_objet_2 = s_copie_2;
689:
690: tampon = (*s_objet_2).objet;
691:
692: if (((*s_objet_2).objet = transliteration(s_etat_processus, tampon,
693: (*((struct_connecteur_sql *) (*s_objet_1).objet)).locale,
694: d_locale)) == NULL)
695: {
696: return;
697: }
698:
699: free(tampon);
700: }
701:
702: /*
703: * Pilote MySQL
704: */
705:
706: if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
707: "MYSQL") == 0)
708: {
709: # ifdef MYSQL_SUPPORT
710:
1.40 bertrand 711: unsigned int i;
712: unsigned int nombre_colonnes;
713:
714: logical1 presence_resultat;
715:
716: MYSQL_RES *resultat_mysql;
717: MYSQL_ROW ligne;
718:
719: struct_objet *s_objet_resultat;
720:
721: struct_liste_chainee *l_element_courant;
722: struct_liste_chainee *l_element_courant_ligne;
1.1 bertrand 723:
724: if (mysql_real_query((*((struct_connecteur_sql *) (*s_objet_1)
725: .objet)).descripteur.mysql, (unsigned char *) (*s_objet_2)
726: .objet, strlen((unsigned char *) (*s_objet_2).objet)) != 0)
727: {
728: if (connexion_permanente == d_faux)
729: {
730: mysql_close((*((struct_connecteur_sql *) (*s_objet_1)
731: .objet)).descripteur.mysql);
732: }
733:
734: liberation(s_etat_processus, s_objet_1);
735: liberation(s_etat_processus, s_objet_2);
736:
737: (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
738: return;
739: }
740:
741: if ((resultat_mysql = mysql_store_result(
742: (*((struct_connecteur_sql *) (*s_objet_1).objet))
743: .descripteur.mysql)) == NULL)
744: {
745: // La requête ne renvoie rien (exemple : INSERT)
746: presence_resultat = d_faux;
747: nombre_colonnes = 0;
748: }
749: else
750: {
751: // La requête renvoie une ou plusieurs valeurs.
752: presence_resultat = d_vrai;
753: nombre_colonnes = mysql_field_count((*((struct_connecteur_sql *)
754: (*s_objet_1).objet)).descripteur.mysql);
755: }
756:
757: if ((s_objet_resultat = allocation(s_etat_processus, LST))
758: == NULL)
759: {
760: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
761: return;
762: }
763:
764: (*s_objet_resultat).objet = NULL;
765: l_element_courant = (*s_objet_resultat).objet;
766:
767: while(((presence_resultat == d_vrai) ?
768: (ligne = mysql_fetch_row(resultat_mysql)) : NULL) != NULL)
769: {
770: unsigned long *longueurs;
771:
772: longueurs = mysql_fetch_lengths(resultat_mysql);
773:
774: if (l_element_courant == NULL)
775: {
776: if (((*s_objet_resultat).objet =
777: allocation_maillon(s_etat_processus)) == NULL)
778: {
779: (*s_etat_processus).erreur_systeme =
780: d_es_allocation_memoire;
781: return;
782: }
783:
784: l_element_courant = (struct_liste_chainee *)
785: (*s_objet_resultat).objet;
786: }
787: else
788: {
789: if (((*l_element_courant).suivant =
790: allocation_maillon(s_etat_processus)) == NULL)
791: {
792: (*s_etat_processus).erreur_systeme =
793: d_es_allocation_memoire;
794: return;
795: }
796:
797: l_element_courant = (*l_element_courant).suivant;
798: }
799:
800: (*l_element_courant).suivant = NULL;
801:
802: if (((*l_element_courant).donnee = allocation(s_etat_processus,
803: LST)) == NULL)
804: {
805: (*s_etat_processus).erreur_systeme =
806: d_es_allocation_memoire;
807: return;
808: }
809:
810: (*(*l_element_courant).donnee).objet = NULL;
811: l_element_courant_ligne = NULL;
812:
813: for(i = 0; i < nombre_colonnes; i++)
814: {
815: if (l_element_courant_ligne == NULL)
816: {
817: if (((*(*l_element_courant).donnee).objet =
818: allocation_maillon(s_etat_processus)) == NULL)
819: {
820: (*s_etat_processus).erreur_systeme =
821: d_es_allocation_memoire;
822: return;
823: }
824:
825: l_element_courant_ligne = (struct_liste_chainee *)
826: (*(*l_element_courant).donnee).objet;
827: }
828: else
829: {
830: if (((*l_element_courant_ligne).suivant =
831: allocation_maillon(s_etat_processus)) == NULL)
832: {
833: (*s_etat_processus).erreur_systeme =
834: d_es_allocation_memoire;
835: return;
836: }
837:
838: l_element_courant_ligne =
839: (*l_element_courant_ligne).suivant;
840: }
841:
842: (*l_element_courant_ligne).suivant = NULL;
843:
844: if (((*l_element_courant_ligne).donnee =
845: allocation(s_etat_processus, CHN)) == NULL)
846: {
847: (*s_etat_processus).erreur_systeme =
848: d_es_allocation_memoire;
849: return;
850: }
851:
852: if (ligne[i] == NULL)
853: {
854: if (((*(*l_element_courant_ligne).donnee).objet =
855: malloc(5 * sizeof(unsigned char))) == NULL)
856: {
857: (*s_etat_processus).erreur_systeme =
858: d_es_allocation_memoire;
859: return;
860: }
861:
862: strcpy((unsigned char *) (*(*l_element_courant_ligne)
863: .donnee).objet, "NULL");
864: }
865: else
866: {
867: if (((*(*l_element_courant_ligne).donnee).objet =
868: malloc((longueurs[i] + 1) *
869: sizeof(unsigned char))) == NULL)
870: {
871: (*s_etat_processus).erreur_systeme =
872: d_es_allocation_memoire;
873: return;
874: }
875:
876: strcpy((unsigned char *) (*(*l_element_courant_ligne)
877: .donnee).objet, ligne[i]);
878: }
879: }
880: }
881:
882: mysql_free_result(resultat_mysql);
883:
884: if (connexion_permanente == d_faux)
885: {
886: mysql_close((*((struct_connecteur_sql *) (*s_objet_1).objet))
887: .descripteur.mysql);
888: }
889:
890: if (presence_resultat == d_vrai)
891: {
892: if (empilement(s_etat_processus,
893: &((*s_etat_processus).l_base_pile),
894: s_objet_resultat) == d_erreur)
895: {
896: return;
897: }
898: }
899:
900: # else
901:
902: if ((*s_etat_processus).langue == 'F')
903: {
904: printf("+++Attention : Support de MySQL non compilé !\n");
905: }
906: else
907: {
908: printf("+++Warning : MySQL support not available !\n");
909: }
910:
911: fflush(stdout);
912: # endif
913: }
914:
915: /*
916: * Pilote PostgreSQL
917: */
918:
919: else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
920: "POSTGRESQL") == 0)
921: {
922: # ifdef POSTGRESQL_SUPPORT
923:
1.57 bertrand 924: int i;
925: int j;
926: int nombre_colonnes;
927: int nombre_lignes;
1.40 bertrand 928:
929: logical1 presence_resultat;
930:
931: PGresult *resultat_postgresql;
932:
933: struct_objet *s_objet_resultat;
934:
935: struct_liste_chainee *l_element_courant;
936: struct_liste_chainee *l_element_courant_ligne;
1.1 bertrand 937:
938: if (PQstatus((*((struct_connecteur_sql *) (*s_objet_1).objet))
939: .descripteur.postgresql) != CONNECTION_OK)
940: {
941: if (connexion_permanente == d_faux)
942: {
943: PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
944: .descripteur.postgresql);
945: }
946:
947: liberation(s_etat_processus, s_objet_1);
948: liberation(s_etat_processus, s_objet_2);
949:
950: (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
951: return;
952: }
953:
954: resultat_postgresql = PQexec((*((struct_connecteur_sql *)
955: (*s_objet_1).objet)).descripteur.postgresql,
956: (unsigned char *) (*s_objet_2).objet);
957: presence_resultat = d_faux;
958:
959: switch(PQresultStatus(resultat_postgresql))
960: {
961: case PGRES_COMMAND_OK :
962: { // Commande qui ne renvoit rien
963: if ((s_objet_resultat = allocation(s_etat_processus, LST))
964: == NULL)
965: {
966: (*s_etat_processus).erreur_systeme =
967: d_es_allocation_memoire;
968: return;
969: }
970:
971: (*s_objet_resultat).objet = NULL;
972: l_element_courant = (*s_objet_resultat).objet;
973: presence_resultat = d_vrai;
974:
975: break;
976: }
977:
978: case PGRES_TUPLES_OK :
979: { // Commande renvoyant des données
980: if ((s_objet_resultat = allocation(s_etat_processus, LST))
981: == NULL)
982: {
983: (*s_etat_processus).erreur_systeme =
984: d_es_allocation_memoire;
985: return;
986: }
987:
988: (*s_objet_resultat).objet = NULL;
989: l_element_courant = (*s_objet_resultat).objet;
990: presence_resultat = d_vrai;
991:
992: nombre_colonnes = PQnfields(resultat_postgresql);
993: nombre_lignes = PQntuples(resultat_postgresql);
994:
995: for(i = 0; i < nombre_lignes; i++)
996: {
997: // Chaînage d'un nouveau maillon de la liste résultat
998:
999: if (l_element_courant == NULL)
1000: {
1001: if (((*s_objet_resultat).objet =
1002: allocation_maillon(s_etat_processus))
1003: == NULL)
1004: {
1005: (*s_etat_processus).erreur_systeme =
1006: d_es_allocation_memoire;
1007: return;
1008: }
1009:
1010: l_element_courant = (struct_liste_chainee *)
1011: (*s_objet_resultat).objet;
1012: }
1013: else
1014: {
1015: if (((*l_element_courant).suivant =
1016: allocation_maillon(s_etat_processus))
1017: == NULL)
1018: {
1019: (*s_etat_processus).erreur_systeme =
1020: d_es_allocation_memoire;
1021: return;
1022: }
1023:
1024: l_element_courant = (*l_element_courant).suivant;
1025: }
1026:
1027: (*l_element_courant).suivant = NULL;
1028:
1029: // Création de la liste fille
1030:
1031: if (((*l_element_courant).donnee =
1032: allocation(s_etat_processus, LST)) == NULL)
1033: {
1034: (*s_etat_processus).erreur_systeme =
1035: d_es_allocation_memoire;
1036: return;
1037: }
1038:
1039: (*(*l_element_courant).donnee).objet = NULL;
1040: l_element_courant_ligne = NULL;
1041:
1042: for(j = 0; j < nombre_colonnes; j++)
1043: {
1044: if (l_element_courant_ligne == NULL)
1045: {
1046: if (((*(*l_element_courant).donnee).objet =
1047: allocation_maillon(s_etat_processus))
1048: == NULL)
1049: {
1050: (*s_etat_processus).erreur_systeme =
1051: d_es_allocation_memoire;
1052: return;
1053: }
1054:
1055: l_element_courant_ligne =
1056: (struct_liste_chainee *)
1057: (*(*l_element_courant).donnee).objet;
1058: }
1059: else
1060: {
1061: if (((*l_element_courant_ligne).suivant =
1062: allocation_maillon(s_etat_processus))
1063: == NULL)
1064: {
1065: l_element_courant_ligne =
1066: (*l_element_courant_ligne).suivant;
1067: }
1068:
1069: l_element_courant_ligne =
1070: (*l_element_courant_ligne).suivant;
1071: }
1072:
1073: (*l_element_courant_ligne).suivant = NULL;
1074:
1075: if (((*l_element_courant_ligne).donnee =
1076: allocation(s_etat_processus, CHN))
1077: == NULL)
1078: {
1079: (*s_etat_processus).erreur_systeme =
1080: d_es_allocation_memoire;
1081: return;
1082: }
1083:
1084: if (PQgetisnull(resultat_postgresql, i, j) != 0)
1085: {
1086: if (((*(*l_element_courant_ligne).donnee).objet
1087: = malloc(5 * sizeof(unsigned char)))
1088: == NULL)
1089: {
1090: (*s_etat_processus).erreur_systeme =
1091: d_es_allocation_memoire;
1092: return;
1093: }
1094:
1095: strcpy((unsigned char *)
1096: (*(*l_element_courant_ligne).donnee)
1097: .objet, "NULL");
1098: }
1099: else
1100: {
1101: if (((*(*l_element_courant_ligne).donnee).objet
1.57 bertrand 1102: = malloc(((size_t) (PQgetlength(
1103: resultat_postgresql, i, j) + 1)) *
1.1 bertrand 1104: sizeof(unsigned char))) == NULL)
1105: {
1106: (*s_etat_processus).erreur_systeme =
1107: d_es_allocation_memoire;
1108: return;
1109: }
1110:
1111: strcpy((unsigned char *)
1112: (*(*l_element_courant_ligne).donnee)
1113: .objet, PQgetvalue(resultat_postgresql,
1114: i, j));
1115: }
1116: }
1117: }
1118:
1119: break;
1120: }
1121:
1122: case PGRES_EMPTY_QUERY :
1123: case PGRES_COPY_OUT :
1124: case PGRES_COPY_IN :
1125: case PGRES_BAD_RESPONSE :
1126: case PGRES_NONFATAL_ERROR :
1127: case PGRES_FATAL_ERROR :
1128: default :
1129: {
1130: printf("%s\n", PQresultErrorMessage(resultat_postgresql));
1131: PQclear(resultat_postgresql);
1132:
1133: if (connexion_permanente == d_faux)
1134: {
1135: PQfinish((*((struct_connecteur_sql *) (*s_objet_1)
1136: .objet)).descripteur.postgresql);
1137: }
1138:
1139: liberation(s_etat_processus, s_objet_1);
1140: liberation(s_etat_processus, s_objet_2);
1141:
1142: (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
1143:
1144: return;
1145: break;
1146: }
1147: }
1148:
1149: PQclear(resultat_postgresql);
1150:
1151: if (connexion_permanente == d_faux)
1152: {
1153: PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
1154: .descripteur.postgresql);
1155: }
1156:
1157: if (presence_resultat == d_vrai)
1158: {
1159: if (empilement(s_etat_processus, &((*s_etat_processus)
1160: .l_base_pile), s_objet_resultat) == d_erreur)
1161: {
1162: return;
1163: }
1164: }
1165:
1166: # else
1167:
1168: if ((*s_etat_processus).langue == 'F')
1169: {
1170: printf("+++Attention : Support de PostgreSQL non compilé !\n");
1171: }
1172: else
1173: {
1174: printf("+++Warning : PostgreSQL support not available !\n");
1175: }
1176:
1177: fflush(stdout);
1178: # endif
1179: }
1.53 bertrand 1180: else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
1181: "SQLITE") == 0)
1182: {
1183: const char *queue;
1184: const unsigned char *resultat;
1185:
1.57 bertrand 1186: int i;
1.53 bertrand 1187: int ios;
1.57 bertrand 1188: int nombre_colonnes;
1.53 bertrand 1189:
1190: logical1 presence_resultat;
1191:
1192: sqlite3_stmt *ppStmt;
1193:
1194: struct_liste_chainee *l_element_courant;
1195: struct_liste_chainee *l_element_courant_ligne;
1196:
1197: struct_objet *s_objet_resultat;
1198:
1.54 bertrand 1199: struct timespec attente;
1200:
1.53 bertrand 1201: if (sqlite3_prepare_v2((*((struct_connecteur_sql *)
1202: (*s_objet_1).objet)).descripteur.sqlite,
1203: (unsigned char *) (*s_objet_2).objet,
1.57 bertrand 1204: (int) strlen((unsigned char *) (*s_objet_2).objet),
1.53 bertrand 1205: &ppStmt, &queue) != SQLITE_OK)
1206: {
1207: if (connexion_permanente == d_faux)
1208: {
1209: sqlite3_close((*((struct_connecteur_sql *)
1210: (*s_objet_1).objet)).descripteur.sqlite);
1211: }
1212:
1213: liberation(s_etat_processus, s_objet_1);
1214: liberation(s_etat_processus, s_objet_2);
1215:
1216: (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
1217: return;
1218: }
1219:
1220: presence_resultat = d_faux;
1221: s_objet_resultat = NULL;
1222: l_element_courant = NULL;
1223:
1.54 bertrand 1224: attente.tv_sec = 0;
1225: attente.tv_nsec = GRANULARITE_us * 1000;
1226:
1.53 bertrand 1227: do
1228: {
1229: switch(ios = sqlite3_step(ppStmt))
1230: {
1231: case SQLITE_ROW:
1232: {
1233: if (s_objet_resultat == NULL)
1234: {
1235: if ((s_objet_resultat =
1236: allocation(s_etat_processus, LST)) == NULL)
1237: {
1238: (*s_etat_processus).erreur_systeme =
1239: d_es_allocation_memoire;
1240: return;
1241: }
1242:
1243: presence_resultat = d_vrai;
1244:
1245: // Création d'une liste vide
1246:
1247: (*s_objet_resultat).objet = NULL;
1248: l_element_courant = (*s_objet_resultat).objet;
1249: }
1250:
1251: // Ajout d'une liste au bout de la liste
1252: // contenant les lignes
1253:
1254: if (l_element_courant == NULL)
1255: {
1256: if (((*s_objet_resultat).objet =
1257: allocation_maillon(s_etat_processus))
1258: == NULL)
1259: {
1260: (*s_etat_processus).erreur_systeme =
1261: d_es_allocation_memoire;
1262: }
1263:
1264: l_element_courant = (struct_liste_chainee *)
1265: (*s_objet_resultat).objet;
1266: }
1267: else
1268: {
1269: if (((*l_element_courant).suivant =
1270: allocation_maillon(s_etat_processus))
1271: == NULL)
1272: {
1273: (*s_etat_processus).erreur_systeme =
1274: d_es_allocation_memoire;
1275: return;
1276: }
1277:
1278: l_element_courant = (*l_element_courant).suivant;
1279: }
1280:
1281: (*l_element_courant).suivant = NULL;
1282:
1283: // Création de la liste fille
1284:
1285: if (((*l_element_courant).donnee =
1286: allocation(s_etat_processus, LST)) == NULL)
1287: {
1288: (*s_etat_processus).erreur_systeme =
1289: d_es_allocation_memoire;
1290: return;
1291: }
1292:
1293: (*(*l_element_courant).donnee).objet = NULL;
1294:
1295: // Lecture de la ligne
1296:
1297: nombre_colonnes = sqlite3_data_count(ppStmt);
1298: l_element_courant_ligne = NULL;
1299:
1300: for(i = 0; i < nombre_colonnes; i++)
1301: {
1302: if (l_element_courant_ligne == NULL)
1303: {
1304: if (((*(*l_element_courant).donnee).objet =
1305: allocation_maillon(s_etat_processus))
1306: == NULL)
1307: {
1308: (*s_etat_processus).erreur_systeme =
1309: d_es_allocation_memoire;
1310: return;
1311: }
1312:
1313: l_element_courant_ligne =
1314: (struct_liste_chainee *)
1315: (*(*l_element_courant).donnee).objet;
1316: }
1317: else
1318: {
1319: if (((*l_element_courant_ligne).suivant =
1320: allocation_maillon(s_etat_processus))
1321: == NULL)
1322: {
1323: l_element_courant_ligne =
1324: (*l_element_courant_ligne).suivant;
1325: }
1326:
1327: l_element_courant_ligne =
1328: (*l_element_courant_ligne).suivant;
1329: }
1330:
1331: (*l_element_courant_ligne).suivant = NULL;
1332:
1333: if (((*l_element_courant_ligne).donnee =
1334: allocation(s_etat_processus, CHN))
1335: == NULL)
1336: {
1337: (*s_etat_processus).erreur_systeme =
1338: d_es_allocation_memoire;
1339: return;
1340: }
1341:
1342: if (sqlite3_column_type(ppStmt, i) == SQLITE_NULL)
1343: {
1344: if (((*(*l_element_courant_ligne).donnee).objet
1345: = malloc(5 * sizeof(unsigned char)))
1346: == NULL)
1347: {
1348: (*s_etat_processus).erreur_systeme =
1349: d_es_allocation_memoire;
1350: return;
1351: }
1352:
1353: strcpy((unsigned char *)
1354: (*(*l_element_courant_ligne).donnee)
1355: .objet, "NULL");
1356: }
1357: else
1358: {
1359: if ((resultat = sqlite3_column_text(ppStmt, i))
1360: == NULL)
1361: {
1362: (*s_etat_processus).erreur_systeme =
1363: d_es_allocation_memoire;
1364: return;
1365: }
1366:
1367: if (((*(*l_element_courant_ligne).donnee).objet
1368: = malloc((strlen(resultat) + 1 ) *
1369: sizeof(unsigned char))) == NULL)
1370: {
1371: (*s_etat_processus).erreur_systeme =
1372: d_es_allocation_memoire;
1373: return;
1374: }
1375:
1376: strcpy((unsigned char *)
1377: (*(*l_element_courant_ligne).donnee)
1378: .objet, resultat);
1379: }
1380: }
1381:
1382: break;
1383: }
1384:
1385: case SQLITE_DONE:
1386: {
1387: // Fin de la lecture des données
1388: break;
1389: }
1390:
1.54 bertrand 1391: case SQLITE_BUSY:
1392: case SQLITE_LOCKED:
1393: {
1394: nanosleep(&attente, NULL);
1395: INCR_GRANULARITE(attente.tv_nsec);
1396: break;
1397: }
1398:
1.53 bertrand 1399: default:
1400: {
1401: (*s_etat_processus).erreur_systeme =
1402: d_es_erreur_fichier;
1403: return;
1404: }
1405: }
1406: } while(ios != SQLITE_DONE);
1407:
1408: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
1409: {
1410: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1411: return;
1412: }
1413:
1414: if (connexion_permanente == d_faux)
1415: {
1416: sqlite3_close((*((struct_connecteur_sql *) (*s_objet_1).objet))
1417: .descripteur.sqlite);
1418: }
1419:
1420: if (presence_resultat == d_vrai)
1421: {
1422: if (empilement(s_etat_processus, &((*s_etat_processus)
1423: .l_base_pile), s_objet_resultat) == d_erreur)
1424: {
1425: return;
1426: }
1427: }
1428: }
1.1 bertrand 1429: else
1430: {
1431: liberation(s_etat_processus, s_objet_1);
1432: liberation(s_etat_processus, s_objet_2);
1433:
1434: (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
1435: return;
1436: }
1437: }
1438: else
1439: {
1440: liberation(s_etat_processus, s_objet_1);
1441: liberation(s_etat_processus, s_objet_2);
1442:
1443: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1444: return;
1445: }
1446:
1447: liberation(s_etat_processus, s_objet_1);
1448: liberation(s_etat_processus, s_objet_2);
1449:
1450: return;
1451: }
1452:
1453:
1454: /*
1455: ================================================================================
1456: Fonction 'stop'
1457: ================================================================================
1458: Entrées :
1459: --------------------------------------------------------------------------------
1460: Sorties :
1461: --------------------------------------------------------------------------------
1462: Effets de bord : néant
1463: ================================================================================
1464: */
1465:
1466: void
1467: instruction_stop(struct_processus *s_etat_processus)
1468: {
1469: struct_liste_chainee *l_element_courant;
1470:
1471: struct_objet *s_objet;
1472:
1473: (*s_etat_processus).erreur_execution = d_ex;
1474:
1475: if ((*s_etat_processus).affichage_arguments == 'Y')
1476: {
1477: printf("\n STOP ");
1478:
1479: if ((*s_etat_processus).langue == 'F')
1480: {
1481: printf("(arrêt d'un processus)\n\n");
1482: }
1483: else
1484: {
1485: printf("(kill process)\n\n");
1486: }
1487:
1488: printf(" 1: %s\n", d_PRC);
1489:
1490: return;
1491: }
1492: else if ((*s_etat_processus).test_instruction == 'Y')
1493: {
1494: (*s_etat_processus).nombre_arguments = -1;
1495: return;
1496: }
1497:
1498: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1499: {
1500: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1501: {
1502: return;
1503: }
1504: }
1505:
1506: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1507: &s_objet) == d_erreur)
1508: {
1509: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1510: return;
1511: }
1512:
1513: if ((*s_objet).type == PRC)
1514: {
1515: if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1516: .processus_detache == d_vrai)
1517: {
1.33 bertrand 1518: envoi_signal_processus((*(*((struct_processus_fils *)
1519: (*s_objet).objet)).thread).pid, rpl_sigstop);
1.1 bertrand 1520: }
1521: else
1522: {
1.60 bertrand 1523: if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus))
1524: != 0)
1.1 bertrand 1525: {
1526: (*s_etat_processus).erreur_systeme = d_es_processus;
1527: return;
1528: }
1529:
1530: l_element_courant = (struct_liste_chainee *)
1531: (*s_etat_processus).l_base_pile_processus;
1532:
1533: while(l_element_courant != NULL)
1534: {
1535: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
1536: .donnee).objet)).thread).processus_detache == d_faux)
1537: {
1538: if ((pthread_equal((*(*((struct_processus_fils *)
1.9 bertrand 1539: (*(*l_element_courant).donnee).objet)).thread).tid,
1.1 bertrand 1540: (*(*((struct_processus_fils *)
1541: (*s_objet).objet)).thread).tid) != 0) &&
1542: ((*(*((struct_processus_fils *)
1543: (*(*l_element_courant).donnee).objet)).thread).pid
1544: == (*(*((struct_processus_fils *)
1545: (*s_objet).objet)).thread).pid))
1546: {
1547: break;
1548: }
1549: }
1550:
1551: l_element_courant = (*l_element_courant).suivant;
1552: }
1553:
1554: if (l_element_courant != NULL)
1555: {
1556: // Le champ thread_actif est un pointeur sur un champ de la
1557: // structure s_argument_thread libéré par la fonction
1558: // retrait_thread_surveillance().
1559:
1560: if ((*(*((struct_processus_fils *)
1561: (*s_objet).objet)).thread).thread_actif == d_vrai)
1562: {
1563: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
1564: (*s_objet).objet)).thread).mutex)) != 0)
1565: {
1.60 bertrand 1566: if (pthread_mutex_unlock(&((*s_etat_processus)
1567: .mutex_pile_processus)) != 0)
1.1 bertrand 1568: {
1569: (*s_etat_processus).erreur_systeme = d_es_processus;
1570: return;
1571: }
1572:
1573: (*s_etat_processus).erreur_systeme = d_es_processus;
1574: return;
1575: }
1576:
1577: if ((*(*((struct_processus_fils *)
1578: (*s_objet).objet)).thread).thread_actif == d_vrai)
1579: {
1.33 bertrand 1580: envoi_signal_thread((*(*((struct_processus_fils *)
1581: (*s_objet).objet)).thread).tid, rpl_sigstop);
1.1 bertrand 1582: }
1583:
1584: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
1585: (*s_objet).objet)).thread).mutex)) != 0)
1586: {
1.60 bertrand 1587: if (pthread_mutex_unlock(&((*s_etat_processus)
1588: .mutex_pile_processus)) != 0)
1.1 bertrand 1589: {
1590: (*s_etat_processus).erreur_systeme = d_es_processus;
1591: return;
1592: }
1593:
1594: (*s_etat_processus).erreur_systeme = d_es_processus;
1595: return;
1596: }
1597: }
1598: }
1599:
1.60 bertrand 1600: if (pthread_mutex_unlock(&((*s_etat_processus)
1601: .mutex_pile_processus)) != 0)
1.1 bertrand 1602: {
1603: (*s_etat_processus).erreur_systeme = d_es_processus;
1604: return;
1605: }
1606: }
1607: }
1608: else
1609: {
1610: liberation(s_etat_processus, s_objet);
1611:
1612: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1613: return;
1614: }
1615:
1616: liberation(s_etat_processus, s_objet);
1617:
1618: return;
1619: }
1620:
1621: // vim: ts=4