10 #include <sys/types.h>
18 #define AVTWIG_AVOID_CONFLICT
19 #define API_USE_REAL_TYPES
23 extern char *ctime_r(const time_t *clock
, char *buf
, int buflen
);
26 /*----------------------------------------------------------------------------*/
28 /* function DriveNetlist (API purpose) */
30 /*----------------------------------------------------------------------------*/
32 //_____________________________________________________
33 // Interface for qsort
34 //_____________________________________________________
36 static int vcomp (const void *p1
, const void *p2
)
43 if (index1
> index2
) return 1;
44 if (index1
< index2
) return -1;
48 /*----------------------------------------------------------------------------*/
50 void mbk_Sort (int *index_array
, void **value_array
, int nbelem
)
53 long *sort_array
= (long*)malloc (nbelem
* 2 * sizeof (long));
55 for (i
= 0; i
< nbelem
; i
++) {
56 sort_array
[2 * i
] = (long)index_array
[i
];
57 sort_array
[2 * i
+ 1] = (long)value_array
[i
];
60 qsort (sort_array
, nbelem
, sizeof (long) * 2, vcomp
);
62 for (i
= 0; i
< nbelem
; i
++) {
63 index_array
[i
] = (int)sort_array
[2 * i
];
64 value_array
[i
] = (void*)sort_array
[2 * i
+ 1];
70 /*----------------------------------------------------------------------------*/
72 void mbk_FreeList(chain_list
*lst
)
77 /*----------------------------------------------------------------------------*/
79 int mbk_EndofList(chain_list
*lst
)
84 /*----------------------------------------------------------------------------*/
86 chain_list
*mbk_AddListItem (chain_list
*lst
, void *item
)
88 return addchain ((chain_list
*)lst
, item
);
90 /*----------------------------------------------------------------------------*/
92 chain_list
*mbk_AppendList(chain_list
*lst1
, chain_list
*lst2
)
94 return append (lst1
, lst2
);
97 /*----------------------------------------------------------------------------*/
99 void *mbk_GetListItem(chain_list
*lst
)
104 /*----------------------------------------------------------------------------*/
106 chain_list
*mbk_GetListNext(chain_list
*lst
)
111 /*----------------------------------------------------------------------------*/
115 /*----------------------------------------------------------------------------*/
117 ht
*mbk_NewHashTable (int size
)
122 /*----------------------------------------------------------------------------*/
124 long mbk_AddHashItem (ht
*htable
, void *key
, long value
)
126 return addhtitem ((ht
*)htable
, key
, (long)value
);
129 void mbk_AddStringHashItem (ht
*htable
, char *key
, char *value
)
131 addhtitem ((ht
*)htable
, sensitive_namealloc(key
), (long)strdup(value
));
134 /*----------------------------------------------------------------------------*/
136 long mbk_DelHashItem (ht
*htable
, void *key
)
138 return delhtitem ((ht
*)htable
, key
);
141 /*----------------------------------------------------------------------------*/
143 long mbk_GetHashItem (ht
*htable
, void *key
)
145 return gethtitem (htable
, key
);
148 char *mbk_GetStringHashItem (ht
*htable
, char *key
)
151 res
=gethtitem (htable
, sensitive_namealloc(key
));
152 if (res
!=EMPTYHT
) return (char *)res
;
156 /*----------------------------------------------------------------------------*/
158 void mbk_FreeHashTable (ht
*htable
)
162 void mbk_FreeStringHashTable (ht
*htable
)
165 cl
=GetAllHTElems(htable
);
173 chain_list
*mbk_GetStringHashTableKeys (ht
*htable
)
175 return GetAllHTKeys(htable
);
178 /*----------------------------------------------------------------------------*/
180 int mbk_IsEmptyHashItem (long value
)
182 return value
== EMPTYHT
;
185 /*----------------------------------------------------------------------------*/
187 lofig_list
*mbk_GetNetlist (char *figname
)
195 return getlofig (figname
, 'A');
198 FILE *myfopen(char *name
, const char *mode
)
201 if ((f
=mbksysfopen(name
,(char*)mode
,0))==NULL
)
203 if (strchr(mode
,'r')!=NULL
)
204 avt_errmsg(AVT_ERRMSG
, "045", AVT_ERROR
, name
);
206 avt_errmsg(AVT_ERRMSG
, "046", AVT_ERROR
, name
);
211 int myfputs (const char *s
, FILE *stream
)
214 return fputs (s
, stream
);
218 int myfclose(FILE *f
)
225 void myfflush(FILE *f
)
231 /*----------------------------------------------------------------------------*/
233 int decodejob( char *numrun
, int *jobs
, int *parajobs
)
241 n
= strtol( numrun
, &pt
, 10 );
249 n
= strtol( pt
+1, &pt
, 10 );
256 if( *parajobs
<= 0 || *jobs
<= 0 ) {
257 avt_errmsg(AVT_ERRMSG
, "050", AVT_ERROR
, numrun
);
264 #define STAT_EXEC_FREE 1
265 #define STAT_EXEC_WAIT 2
266 #define STAT_EXEC_RUN 3
277 void runjob( char *script
, char **argv
)
283 perror( "vfork() " );
284 avt_errmsg(AVT_ERRMSG
, "056", AVT_FATAL
);
288 mbksetautoackchld( pid
);
291 execvp( script
, argv
);
292 perror( "execvp() " );
293 avt_errmsg(AVT_ERRMSG
, "056", AVT_FATAL
);
298 FILE* openstatdatafile( char *resfile
, int incremental
)
309 return mbkfopen( resfile
, NULL
, "al" );
310 else if (incremental
==-1)
311 return mbkfopen( resfile
, NULL
, "wl" );
313 file
= mbkfopen( resfile
, NULL
, "rl" );
319 n
= strlen( resfile
);
320 name
= alloca( sizeof(char)*(n
+1) );
321 ext
= alloca( sizeof(char)*(n
+1) );
322 testfile
= alloca( sizeof(char)*(n
+10) );
327 while( ( point
= strchr( point
, '.' ) ) ) {
333 strncpy( name
, resfile
, lastpoint
-resfile
);
334 name
[lastpoint
-resfile
]='\0';
335 strcpy( ext
, lastpoint
+1 );
338 strcpy( name
, resfile
);
349 sprintf( testfile
, "%s_%03d.%s", name
, n
, ext
);
351 sprintf( testfile
, "%s_%03d", name
, n
);
353 file
= mbkfopen( testfile
, NULL
, "rl" );
358 file
= mbkfopen( testfile
, NULL
, "wl" );
359 avt_errmsg( AVT_ERRMSG
, "057", AVT_WARNING
, resfile
, testfile
);
362 file
= mbkfopen( resfile
, NULL
, "wl" );
368 static void filltime(char *buf
)
376 ctime_r(&clock
,buf
,52);
381 buf
[strlen(buf
)-1] = '\0';
385 int handle_slave_data(FILE *file
, mbk_comdata
*comdata
, execslot
*es
, chain_list
**mutex
, char *resdir
)
387 char *res
=NULL
, *data
=NULL
;
403 for (i
=0; i
<sizeof(cmd
)/sizeof(*cmd
); i
++)
405 if (strncmp(es
->buffer
,cmd
[i
], strlen(cmd
[i
]))==0)
407 data
=&es
->buffer
[strlen(cmd
[i
])];
417 avt_log(-1, 0, " Job %d: %s\n",es
->id
, data
);
423 case 2: // ask:getsetflag:
424 data
=sensitive_namealloc(data
);
425 if (getchain(*mutex
, data
)==NULL
)
426 *mutex
=addchain(*mutex
, data
), ok
=1;
427 res
=mbkstrdup(ok
?"ok":"ko");
429 case 3: // ask:unsetflag:
430 data
=sensitive_namealloc(data
);
431 if (getchain(*mutex
, data
)!=NULL
)
432 *mutex
=delchaindata(*mutex
, data
), ok
=1;
433 res
=mbkstrdup(ok
?"ok":"ko");
435 case 4: // ask:createfile:
436 es
->myfile
=mbkfopen(data
, NULL
, "w");
437 res
=mbkstrdup(es
->myfile
!=NULL
?"ok":"ko");
439 case 5: // ask:closefile:
440 if (es
->myfile
!=NULL
)
441 ok
=(fclose(es
->myfile
)==0);
444 res
=mbkstrdup(ok
?"ok":"ko");
446 case 6: // ask:writefile:
447 // ok=(fputs(data, es->myfile)>=0);
448 lg
=es
->size
-(data
-es
->buffer
)-1; // -1 pour le 0 final
449 // printf("%d %d %d %d\n",strlen(data), lg, es->size, data-es->buffer);
450 if (es
->myfile
!=NULL
)
451 ok
=(fwrite(data
, sizeof(char), lg
, es
->myfile
)==lg
);
454 res
=mbkstrdup(ok
?"ok":"ko");
456 case 7: // ask:writefile32:
457 lg
=es
->size
-(data
-es
->buffer
);
458 // printf("%d %d %d %d\n",strlen(data), lg, es->size, data-es->buffer);
459 if ((lg
% sizeof(int))!=0)
460 avt_errmsg( AVT_ERRMSG
, "061", AVT_FATAL
);
462 if (es
->myfile
!=NULL
)
463 ok
=(fwrite(data
, sizeof(int), lg
, es
->myfile
)==lg
);
466 res
=mbkstrdup(ok
?"ok":"ko");
468 case 8: // ask:resdir
475 avt_errmsg( AVT_ERRMSG
, "059", AVT_FATAL
, data
, es
->id
);
477 // printf("%s\n",es->buffer);
480 mbk_commputdata( comdata
, es
->id
, res
, strlen(res
)+1);
486 fprintf( file
, "-- begin %d --\n", es
->id
);
487 fprintf( file
, "%s\n", es
->buffer
);
488 fprintf( file
, "-- end %d --\n", es
->id
);
494 void runStatHiTas_sub( char *numrun
, char *script
, char *tool
, char *resfile
, int incremental
, char *resdir
)
508 char connection
[1024] ;
509 mbk_comdata
*comdata
;
512 chain_list
*mutex
=NULL
;
514 if( ! decodejob( numrun
, &jobs
, ¶jobs
) )
517 file
= openstatdatafile( resfile
, incremental
);
519 // printf( "running %d jobs, %d simultaneous jobs\n", jobs, parajobs );
520 avt_log(-1, 0, "Running %d jobs, %d simultaneous jobs\n", jobs
, parajobs
);
523 if (resdir
!=NULL
&& strcmp(resdir
,"NULL")!=0)
526 res
=mkdir(resdir
, 0777);
527 if (res
!=0 && errno
!=EEXIST
)
528 avt_errmsg( AVT_ERRMSG
, "062", AVT_FATAL
, resdir
);
531 comdata
= mbk_activatecommaster( parajobs
);
535 execs
= alloca( sizeof( execslot
) * parajobs
);
536 for( i
=0 ; i
<parajobs
; i
++ ) {
537 execs
[i
].state
= STAT_EXEC_FREE
;
540 gethostname( hostname
, 256 );
546 argv
[4] = connection
;
552 while( done
< jobs
) {
554 for( i
=0 ; i
< parajobs
; i
++ ) {
556 if( launch
< jobs
) {
557 if( execs
[i
].state
== STAT_EXEC_FREE
) {
560 execs
[i
].id
= launch
;
561 execs
[i
].state
= STAT_EXEC_WAIT
;
562 sprintf( bufid
, "%d", launch
);
563 sprintf( bufsubid
, "%d", i
+1 );
564 sprintf( connection
, "%s:%d:%d", hostname
, comdata
->port
, launch
);
566 // printf( "starting job %d : %d\n", launch, i+1 );
567 avt_log(-1, 0, "Starting job %d : %d\n", launch
, i
+1 );
568 runjob( script
, argv
);
575 id
= mbk_comwaiteventfromnet( comdata
);
579 avt_log( LOGMBKCOM
, 1, "an event is available for %d\n", id
);
581 for( i
=0 ; i
<parajobs
; i
++ ) {
582 if( execs
[i
].state
== STAT_EXEC_RUN
||
583 execs
[i
].state
== STAT_EXEC_WAIT
) {
584 if( execs
[i
].id
== id
)
590 avt_errmsg( AVT_ERRMSG
, "051", AVT_FATAL
, id
);
592 type
= mbk_commgetdata( comdata
, execs
[i
].id
, &(execs
[i
].buffer
), &execs
[i
].size
);
594 if( type
== MBK_COM_BEGIN
) {
595 if( execs
[i
].state
!= STAT_EXEC_WAIT
)
596 avt_errmsg( AVT_ERRMSG
, "052", AVT_FATAL
, execs
[i
].id
);
597 execs
[i
].state
= STAT_EXEC_RUN
;
599 avt_log(-1, 0, " Job %d started [%s]\n", execs
[i
].id
, buf
) ;
602 if( type
== MBK_COM_DATA
) {
603 avt_log( LOGMBKCOM
, 1, "data received from job %d\n", execs
[i
].id
);
604 if( execs
[i
].state
!= STAT_EXEC_RUN
)
605 avt_errmsg( AVT_ERRMSG
, "053", AVT_FATAL
, execs
[i
].id
);
607 handle_slave_data(file
, comdata
, &execs
[i
], &mutex
, resdir
);
609 mbkfree( execs
[i
].buffer
);
610 execs
[i
].buffer
= NULL
;
613 if( type
== MBK_COM_END
) {
614 if( execs
[i
].state
!= STAT_EXEC_RUN
)
615 avt_errmsg( AVT_ERRMSG
, "054", AVT_FATAL
, execs
[i
].id
);
616 // printf( " job %d completed\n", execs[i].id );
618 avt_log(-1, 0, " Job %d completed [%s]\n", execs
[i
].id
, buf
) ;
619 execs
[i
].state
= STAT_EXEC_FREE
;
623 if( type
== MBK_COM_ABORT
) {
625 if( V_BOOL_TAB
[ __TAS_STAT_HITAS_BREAK_ON_ERROR
].VALUE
)
626 avt_errmsg( AVT_ERRMSG
, "055", AVT_FATAL
, execs
[i
].id
, buf
);
628 avt_errmsg( AVT_ERRMSG
, "055", AVT_WARNING
, execs
[i
].id
, buf
);
629 execs
[i
].state
= STAT_EXEC_FREE
;
637 mbk_terminatecommaster( comdata
);
640 void avt_McInfo( char *msg
)
645 sprintf(buf
,"info:%s", msg
);
646 mbk_sendmsg( MBK_COM_DATA
, buf
, strlen( buf
)+1 );
650 void avt_McPostData( char *msg
)
654 mbk_sendmsg( MBK_COM_DATA
, msg
, strlen( msg
)+1 );
655 mbk_sendmsg( MBK_COM_END
, NULL
, 0 );
659 char *avt_McAsk( char *msg
)
663 char buf
[2048], *res
;
664 sprintf(buf
,"ask:%s", msg
);
665 res
=mbk_commtalk(buf
, -1);
677 quicklist
*mbk_QuickListCreate()
679 quicklist
*ql
=mbkalloc(sizeof(quicklist
));
680 ql
->head
=ql
->end
=NULL
;
685 void mbk_QuickListAppend(quicklist
*ql
, char *item
)
688 ql
->end
=ql
->head
=addchain(ql
->head
, strdup(item
));
691 ql
->end
->NEXT
=addchain(NULL
, strdup(item
));
692 ql
->end
=ql
->end
->NEXT
;
697 StringList
*mbk_QuickListToTCL(quicklist
*ql
)
699 chain_list
*temp
=ql
->head
;
704 int mbk_QuickListLength(quicklist
*ql
)
709 void mbk_QuickListAppendDouble(quicklist
*ql
, double value
)
713 new=ql
->end
=ql
->head
=addchain(ql
->head
, NULL
);
716 new=ql
->end
->NEXT
=addchain(NULL
, NULL
);
717 ql
->end
=ql
->end
->NEXT
;
719 *(float *)&new->DATA
=value
;
723 static int cmpfloat(const void *a0
, const void *b0
)
725 float *a
=(float *)a0
, *b
=(float *)b0
;
726 if (*a
<*b
) return -1;
731 chain_list
*mbk_QuickListComputeMeanVarMedian(quicklist
*ql
)
733 double mean
=0, var
=0, median
=0, val
;
740 for (cl
=ql
->head
; cl
!=NULL
; cl
=cl
->NEXT
)
741 mean
=mean
+*(float *)&cl
->DATA
;
743 for (cl
=ql
->head
; cl
!=NULL
; cl
=cl
->NEXT
)
745 val
=*(float *)&cl
->DATA
;
746 var
=var
+(val
-mean
)*(val
-mean
);
749 tab
=(float *)mbkalloc(sizeof(float)*ql
->nb
);
750 for (cl
=ql
->head
, i
=0; cl
!=NULL
; cl
=cl
->NEXT
, i
++)
751 tab
[i
]=*(float *)&cl
->DATA
;
753 qsort(tab
, ql
->nb
, sizeof(float), cmpfloat
);
755 median
=tab
[ql
->nb
/2];
758 cl
=addchain(NULL
, NULL
);
759 *(float *)&cl
->DATA
=median
;
760 cl
=addchain(cl
, NULL
);
761 *(float *)&cl
->DATA
=var
;
762 cl
=addchain(cl
, NULL
);
763 *(float *)&cl
->DATA
=mean
;
767 void mbk_QuickListDoubleFree(quicklist
*ql
)