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