Annotation of rpl/src/instructions_s10.c, revision 1.21
1.1 bertrand 1: /*
2: ================================================================================
1.18 bertrand 3: RPL/2 (R) version 4.0.18
1.1 bertrand 4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
1.19 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
28: Fonction 'spawn'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_spawn(struct_processus *s_etat_processus)
40: {
41: logical1 drapeau;
42: logical1 variable_partagee;
43:
44: pthread_attr_t attributs;
45:
46: pthread_mutexattr_t attributs_mutex;
47:
48: pthread_t thread_id;
49: pthread_t thread_surveillance;
50:
51: sigset_t oldset;
52: sigset_t set;
53:
54: struct_descripteur_thread *s_argument_thread;
55:
56: struct_liste_chainee *l_element_courant;
57:
58: struct_objet *s_copie;
59: struct_objet *s_objet;
60: struct_objet *s_objet_resultat;
61: struct_objet *s_objet_systeme;
62:
63: struct_processus *s_nouvel_etat_processus;
64:
65: struct timespec attente;
66:
67: (*s_etat_processus).erreur_execution = d_ex;
68:
69: if ((*s_etat_processus).affichage_arguments == 'Y')
70: {
71: printf("\n SPAWN ");
72:
73: if ((*s_etat_processus).langue == 'F')
74: {
75: printf("(lancement d'un thread)\n\n");
76: }
77: else
78: {
79: printf("(create thread)\n\n");
80: }
81:
82: printf(" 1: %s, %s\n", d_NOM, d_RPN);
83: printf("-> 1: %s\n", d_PRC);
84:
85: return;
86: }
87: else if ((*s_etat_processus).test_instruction == 'Y')
88: {
89: (*s_etat_processus).nombre_arguments = -1;
90: return;
91: }
92:
1.21 ! bertrand 93: # ifdef _BROKEN_SIGINFO
! 94: if ((*s_etat_processus).langue == 'F')
! 95: {
! 96: printf("+++Attention : Support des processus multiples indisponible\n");
! 97: }
! 98: else
! 99: {
! 100: printf("+++Attention : Multiprocess unavailable\n");
! 101: }
! 102:
! 103: return;
! 104: # endif
! 105:
1.1 bertrand 106: if (test_cfsf(s_etat_processus, 31) == d_vrai)
107: {
108: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
109: {
110: return;
111: }
112: }
113:
114: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
115: &s_objet) == d_erreur)
116: {
117: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
118: return;
119: }
120:
121: /*
122: * Une routine fille doit pouvoir renvoyer des objets au processus
123: * père au travers de la fonction SEND. Il ne peut donc s'agir que
124: * d'une fonction ou d'une expression RPN.
125: */
126:
1.8 bertrand 127: if (((*s_objet).type != NOM) && ((*s_objet).type != RPN))
1.1 bertrand 128: {
129: liberation(s_etat_processus, s_objet);
130:
131: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
132: return;
133: }
134:
135: /*
136: * Si l'argument est de type NOM, il faut que la variable correspondante
137: * soit une variable de type RPN.
138: */
139:
140: variable_partagee = d_faux;
141: s_copie = NULL;
142:
143: if ((*s_objet).type == NOM)
144: {
145: if (recherche_variable(s_etat_processus, (*((struct_nom *)
146: (*s_objet).objet)).nom) == d_vrai)
147: {
148: if ((*s_etat_processus).s_liste_variables
149: [(*s_etat_processus).position_variable_courante].objet
150: == NULL)
151: {
152: if (pthread_mutex_lock(&((*(*s_etat_processus)
153: .s_liste_variables_partagees).mutex)) != 0)
154: {
155: (*s_etat_processus).erreur_systeme = d_es_processus;
156: return;
157: }
158:
159: if (recherche_variable_partagee(s_etat_processus,
160: (*s_etat_processus).s_liste_variables
161: [(*s_etat_processus).position_variable_courante].nom,
162: (*s_etat_processus).s_liste_variables
163: [(*s_etat_processus).position_variable_courante]
164: .variable_partagee, (*s_etat_processus)
165: .s_liste_variables[(*s_etat_processus)
166: .position_variable_courante].origine) == d_faux)
167: {
168: if (pthread_mutex_unlock(&((*(*s_etat_processus)
169: .s_liste_variables_partagees).mutex)) != 0)
170: {
171: (*s_etat_processus).erreur_systeme = d_es_processus;
172: return;
173: }
174:
175: liberation(s_etat_processus, s_objet);
176:
177: (*s_etat_processus).erreur_systeme = d_es;
178: (*s_etat_processus).erreur_execution =
179: d_ex_argument_invalide;
180: return;
181: }
182:
183: if (((*(*(*s_etat_processus).s_liste_variables_partagees)
184: .table[(*(*s_etat_processus)
185: .s_liste_variables_partagees).position_variable].objet)
186: .type != RPN) && ((*(*(*s_etat_processus)
187: .s_liste_variables_partagees).table
188: [(*(*s_etat_processus).s_liste_variables_partagees)
189: .position_variable].objet).type != ADR))
190: {
191: if (pthread_mutex_unlock(&((*(*s_etat_processus)
192: .s_liste_variables_partagees).mutex)) != 0)
193: {
194: (*s_etat_processus).erreur_systeme = d_es_processus;
195: return;
196: }
197:
198: liberation(s_etat_processus, s_objet);
199:
200: (*s_etat_processus).erreur_execution =
201: d_ex_argument_invalide;
202: return;
203: }
204:
205: if ((s_copie = copie_objet(s_etat_processus,
206: (*(*s_etat_processus)
207: .s_liste_variables_partagees).table
208: [(*(*s_etat_processus).s_liste_variables_partagees)
209: .position_variable].objet, 'P')) == NULL)
210: {
211: if (pthread_mutex_unlock(&((*(*s_etat_processus)
212: .s_liste_variables_partagees).mutex)) != 0)
213: {
214: (*s_etat_processus).erreur_systeme = d_es_processus;
215: return;
216: }
217:
218: (*s_etat_processus).erreur_systeme =
219: d_es_allocation_memoire;
220:
221: return;
222: }
223:
224: variable_partagee = d_vrai;
225:
226: if (pthread_mutex_unlock(&((*(*s_etat_processus)
227: .s_liste_variables_partagees).mutex)) != 0)
228: {
229: (*s_etat_processus).erreur_systeme = d_es_processus;
230: return;
231: }
232: }
233: else
234: {
235: if (((*(*s_etat_processus).s_liste_variables
236: [(*s_etat_processus).position_variable_courante].objet)
237: .type != RPN) && ((*(*s_etat_processus)
238: .s_liste_variables[(*s_etat_processus)
239: .position_variable_courante].objet).type != ADR))
240: {
241: liberation(s_etat_processus, s_objet);
242:
243: (*s_etat_processus).erreur_execution =
244: d_ex_argument_invalide;
245: return;
246: }
247: }
248: }
249: else // Variable inexistante
250: {
251: liberation(s_etat_processus, s_objet);
252:
253: (*s_etat_processus).erreur_systeme = d_es;
254: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
255: return;
256: }
257: }
258:
259: if (sigemptyset(&set) != 0)
260: {
261: (*s_etat_processus).erreur_systeme = d_es_processus;
262: return;
263: }
264:
265: if (sigaddset(&set, SIGSTART) != 0)
266: {
267: (*s_etat_processus).erreur_systeme = d_es_processus;
268: return;
269: }
270:
271: /*
272: * Le signal SIGFSTOP doit être traité !
273: */
274:
275: if (sigaddset(&set, SIGFSTOP) != 0)
276: {
277: (*s_etat_processus).erreur_systeme = d_es_processus;
278: return;
279: }
280:
1.10 bertrand 281: if (sigaddset(&set, SIGFABORT) != 0)
282: {
283: (*s_etat_processus).erreur_systeme = d_es_processus;
284: return;
285: }
286:
1.1 bertrand 287: if (sigaddset(&set, SIGURG) != 0)
288: {
289: (*s_etat_processus).erreur_systeme = d_es_processus;
290: return;
291: }
292:
293: if (pthread_sigmask(SIG_BLOCK, &set, &oldset) != 0)
294: {
295: (*s_etat_processus).erreur_systeme = d_es_processus;
296: return;
297: }
298:
299: if ((s_argument_thread = malloc(sizeof(struct_descripteur_thread))) == NULL)
300: {
301: (*s_etat_processus).erreur_systeme = d_es_processus;
302: return;
303: }
304:
305: if (pipe((*s_argument_thread).pipe_erreurs) != 0)
306: {
307: (*s_etat_processus).erreur_systeme = d_es_processus;
308: return;
309: }
310:
311: if (pipe((*s_argument_thread).pipe_interruptions) != 0)
312: {
313: (*s_etat_processus).erreur_systeme = d_es_processus;
314: return;
315: }
316:
317: if (pipe((*s_argument_thread).pipe_nombre_interruptions_attente) != 0)
318: {
319: (*s_etat_processus).erreur_systeme = d_es_processus;
320: return;
321: }
322:
323: if (pipe((*s_argument_thread).pipe_objets) != 0)
324: {
325: (*s_etat_processus).erreur_systeme = d_es_processus;
326: return;
327: }
328:
329: if (pipe((*s_argument_thread).pipe_acquittement) != 0)
330: {
331: (*s_etat_processus).erreur_systeme = d_es_processus;
332: return;
333: }
334:
335: if (pipe((*s_argument_thread).pipe_nombre_objets_attente) != 0)
336: {
337: (*s_etat_processus).erreur_systeme = d_es_processus;
338: return;
339: }
340:
341: if (pipe((*s_argument_thread).pipe_injections) != 0)
342: {
343: (*s_etat_processus).erreur_systeme = d_es_processus;
344: return;
345: }
346:
347: if (pipe((*s_argument_thread).pipe_nombre_injections) != 0)
348: {
349: (*s_etat_processus).erreur_systeme = d_es_processus;
350: return;
351: }
352:
353: if ((s_nouvel_etat_processus = copie_etat_processus(s_etat_processus))
354: == NULL)
355: {
356: return;
357: }
358:
359: pthread_mutexattr_init(&attributs_mutex);
360: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
361: pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex);
362: pthread_mutexattr_destroy(&attributs_mutex);
363:
364: (*s_argument_thread).processus_detache = d_faux;
365: (*s_argument_thread).thread_actif = d_faux;
366: (*s_argument_thread).thread_pere = pthread_self();
367: (*s_argument_thread).pid = getpid();
368:
369: (*s_nouvel_etat_processus).pipe_donnees =
370: (*s_argument_thread).pipe_objets[1];
371: (*s_nouvel_etat_processus).pipe_nombre_objets_attente =
372: (*s_argument_thread).pipe_nombre_objets_attente[1];
373: (*s_nouvel_etat_processus).pipe_interruptions =
374: (*s_argument_thread).pipe_interruptions[1];
375: (*s_nouvel_etat_processus).pipe_nombre_interruptions_attente =
376: (*s_argument_thread).pipe_nombre_interruptions_attente[1];
377: (*s_nouvel_etat_processus).pipe_injections =
378: (*s_argument_thread).pipe_injections[0];
379: (*s_nouvel_etat_processus).pipe_nombre_injections =
380: (*s_argument_thread).pipe_nombre_injections[0];
381: (*s_nouvel_etat_processus).pipe_acquittement =
382: (*s_argument_thread).pipe_acquittement[0];
383: (*s_nouvel_etat_processus).presence_pipes = d_vrai;
384:
385: (*s_nouvel_etat_processus).niveau_initial =
386: (*s_etat_processus).niveau_courant;
387: (*s_nouvel_etat_processus).debug_programme = d_faux;
388: (*s_nouvel_etat_processus).nombre_objets_injectes = 0;
389: (*s_nouvel_etat_processus).nombre_objets_envoyes_non_lus = 0;
390: (*s_nouvel_etat_processus).temps_maximal_cpu = 0;
391: (*s_nouvel_etat_processus).presence_fusible = d_faux;
392: (*s_nouvel_etat_processus).thread_fusible = 0;
393:
394: (*s_nouvel_etat_processus).pile_profilage = NULL;
395: (*s_nouvel_etat_processus).pile_profilage_fonctions = NULL;
396:
397: /*
398: * Lancement du thread fils et du thread de surveillance
399: */
400:
401: if (pthread_attr_init(&attributs) != 0)
402: {
403: (*s_etat_processus).erreur_systeme = d_es_processus;
404: return;
405: }
406:
407: if (pthread_attr_setdetachstate(&attributs, PTHREAD_CREATE_JOINABLE) != 0)
408: {
409: (*s_etat_processus).erreur_systeme = d_es_processus;
410: return;
411: }
412:
1.19 bertrand 413: # ifndef OS2
1.1 bertrand 414: if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
415: {
416: (*s_etat_processus).erreur_systeme = d_es_processus;
417: return;
418: }
419:
420: if (pthread_attr_setinheritsched(&attributs, PTHREAD_EXPLICIT_SCHED) != 0)
421: {
422: (*s_etat_processus).erreur_systeme = d_es_processus;
423: return;
424: }
425:
426: if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
427: {
428: (*s_etat_processus).erreur_systeme = d_es_processus;
429: return;
430: }
1.19 bertrand 431: # endif
1.1 bertrand 432:
433: /*
434: * Création de l'objet à retourner
435: */
436:
437: if ((s_objet_resultat = allocation(s_etat_processus, PRC)) == NULL)
438: {
439: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
440: return;
441: }
442:
443: (*((struct_processus_fils *) (*s_objet_resultat).objet)).thread
444: = s_argument_thread;
445:
446: (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
447: .nombre_objets_dans_pipe = 0;
448: (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
449: .nombre_interruptions_dans_pipe = 0;
450: (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
451: .nombre_references = 1;
452:
453: // Lancement du thread fils
454:
455: if (pthread_mutex_lock(&((*s_nouvel_etat_processus).mutex)) != 0)
456: {
457: (*s_etat_processus).erreur_systeme = d_es_processus;
458: return;
459: }
460:
461: (*s_argument_thread).s_nouvel_etat_processus = s_nouvel_etat_processus;
462: (*s_argument_thread).s_etat_processus = s_etat_processus;
463:
464: if (variable_partagee == d_vrai)
465: {
466: (*s_argument_thread).argument = s_copie;
467: (*s_argument_thread).destruction_objet = d_vrai;
468: }
469: else
470: {
471: (*s_argument_thread).argument = s_objet;
472: (*s_argument_thread).destruction_objet = d_faux;
473: }
474:
475: (*s_argument_thread).set = set;
476: (*s_argument_thread).oldset = oldset;
1.15 bertrand 477: (*s_argument_thread).thread_actif = d_faux;
1.1 bertrand 478:
479: if (pthread_create(&thread_id, &attributs, lancement_thread,
480: s_argument_thread) != 0)
481: {
482: (*s_etat_processus).erreur_systeme = d_es_processus;
483: return;
484: }
485:
1.15 bertrand 486: attente.tv_sec = 0;
487: attente.tv_nsec = GRANULARITE_us * 1000;
488:
489: while((*s_argument_thread).thread_actif == d_faux)
490: {
491: nanosleep(&attente, NULL);
492: INCR_GRANULARITE(attente.tv_nsec);
493: }
494:
1.1 bertrand 495: if (pthread_attr_destroy(&attributs) != 0)
496: {
497: (*s_etat_processus).erreur_systeme = d_es_processus;
498: return;
499: }
500:
501: if (pthread_attr_init(&attributs) != 0)
502: {
503: (*s_etat_processus).erreur_systeme = d_es_processus;
504: return;
505: }
506:
507: if (pthread_attr_setdetachstate(&attributs,
508: PTHREAD_CREATE_DETACHED) != 0)
509: {
510: (*s_etat_processus).erreur_systeme = d_es_processus;
511: return;
512: }
513:
1.19 bertrand 514: # ifndef OS2
1.1 bertrand 515: if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
516: {
517: (*s_etat_processus).erreur_systeme = d_es_processus;
518: return;
519: }
520:
521: if (pthread_attr_setinheritsched(&attributs,
522: PTHREAD_EXPLICIT_SCHED) != 0)
523: {
524: (*s_etat_processus).erreur_systeme = d_es_processus;
525: return;
526: }
527:
528: if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
529: {
530: (*s_etat_processus).erreur_systeme = d_es_processus;
531: return;
532: }
1.19 bertrand 533: # endif
1.1 bertrand 534:
535: // Attente de l'affectation de la grandeur processus.tid par le thread fils.
536:
537: if (pthread_mutex_lock(&((*s_nouvel_etat_processus).mutex)) != 0)
538: {
539: (*s_etat_processus).erreur_systeme = d_es_processus;
540: return;
541: }
542:
543: /*
544: * On copie l'objet plutôt que le pointeur car cet objet peut être
545: * accédé depuis deux threads distincts et aboutir à un blocage lors d'une
546: * copie.
547: */
548:
549: if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet_resultat, 'O'))
550: == NULL)
551: {
552: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
553: return;
554: }
555:
556: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
557: {
558: (*s_etat_processus).erreur_systeme = d_es_processus;
559: return;
560: }
561:
562: // Si le tid existe déjà dans la pile des processus, il s'agit forcement
563: // d'un processus moribond. On attend donc qu'il soit effectivement
564: // libéré.
565:
566: do
567: {
568: l_element_courant = (struct_liste_chainee *)
569: (*s_etat_processus).l_base_pile_processus;
570: drapeau = d_faux;
571:
572: attente.tv_sec = 0;
573: attente.tv_nsec = GRANULARITE_us * 1000;
574:
575: while(l_element_courant != NULL)
576: {
577: if (((*(*((struct_processus_fils *)
578: (*(*l_element_courant).donnee).objet)).thread)
579: .processus_detache == d_faux) &&
580: ((*s_argument_thread).processus_detache == d_faux))
581: {
582: if (pthread_equal((*(*((struct_processus_fils *)
583: (*(*l_element_courant).donnee).objet)).thread)
584: .tid, (*s_argument_thread).tid) != 0)
585: {
586: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
587: {
588: (*s_etat_processus).erreur_systeme = d_es_processus;
589: return;
590: }
591:
592: scrutation_injection(s_etat_processus);
593:
594: if ((*s_etat_processus).nombre_interruptions_non_affectees
595: != 0)
596: {
597: affectation_interruptions_logicielles(s_etat_processus);
598: }
599:
600: if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
601: {
602: traitement_interruptions_logicielles(s_etat_processus);
603: }
604:
605: nanosleep(&attente, NULL);
606: INCR_GRANULARITE(attente.tv_nsec);
607:
608: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
609: {
610: (*s_etat_processus).erreur_systeme = d_es_processus;
611: return;
612: }
613:
614: drapeau = d_vrai;
615: break;
616: }
617: }
618:
619: l_element_courant = (*l_element_courant).suivant;
620: }
621: } while(drapeau == d_vrai);
622:
623: if (empilement(s_etat_processus,
624: (struct_liste_chainee **) &((*s_etat_processus)
625: .l_base_pile_processus), s_objet_systeme) == d_erreur)
626: {
627: pthread_mutex_unlock(&((*s_etat_processus).mutex));
628: pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
629: return;
630: }
631:
632: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
633: {
634: (*s_etat_processus).erreur_systeme = d_es_processus;
635: return;
636: }
637:
638: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
639: s_objet_resultat) == d_erreur)
640: {
641: pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
642: return;
643: }
644:
645: if (pthread_mutex_lock(&(*s_argument_thread).mutex) != 0)
646: {
647: pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
648: (*s_etat_processus).erreur_systeme = d_es_processus;
649: return;
650: }
651:
652: if ((*s_argument_thread).thread_actif == d_faux)
653: {
654: // Le thread n'existe plus.
655:
656: pthread_join((*s_argument_thread).tid, NULL);
657: pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
658: pthread_mutex_unlock(&(*s_argument_thread).mutex);
659: (*s_etat_processus).erreur_systeme = d_es_processus;
660: return;
661: }
662:
663: if (pthread_mutex_unlock(&(*s_argument_thread).mutex) != 0)
664: {
665: pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
666: (*s_etat_processus).erreur_systeme = d_es_processus;
667: return;
668: }
669:
670: if (pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)) != 0)
671: {
672: (*s_etat_processus).erreur_systeme = d_es_processus;
673: return;
674: }
675:
676: // Lancement du thread de surveillance
677:
678: if (pthread_create(&thread_surveillance, &attributs,
679: surveillance_processus, s_argument_thread) != 0)
680: {
681: (*s_etat_processus).erreur_systeme = d_es_processus;
682: return;
683: }
684:
685: if (pthread_attr_destroy(&attributs) != 0)
686: {
687: (*s_etat_processus).erreur_systeme = d_es_processus;
688: return;
689: }
690:
691: // Le fils peut être présent sans être en attente du signal de départ.
692:
693: if (pthread_kill((*s_argument_thread).tid, SIGSTART) != 0)
694: {
695: (*s_etat_processus).erreur_systeme = d_es_processus;
696: return;
697: }
698:
699: if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0)
700: {
701: (*s_etat_processus).erreur_systeme = d_es_processus;
702: return;
703: }
704:
705: sigpending(&set);
706:
707: return;
708: }
709:
710:
711: /*
712: ================================================================================
713: Fonction 'sqlconnect'
714: ================================================================================
715: Entrées :
716: --------------------------------------------------------------------------------
717: Sorties :
718: --------------------------------------------------------------------------------
719: Effets de bord : néant
720: ================================================================================
721: */
722:
723: void
724: instruction_sqlconnect(struct_processus *s_etat_processus)
725: {
726: struct_objet *s_objet_argument;
727: struct_objet *s_objet_resultat;
728: struct_objet *s_objet_systeme;
729:
730: (*s_etat_processus).erreur_execution = d_ex;
731:
732: if ((*s_etat_processus).affichage_arguments == 'Y')
733: {
734: printf("\n SQLCONNECT ");
735:
736: if ((*s_etat_processus).langue == 'F')
737: {
738: printf("(connexion à une base de données SQL)\n\n");
739: }
740: else
741: {
742: printf("(connect to SQL database)\n\n");
743: }
744:
745: printf(" 1: %s\n", d_LST);
746: printf("-> 1: %s\n\n", d_SQL);
747:
748: if ((*s_etat_processus).langue == 'F')
749: {
750: printf(" Utilisation :\n\n");
751: }
752: else
753: {
754: printf(" Usage:\n\n");
755: }
756:
757: printf(" { \"mysql\" \"server\" \"database\" "
758: "\"user\" \"password\" } SQLCONNECT\n");
759: printf(" { \"postgresql:iso-8859-1\" \"server\" "
760: "\"database\" \"user\" \"password\" port }\n");
761: printf(" SQLCONNECT\n");
762:
763: return;
764: }
765: else if ((*s_etat_processus).test_instruction == 'Y')
766: {
767: (*s_etat_processus).nombre_arguments = -1;
768: return;
769: }
770:
771: if (test_cfsf(s_etat_processus, 31) == d_vrai)
772: {
773: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
774: {
775: return;
776: }
777: }
778:
779: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
780: &s_objet_argument) == d_erreur)
781: {
782: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
783: return;
784: }
785:
786: if ((*s_objet_argument).type == LST)
787: {
788: if ((s_objet_resultat = parametres_sql(s_etat_processus,
789: s_objet_argument)) == NULL)
790: {
791: liberation(s_etat_processus, s_objet_argument);
792: return;
793: }
794:
795: if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet_resultat,
796: 'O')) == NULL)
797: {
798: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
799: return;
800: }
801:
802: if (empilement(s_etat_processus,
803: (struct_liste_chainee **) &((*s_etat_processus)
804: .s_connecteurs_sql), s_objet_systeme) == d_erreur)
805: {
806: return;
807: }
808:
809: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
810: s_objet_resultat) == d_erreur)
811: {
812: return;
813: }
814: }
815: else
816: {
817: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
818:
819: liberation(s_etat_processus, s_objet_argument);
820: return;
821: }
822:
823: liberation(s_etat_processus, s_objet_argument);
824: return;
825: }
826:
827:
828: /*
829: ================================================================================
1.8 bertrand 830: Fonction 'sqldisconnect'
1.1 bertrand 831: ================================================================================
832: Entrées :
833: --------------------------------------------------------------------------------
834: Sorties :
835: --------------------------------------------------------------------------------
836: Effets de bord : néant
837: ================================================================================
838: */
839:
840: void
841: instruction_sqldisconnect(struct_processus *s_etat_processus)
842: {
843: logical1 drapeau;
844:
845: struct_liste_chainee *l_element_courant;
846: struct_liste_chainee *l_element_precedent;
847:
848: struct_objet *s_objet;
849:
850: (*s_etat_processus).erreur_execution = d_ex;
851:
852: if ((*s_etat_processus).affichage_arguments == 'Y')
853: {
854: printf("\n SQLDISCONNECT ");
855:
856: if ((*s_etat_processus).langue == 'F')
857: {
858: printf("(déconnexion d'une base de donnée SQL)\n\n");
859: }
860: else
861: {
862: printf("(disconnection from SQL database)\n\n");
863: }
864:
865: printf(" 1: %s\n", d_SQL);
866: return;
867: }
868: else if ((*s_etat_processus).test_instruction == 'Y')
869: {
870: (*s_etat_processus).nombre_arguments = -1;
871: return;
872: }
873:
874: if (test_cfsf(s_etat_processus, 31) == d_vrai)
875: {
876: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
877: {
878: return;
879: }
880: }
881:
882: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
883: &s_objet) == d_erreur)
884: {
885: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
886: return;
887: }
888:
889: if ((*s_objet).type == SQL)
890: {
891: if (((*((struct_connecteur_sql *) (*s_objet).objet)).pid !=
892: getpid()) || (pthread_equal((*((struct_connecteur_sql *)
893: (*s_objet).objet)).tid, pthread_self()) == 0))
894: {
895: (*s_etat_processus).erreur_execution = d_ex_fichier_hors_contexte;
896:
897: liberation(s_etat_processus, s_objet);
898: return;
899: }
900:
901: l_element_courant = (*s_etat_processus).s_connecteurs_sql;
902: l_element_precedent = NULL;
903:
904: while(l_element_courant != NULL)
905: {
906: if (((*((struct_connecteur_sql *) (*(*l_element_courant).donnee)
907: .objet)).pid == getpid()) && (pthread_equal(
908: (*((struct_connecteur_sql *) (*(*l_element_courant).donnee)
909: .objet)).tid, pthread_self()) != 0) &&
910: (strcmp((*((struct_connecteur_sql *) (*(*l_element_courant)
911: .donnee).objet)).type, (*((struct_connecteur_sql *)
912: (*s_objet).objet)).type) == 0))
913: {
914: if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type,
915: "MYSQL") == 0)
916: {
917: # ifdef MYSQL_SUPPORT
1.17 bertrand 918:
1.1 bertrand 919: if ((*((struct_connecteur_sql *) (*(*l_element_courant)
920: .donnee).objet)).descripteur.mysql ==
921: (*((struct_connecteur_sql *) (*s_objet).objet))
922: .descripteur.mysql)
923: {
924: drapeau = d_vrai;
925: }
926: else
927: {
928: drapeau = d_faux;
929: }
1.17 bertrand 930:
1.1 bertrand 931: # else
932:
933: if ((*s_etat_processus).langue == 'F')
934: {
935: printf("+++Attention : Support de MySQL "
936: "non compilé !\n");
937: }
938: else
939: {
940: printf("+++Warning : MySQL support not available !\n");
941: }
942:
943: fflush(stdout);
944:
945: drapeau = d_faux;
946: # endif
947: }
948: else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet))
949: .type, "POSTGRESQL") == 0)
950: {
951: # ifdef POSTGRESQL_SUPPORT
1.17 bertrand 952:
1.1 bertrand 953: if ((*((struct_connecteur_sql *) (*(*l_element_courant)
954: .donnee).objet)).descripteur.postgresql ==
955: (*((struct_connecteur_sql *) (*s_objet).objet))
956: .descripteur.postgresql)
957: {
958: drapeau = d_vrai;
959: }
960: else
961: {
962: drapeau = d_faux;
963: }
964:
965: # else
966:
967: if ((*s_etat_processus).langue == 'F')
968: {
969: printf("+++Attention : Support de PostgreSQL "
970: "non compilé !\n");
971: }
972: else
973: {
974: printf("+++Warning : PostgreSQL support "
975: "not available !\n");
976: }
977:
978: fflush(stdout);
979:
980: drapeau = d_faux;
981: # endif
982: }
983: else
984: {
985: BUG(1, printf("SQL type '%s' not allowed!",
986: (*((struct_connecteur_sql *) (*s_objet).objet))
987: .type));
988: return;
989: }
990:
991: if (drapeau == d_vrai)
992: {
993: if (l_element_precedent == NULL)
994: {
995: (*s_etat_processus).s_connecteurs_sql =
996: (*l_element_courant).suivant;
997: }
998: else if ((*l_element_courant).suivant == NULL)
999: {
1000: (*l_element_precedent).suivant = NULL;
1001: }
1002: else
1003: {
1004: (*l_element_precedent).suivant =
1005: (*l_element_courant).suivant;
1006: }
1007:
1008: liberation(s_etat_processus, (*l_element_courant).donnee);
1009: free(l_element_courant);
1010:
1011: break;
1012: }
1013: }
1014:
1015: l_element_precedent = l_element_courant;
1016: l_element_courant = (*l_element_courant).suivant;
1017: }
1018:
1019: sqlclose(s_objet);
1020: }
1021: else
1022: {
1023: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1024:
1025: liberation(s_etat_processus, s_objet);
1026: return;
1027: }
1028:
1029: liberation(s_etat_processus, s_objet);
1030: return;
1031: }
1032:
1033:
1034: /*
1035: ================================================================================
1036: Fonction 'smphrincr'
1037: ================================================================================
1038: Entrées :
1039: --------------------------------------------------------------------------------
1040: Sorties :
1041: --------------------------------------------------------------------------------
1042: Effets de bord : néant
1043: ================================================================================
1044: */
1045:
1046: void
1047: instruction_smphrincr(struct_processus *s_etat_processus)
1048: {
1049: struct_objet *s_objet_argument;
1050:
1051: (*s_etat_processus).erreur_execution = d_ex;
1052:
1053: if ((*s_etat_processus).affichage_arguments == 'Y')
1054: {
1055: printf("\n SMPHRINCR ");
1056:
1057: if ((*s_etat_processus).langue == 'F')
1058: {
1059: printf("(incrémentation du sémaphore)\n\n");
1060: }
1061: else
1062: {
1063: printf("(semaphore incrementation)\n\n");
1064: }
1065:
1066: printf(" 1: %s\n", d_SPH);
1067: return;
1068: }
1069: else if ((*s_etat_processus).test_instruction == 'Y')
1070: {
1071: (*s_etat_processus).nombre_arguments = -1;
1072: return;
1073: }
1074:
1075: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1076: {
1077: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1078: {
1079: return;
1080: }
1081: }
1082:
1083: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1084: &s_objet_argument) == d_erreur)
1085: {
1086: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1087: return;
1088: }
1089:
1090: if ((*s_objet_argument).type == SPH)
1091: {
1092: if (sem_post((*((struct_semaphore *) (*s_objet_argument).objet))
1093: .semaphore) != 0)
1094: {
1095: (*s_etat_processus).erreur_execution = d_ex_semaphore;
1096:
1097: liberation(s_etat_processus, s_objet_argument);
1098: return;
1099: }
1100:
1101: liberation(s_etat_processus, s_objet_argument);
1102: }
1103: else
1104: {
1105: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1106:
1107: liberation(s_etat_processus, s_objet_argument);
1108: return;
1109: }
1110:
1111: return;
1112: }
1113:
1114:
1115: /*
1116: ================================================================================
1117: Fonction 'smphrdecr'
1118: ================================================================================
1119: Entrées :
1120: --------------------------------------------------------------------------------
1121: Sorties :
1122: --------------------------------------------------------------------------------
1123: Effets de bord : néant
1124: ================================================================================
1125: */
1126:
1127: void
1128: instruction_smphrdecr(struct_processus *s_etat_processus)
1129: {
1130: struct_objet *s_objet_argument;
1131:
1132: unsigned char *tampon;
1133:
1134: (*s_etat_processus).erreur_execution = d_ex;
1135:
1136: if ((*s_etat_processus).affichage_arguments == 'Y')
1137: {
1138: printf("\n SMPHRDECR ");
1139:
1140: if ((*s_etat_processus).langue == 'F')
1141: {
1142: printf("(decrémentation du sémaphore)\n\n");
1143: }
1144: else
1145: {
1146: printf("(semaphore decrementation)\n\n");
1147: }
1148:
1149: printf(" 1: %s\n", d_SPH);
1150: return;
1151: }
1152: else if ((*s_etat_processus).test_instruction == 'Y')
1153: {
1154: (*s_etat_processus).nombre_arguments = -1;
1155: return;
1156: }
1157:
1158: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1159: {
1160: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1161: {
1162: return;
1163: }
1164: }
1165:
1166: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1167: &s_objet_argument) == d_erreur)
1168: {
1169: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1170: return;
1171: }
1172:
1173: if ((*s_objet_argument).type == SPH)
1174: {
1175: if ((*s_etat_processus).profilage == d_vrai)
1176: {
1177: if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
1178: == NULL)
1179: {
1180: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1181: return;
1182: }
1183:
1184: profilage(s_etat_processus, tampon);
1185: free(tampon);
1186:
1187: if ((*s_etat_processus).erreur_systeme != d_es)
1188: {
1189: return;
1190: }
1191: }
1192:
1.7 bertrand 1193: # ifndef SEMAPHORES_NOMMES
1.1 bertrand 1194: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1195: {
1196: (*s_etat_processus).erreur_systeme = d_es_processus;
1197: return;
1198: }
1.7 bertrand 1199: # else
1200: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
1201: {
1202: (*s_etat_processus).erreur_systeme = d_es_processus;
1203: return;
1204: }
1205: # endif
1.1 bertrand 1206:
1207: while(sem_wait((*((struct_semaphore *) (*s_objet_argument).objet))
1208: .semaphore) == -1)
1209: {
1210: if (errno != EINTR)
1211: {
1212: (*s_etat_processus).erreur_execution = d_ex_semaphore;
1213:
1214: if ((*s_etat_processus).profilage == d_vrai)
1215: {
1216: profilage(s_etat_processus, NULL);
1217: }
1218:
1219: liberation(s_etat_processus, s_objet_argument);
1220: return;
1221: }
1222: }
1223:
1.7 bertrand 1224: # ifndef SEMAPHORES_NOMMES
1.1 bertrand 1225: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7 bertrand 1226: # else
1227: while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
1228: # endif
1.1 bertrand 1229: {
1230: if (errno != EINTR)
1231: {
1232: if ((*s_etat_processus).profilage == d_vrai)
1233: {
1234: profilage(s_etat_processus, NULL);
1235: }
1236:
1237: (*s_etat_processus).erreur_systeme = d_es_processus;
1238: return;
1239: }
1240: }
1241:
1242: if ((*s_etat_processus).profilage == d_vrai)
1243: {
1244: profilage(s_etat_processus, NULL);
1245: }
1246:
1247: liberation(s_etat_processus, s_objet_argument);
1248: }
1249: else
1250: {
1251: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1252:
1253: liberation(s_etat_processus, s_objet_argument);
1254: return;
1255: }
1256:
1257: return;
1258: }
1259:
1260:
1261: /*
1262: ================================================================================
1263: Fonction 'smphrtrydecr'
1264: ================================================================================
1265: Entrées :
1266: --------------------------------------------------------------------------------
1267: Sorties :
1268: --------------------------------------------------------------------------------
1269: Effets de bord : néant
1270: ================================================================================
1271: */
1272:
1273: void
1274: instruction_smphrtrydecr(struct_processus *s_etat_processus)
1275: {
1276: struct_objet *s_objet_argument;
1277: struct_objet *s_objet_resultat;
1278:
1279: unsigned char *tampon;
1280:
1281: (*s_etat_processus).erreur_execution = d_ex;
1282:
1283: if ((*s_etat_processus).affichage_arguments == 'Y')
1284: {
1285: printf("\n SMPHRTRYDECR ");
1286:
1287: if ((*s_etat_processus).langue == 'F')
1288: {
1289: printf("(essai de decrémentation du sémaphore)\n\n");
1290: }
1291: else
1292: {
1293: printf("(try to decremente semaphore)\n\n");
1294: }
1295:
1296: printf(" 1: %s\n", d_SPH);
1297: printf("-> 1: %s\n", d_INT);
1298: return;
1299: }
1300: else if ((*s_etat_processus).test_instruction == 'Y')
1301: {
1302: (*s_etat_processus).nombre_arguments = -1;
1303: return;
1304: }
1305:
1306: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1307: {
1308: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1309: {
1310: return;
1311: }
1312: }
1313:
1314: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1315: &s_objet_argument) == d_erreur)
1316: {
1317: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1318: return;
1319: }
1320:
1321: if ((*s_objet_argument).type == SPH)
1322: {
1323: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1324: {
1325: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1326: return;
1327: }
1328:
1329: if ((*s_etat_processus).profilage == d_vrai)
1330: {
1331: if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
1332: == NULL)
1333: {
1334: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1335: return;
1336: }
1337:
1338: profilage(s_etat_processus, tampon);
1339: free(tampon);
1340:
1341: if ((*s_etat_processus).erreur_systeme != d_es)
1342: {
1343: return;
1344: }
1345: }
1346:
1.7 bertrand 1347: # ifndef SEMAPHORES_NOMMES
1.1 bertrand 1348: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1349: {
1350: (*s_etat_processus).erreur_systeme = d_es_processus;
1351: return;
1352: }
1.7 bertrand 1353: # else
1354: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
1355: {
1356: (*s_etat_processus).erreur_systeme = d_es_processus;
1357: return;
1358: }
1359: # endif
1.1 bertrand 1360:
1361: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
1362:
1363: while(sem_trywait((*((struct_semaphore *) (*s_objet_argument).objet))
1364: .semaphore) == -1)
1365: {
1366: switch(errno)
1367: {
1368: case EINTR :
1369: {
1370: break;
1371: }
1372:
1373: case EINVAL :
1374: {
1375: (*s_etat_processus).erreur_execution = d_ex_semaphore;
1376:
1377: if ((*s_etat_processus).profilage == d_vrai)
1378: {
1379: profilage(s_etat_processus, NULL);
1380: }
1381:
1382: liberation(s_etat_processus, s_objet_argument);
1383: return;
1384: }
1385:
1386: case EAGAIN :
1387: {
1388: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1389: break;
1390: }
1391: }
1392:
1393: if ((*((integer8 *) (*s_objet_resultat).objet)) != 0)
1394: {
1395: break;
1396: }
1397: }
1398:
1.7 bertrand 1399: # ifndef SEMAPHORES_NOMMES
1.1 bertrand 1400: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7 bertrand 1401: # else
1402: while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
1403: # endif
1.1 bertrand 1404: {
1405: if (errno != EINTR)
1406: {
1407: if ((*s_etat_processus).profilage == d_vrai)
1408: {
1409: profilage(s_etat_processus, NULL);
1410: }
1411:
1412: (*s_etat_processus).erreur_systeme = d_es_processus;
1413: return;
1414: }
1415: }
1416:
1417: if ((*s_etat_processus).profilage == d_vrai)
1418: {
1419: profilage(s_etat_processus, NULL);
1420: }
1421:
1422: liberation(s_etat_processus, s_objet_argument);
1423: }
1424: else
1425: {
1426: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1427:
1428: liberation(s_etat_processus, s_objet_argument);
1429: return;
1430: }
1431:
1432: return;
1433: }
1434:
1435:
1436: /*
1437: ================================================================================
1438: Fonction 'smphrgetv'
1439: ================================================================================
1440: Entrées :
1441: --------------------------------------------------------------------------------
1442: Sorties :
1443: --------------------------------------------------------------------------------
1444: Effets de bord : néant
1445: ================================================================================
1446: */
1447:
1448: void
1449: instruction_smphrgetv(struct_processus *s_etat_processus)
1450: {
1451: int valeur;
1452:
1453: struct_objet *s_objet_argument;
1454: struct_objet *s_objet_resultat;
1455:
1456: (*s_etat_processus).erreur_execution = d_ex;
1457:
1458: if ((*s_etat_processus).affichage_arguments == 'Y')
1459: {
1460: printf("\n SMPHRGETV ");
1461:
1462: if ((*s_etat_processus).langue == 'F')
1463: {
1464: printf("(valeur du sémaphore)\n\n");
1465: }
1466: else
1467: {
1468: printf("(semaphore value)\n\n");
1469: }
1470:
1471: printf(" 1: %s\n", d_SPH);
1472: return;
1473: }
1474: else if ((*s_etat_processus).test_instruction == 'Y')
1475: {
1476: (*s_etat_processus).nombre_arguments = -1;
1477: return;
1478: }
1479:
1480: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1481: {
1482: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1483: {
1484: return;
1485: }
1486: }
1487:
1488: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1489: &s_objet_argument) == d_erreur)
1490: {
1491: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1492: return;
1493: }
1494:
1495: if ((*s_objet_argument).type == SPH)
1496: {
1497: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1498: {
1499: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1500:
1501: liberation(s_etat_processus, s_objet_argument);
1502: return;
1503: }
1504:
1505: if (sem_getvalue((*((struct_semaphore *) (*s_objet_argument).objet))
1506: .semaphore, &valeur) != 0)
1507: {
1508: (*s_etat_processus).erreur_execution = d_ex_semaphore;
1509:
1510: liberation(s_etat_processus, s_objet_argument);
1511: return;
1512: }
1513:
1514: (*((integer8 *) (*s_objet_resultat).objet)) = valeur;
1515:
1516: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1517: s_objet_resultat) == d_erreur)
1518: {
1519: return;
1520: }
1521:
1522: liberation(s_etat_processus, s_objet_argument);
1523: }
1524: else
1525: {
1526: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1527:
1528: liberation(s_etat_processus, s_objet_argument);
1529: return;
1530: }
1531:
1532: return;
1533: }
1534:
1535:
1536: /*
1537: ================================================================================
1538: Fonction 'svl'
1539: ================================================================================
1540: Entrées :
1541: --------------------------------------------------------------------------------
1542: Sorties :
1543: --------------------------------------------------------------------------------
1544: Effets de bord : néant
1545: ================================================================================
1546: */
1547:
1548: void
1549: instruction_svl(struct_processus *s_etat_processus)
1550: {
1551: struct_objet *s_objet_argument;
1552: struct_objet *s_objet_resultat;
1553:
1554: (*s_etat_processus).erreur_execution = d_ex;
1555:
1556: if ((*s_etat_processus).affichage_arguments == 'Y')
1557: {
1558: printf("\n SVL ");
1559:
1560: if ((*s_etat_processus).langue == 'F')
1561: {
1562: printf("(valeurs singulières)\n\n");
1563: }
1564: else
1565: {
1566: printf("(singular values)\n\n");
1567: }
1568:
1569: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1570: printf("-> 1: %s\n", d_VRL);
1571: return;
1572: }
1573: else if ((*s_etat_processus).test_instruction == 'Y')
1574: {
1575: (*s_etat_processus).nombre_arguments = -1;
1576: return;
1577: }
1578:
1579: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1580: {
1581: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1582: {
1583: return;
1584: }
1585: }
1586:
1587: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1588: &s_objet_argument) == d_erreur)
1589: {
1590: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1591: return;
1592: }
1593:
1594: if (((*s_objet_argument).type == MIN) ||
1595: ((*s_objet_argument).type == MRL) ||
1596: ((*s_objet_argument).type == MCX))
1597: {
1598: if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL)
1599: {
1600: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1601: return;
1602: }
1603:
1604: valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
1605: NULL, (*s_objet_resultat).objet, NULL);
1606:
1607: if ((*s_etat_processus).erreur_systeme != d_es)
1608: {
1609: return;
1610: }
1611:
1612: if (((*s_etat_processus).erreur_execution != d_ex) ||
1613: ((*s_etat_processus).exception != d_ep))
1614: {
1615: liberation(s_etat_processus, s_objet_resultat);
1616: liberation(s_etat_processus, s_objet_argument);
1617: return;
1618: }
1619:
1620: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1621: s_objet_resultat) == d_erreur)
1622: {
1623: return;
1624: }
1625: }
1626: else
1627: {
1628: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1629:
1630: liberation(s_etat_processus, s_objet_argument);
1631: return;
1632: }
1633:
1634: liberation(s_etat_processus, s_objet_argument);
1635:
1636: return;
1637: }
1638:
1639:
1640: /*
1641: ================================================================================
1642: Fonction 'svd'
1643: ================================================================================
1644: Entrées :
1645: --------------------------------------------------------------------------------
1646: Sorties :
1647: --------------------------------------------------------------------------------
1648: Effets de bord : néant
1649: ================================================================================
1650: */
1651:
1652: void
1653: instruction_svd(struct_processus *s_etat_processus)
1654: {
1655: struct_objet *s_objet_argument;
1656: struct_objet *s_objet_resultat_1;
1657: struct_objet *s_objet_resultat_2;
1658: struct_objet *s_objet_resultat_3;
1659:
1660: struct_vecteur s_vecteur;
1661:
1662: unsigned long i;
1663: unsigned long j;
1664:
1665: (*s_etat_processus).erreur_execution = d_ex;
1666:
1667: if ((*s_etat_processus).affichage_arguments == 'Y')
1668: {
1669: printf("\n SVD ");
1670:
1671: if ((*s_etat_processus).langue == 'F')
1672: {
1673: printf("(décomposition en valeurs singulières)\n\n");
1674: }
1675: else
1676: {
1677: printf("(singular value decomposition)\n\n");
1678: }
1679:
1680: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1681: printf("-> 3: %s, %s\n", d_MRL, d_MCX);
1682: printf(" 2: %s, %s\n", d_MRL, d_MCX);
1683: printf(" 1: %s\n", d_VRL);
1684: return;
1685: }
1686: else if ((*s_etat_processus).test_instruction == 'Y')
1687: {
1688: (*s_etat_processus).nombre_arguments = -1;
1689: return;
1690: }
1691:
1692: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1693: {
1694: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1695: {
1696: return;
1697: }
1698: }
1699:
1700: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1701: &s_objet_argument) == d_erreur)
1702: {
1703: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1704: return;
1705: }
1706:
1707: if (((*s_objet_argument).type == MIN) ||
1708: ((*s_objet_argument).type == MRL))
1709: {
1710: if ((s_objet_resultat_1 = allocation(s_etat_processus, MRL)) == NULL)
1711: {
1712: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1713: return;
1714: }
1715:
1716: if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
1717: {
1718: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1719: return;
1720: }
1721:
1722: if ((s_objet_resultat_3 = allocation(s_etat_processus, MRL)) == NULL)
1723: {
1724: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1725: return;
1726: }
1727:
1728: valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
1729: (*s_objet_resultat_3).objet, &s_vecteur,
1730: (*s_objet_resultat_1).objet);
1731:
1732: if ((*s_etat_processus).erreur_systeme != d_es)
1733: {
1734: return;
1735: }
1736:
1737: if (((*s_etat_processus).erreur_execution != d_ex) ||
1738: ((*s_etat_processus).exception != d_ep))
1739: {
1740: liberation(s_etat_processus, s_objet_resultat_1);
1741: liberation(s_etat_processus, s_objet_resultat_2);
1742: liberation(s_etat_processus, s_objet_resultat_3);
1743: liberation(s_etat_processus, s_objet_argument);
1744: return;
1745: }
1746:
1747: (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
1748: (*((struct_matrice *) (*s_objet_argument).objet))
1749: .nombre_colonnes;
1750: (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
1751: (*((struct_matrice *) (*s_objet_argument).objet))
1752: .nombre_lignes;
1753:
1754: if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
1755: malloc((*((struct_matrice *) (*s_objet_resultat_2).objet))
1756: .nombre_lignes * sizeof(real8 *))) == NULL)
1757: {
1758: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1759: return;
1760: }
1761:
1762: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
1763: .nombre_lignes; i++)
1764: {
1765: if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1766: .objet)).tableau)[i] = malloc((*((struct_matrice *)
1767: (*s_objet_resultat_2).objet)).nombre_colonnes *
1768: sizeof(real8 *))) == NULL)
1769: {
1770: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1771: return;
1772: }
1773:
1774: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
1775: .nombre_colonnes; j++)
1776: {
1777: ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1778: .objet)).tableau)[i][j] = 0;
1779: }
1780: }
1781:
1782: for(i = 0; i < s_vecteur.taille; i++)
1783: {
1784: ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
1785: .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
1786: }
1787:
1788: free(s_vecteur.tableau);
1789:
1790: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1791: s_objet_resultat_3) == d_erreur)
1792: {
1793: return;
1794: }
1795:
1796: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1797: s_objet_resultat_2) == d_erreur)
1798: {
1799: return;
1800: }
1801:
1802: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1803: s_objet_resultat_1) == d_erreur)
1804: {
1805: return;
1806: }
1807: }
1808: else if ((*s_objet_argument).type == MCX)
1809: {
1810: if ((s_objet_resultat_1 = allocation(s_etat_processus, MCX)) == NULL)
1811: {
1812: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1813: return;
1814: }
1815:
1816: if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
1817: {
1818: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1819: return;
1820: }
1821:
1822: if ((s_objet_resultat_3 = allocation(s_etat_processus, MCX)) == NULL)
1823: {
1824: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1825: return;
1826: }
1827:
1828: valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
1829: (*s_objet_resultat_3).objet, &s_vecteur,
1830: (*s_objet_resultat_1).objet);
1831:
1832: if ((*s_etat_processus).erreur_systeme != d_es)
1833: {
1834: return;
1835: }
1836:
1837: if (((*s_etat_processus).erreur_execution != d_ex) ||
1838: ((*s_etat_processus).exception != d_ep))
1839: {
1840: liberation(s_etat_processus, s_objet_resultat_1);
1841: liberation(s_etat_processus, s_objet_resultat_2);
1842: liberation(s_etat_processus, s_objet_resultat_3);
1843: liberation(s_etat_processus, s_objet_argument);
1844: return;
1845: }
1846:
1847: (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
1848: (*((struct_matrice *) (*s_objet_argument).objet))
1849: .nombre_colonnes;
1850: (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
1851: (*((struct_matrice *) (*s_objet_argument).objet))
1852: .nombre_lignes;
1853:
1854: if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
1855: malloc((*((struct_matrice *) (*s_objet_resultat_2).objet))
1856: .nombre_lignes * sizeof(real8 *))) == NULL)
1857: {
1858: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1859: return;
1860: }
1861:
1862: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
1863: .nombre_lignes; i++)
1864: {
1865: if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1866: .objet)).tableau)[i] = malloc((*((struct_matrice *)
1867: (*s_objet_resultat_2).objet)).nombre_colonnes *
1868: sizeof(real8 *))) == NULL)
1869: {
1870: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1871: return;
1872: }
1873:
1874: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
1875: .nombre_colonnes; j++)
1876: {
1877: ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1878: .objet)).tableau)[i][j] = 0;
1879: }
1880: }
1881:
1882: for(i = 0; i < s_vecteur.taille; i++)
1883: {
1884: ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
1885: .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
1886: }
1887:
1888: free(s_vecteur.tableau);
1889:
1890: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1891: s_objet_resultat_3) == d_erreur)
1892: {
1893: return;
1894: }
1895:
1896: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1897: s_objet_resultat_2) == d_erreur)
1898: {
1899: return;
1900: }
1901:
1902: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1903: s_objet_resultat_1) == d_erreur)
1904: {
1905: return;
1906: }
1907: }
1908: else
1909: {
1910: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1911:
1912: liberation(s_etat_processus, s_objet_argument);
1913: return;
1914: }
1915:
1916: liberation(s_etat_processus, s_objet_argument);
1917: return;
1918: }
1919:
1920:
1921: /*
1922: ================================================================================
1923: Fonction 'swapcntxt'
1924: ================================================================================
1925: Entrées :
1926: --------------------------------------------------------------------------------
1927: Sorties :
1928: --------------------------------------------------------------------------------
1929: Effets de bord : néant
1930: ================================================================================
1931: */
1932:
1933: void
1934: instruction_swapcntxt(struct_processus *s_etat_processus)
1935: {
1936: integer8 i;
1937: integer8 registre_taille;
1938:
1939: struct_liste_chainee *l_element_courant;
1940: struct_liste_chainee *l_element_courant_taille;
1941: struct_liste_chainee *registre;
1942:
1943: struct_objet *s_objet_argument;
1944:
1945: (*s_etat_processus).erreur_execution = d_ex;
1946:
1947: if ((*s_etat_processus).affichage_arguments == 'Y')
1948: {
1949: printf("\n SWAPCNTXT ");
1950:
1951: if ((*s_etat_processus).langue == 'F')
1952: {
1953: printf("(échange de contextes)\n\n");
1954: }
1955: else
1956: {
1957: printf("(swap contexts)\n\n");
1958: }
1959:
1960: printf(" 1: %s\n", d_INT);
1961: return;
1962: }
1963: else if ((*s_etat_processus).test_instruction == 'Y')
1964: {
1965: (*s_etat_processus).nombre_arguments = -1;
1966: return;
1967: }
1968:
1969: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1970: {
1971: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1972: {
1973: return;
1974: }
1975: }
1976:
1977: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1978: &s_objet_argument) == d_erreur)
1979: {
1980: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1981: return;
1982: }
1983:
1984: if ((*s_objet_argument).type == INT)
1985: {
1986: l_element_courant = (*s_etat_processus).l_base_pile_contextes;
1987: l_element_courant_taille = (*s_etat_processus)
1988: .l_base_pile_taille_contextes;
1989:
1990: i = (*((integer8 *) (*s_objet_argument).objet));
1991:
1992: while((l_element_courant != NULL) && (l_element_courant_taille != NULL))
1993: {
1994: i--;
1995:
1996: if (i == 0)
1997: {
1998: break;
1999: }
2000:
2001: l_element_courant = (*l_element_courant).suivant;
2002: l_element_courant_taille = (*l_element_courant_taille).suivant;
2003: }
2004:
2005: if ((l_element_courant == NULL) || (l_element_courant_taille == NULL))
2006: {
2007: liberation(s_etat_processus, s_objet_argument);
2008:
2009: (*s_etat_processus).erreur_execution = d_ex_contexte;
2010: return;
2011: }
2012:
2013: if ((*(*l_element_courant).donnee).type != LST)
2014: {
2015: (*s_etat_processus).erreur_systeme = d_es_contexte;
2016: return;
2017: }
2018:
2019: if ((*(*l_element_courant_taille).donnee).type != INT)
2020: {
2021: (*s_etat_processus).erreur_systeme = d_es_contexte;
2022: return;
2023: }
2024:
2025: registre = (*s_etat_processus).l_base_pile;
2026: registre_taille = (*s_etat_processus).hauteur_pile_operationnelle;
2027:
2028: (*s_etat_processus).l_base_pile = (*(*l_element_courant).donnee).objet;
2029: (*s_etat_processus).hauteur_pile_operationnelle =
2030: (*((integer8 *) (*(*l_element_courant_taille).donnee).objet));
2031:
2032: (*(*l_element_courant).donnee).objet = registre;
2033: (*((integer8 *) (*(*l_element_courant_taille).donnee).objet)) =
2034: registre_taille;
2035: }
2036: else
2037: {
2038: liberation(s_etat_processus, s_objet_argument);
2039:
2040: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2041: return;
2042: }
2043:
2044: liberation(s_etat_processus, s_objet_argument);
2045: }
2046:
2047: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>