95 BANK_HEADER *
psbh, *pdbh;
96 char *psdata, *pddata;
100 *size = ((EVENT_HEADER *) pdest)->data_size;
103 pddata = pdest + *size +
sizeof(EVENT_HEADER);
109 psbh = (BANK_HEADER *) (((EVENT_HEADER *)psrce)+1);
110 bk_swap(psbh,
FALSE);
113 psbh = (BANK_HEADER *)(((EVENT_HEADER *)psrce)+1);
114 psdata = (
char *) (psbh+1);
117 bksize = psbh->data_size;
120 memcpy(pddata, psdata, bksize);
123 ((EVENT_HEADER *) pdest)->data_size += bksize;
126 pdbh = (BANK_HEADER *)(((EVENT_HEADER *)pdest)+1);
127 pdbh->data_size += bksize;
129 *size = ((EVENT_HEADER *) pdest)->data_size;
134 *size = ((EVENT_HEADER *) psrce)->data_size;
137 psbh = (BANK_HEADER *) (((EVENT_HEADER *)psrce)+1);
138 bk_swap(psbh,
FALSE);
141 memcpy (pddata, psbh, *size);
144 ((EVENT_HEADER *) pdest)->data_size = *
size;
156 char *psdata, *pddata;
157 DWORD *pslrl, *pdlrl;
158 INT i4frgsize, i1frgsize,
status;
161 *size = ((EVENT_HEADER *) pdest)->data_size;
165 pddata = pdest + *size +
sizeof(EVENT_HEADER);
172 pslrl = (
DWORD *)(((EVENT_HEADER *)psrce)+1);
178 psdata = (
char *) (pslrl+1);
181 i4frgsize = (*pslrl);
182 i1frgsize = 4 * i4frgsize;
185 memcpy(pddata, psdata, i1frgsize);
188 ((EVENT_HEADER *) pdest)->data_size += i1frgsize;
191 pdlrl = (
DWORD *)(((EVENT_HEADER *)pdest)+1);
195 *size = ((EVENT_HEADER *) pdest)->data_size;
206 pslrl = (
DWORD *)(((EVENT_HEADER *)psrce)+1);
212 *size = ((EVENT_HEADER *) psrce)->data_size;
215 memcpy (pddata, (
char *) pslrl, *size);
218 ((EVENT_HEADER *) pdest)->data_size += *
size;
231 printf(
"EBuilder-Starting New Run: %d\n", rn);
240 for (fragn=0 ; ; fragn++)
242 if (ebch[fragn].name[0] == 0)
249 db_get_value(
hDB, 0,
"/Ebuilder/Settings/User Field"
255 cm_msg(MERROR,
"eb_prestart"
256 ,
"run start aborted due to eb_begin_of_run (%d)", status);
281 printf(
"\nEBuilder-Stopping Run: %d detected\n", rn);
295 for (i=0; i<nfrag; i++) {
296 if (ebch[i].pfragment) {
297 free(ebch[i].pfragment);
312 printf(
"Hand flushing system buffer... \n");
314 if (ebch[i].set.emask)
do {
316 status = bm_receive_event(ebch[i].hBuf, ebch[i].pfragment, &size, ASYNC);
319 ,
"booking:Hand flush bm_receive_event[%d] hndle:%d stat:%d Last Ser:%d"
320 , i, ebch[i].hBuf, status
321 , ((EVENT_HEADER *) ebch[i].pfragment)->serial_number);
324 }
while (status == BM_SUCCESS);
328 status = bm_empty_buffers();
329 if (status != BM_SUCCESS)
330 cm_msg(MERROR,
"source_booking",
"bm_empty_buffers failure [%d]",status);
340 INT j,
i,
status, status1, status2;
345 for (i=0; i<nfrag ; i++)
348 if (ebch[i].set.emask)
351 status1 = bm_open_buffer(ebch[i].set.
buffer
352 , EVENT_BUFFER_SIZE , &(ebch[i].
hBuf));
355 printf(
"bm_open_buffer frag:%d handle:%d stat:%d\n",
356 i, ebch[i].hBuf, status1);
358 status2 = bm_request_event(ebch[i].hBuf
361 , GET_ALL, &ebch[i].
req_id, NULL);
363 printf(
"bm_request_event frag:%d req_id:%d stat:%d\n",
364 i, ebch[i].req_id, status1);
365 if (((status1 != BM_SUCCESS) && (status1 != BM_CREATED)) ||
366 ((status2 != BM_SUCCESS) && (status2 != BM_CREATED)))
368 cm_msg(MERROR,
"source_booking"
369 ,
"Open buffer/event request failure [%d %d %d]",
370 i, status1, status2 );
375 if (ebch[i].pfragment)
376 free(ebch[i].pfragment);
379 printf(
"malloc pevent frag:%d pevent:%p\n", i, ebch[i].pfragment);
380 if (ebch[i].pfragment == NULL)
383 cm_msg(MERROR,
"source_booking",
"Can't allocate space for buffer");
390 status = bm_empty_buffers();
391 if (status != BM_SUCCESS) {
392 cm_msg(MERROR,
"source_booking",
"bm_empty_buffers failure [%d]",status);
398 printf(
"bm_empty_buffers stat:%d\n",status);
402 if (ebch[j].name[0] == 0)
405 printf(
"%d)%s",j , ebch[j].name);
407 printf(
" msk#:%4.4x", ebch[j].set.emask);
408 printf(
" ser#:%d", ebch[j].serial);
409 printf(
" hbuf:%2d", ebch[j].hBuf);
410 printf(
" rqid:%2d", ebch[j].req_id);
411 printf(
" opst:%d", status1);
412 printf(
" rqst:%d", status2);
428 if (ebch[0].pfragment == NULL)
433 for (i=nfrag-1; i>=0 ; i--)
437 if (ebch[i].set.emask)
440 status = bm_delete_request(ebch[i].req_id);
442 printf(
"unbook: bm_delete_req[%d] req_id:%d stat:%d\n", i, ebch[i].req_id, status);
445 status = bm_close_buffer(ebch[i].hBuf);
447 printf(
"unbook: bm_close_buffer[%d] hndle:%d stat:%d\n", i, ebch[i].hBuf, status);
448 if (status != BM_SUCCESS)
450 cm_msg(MERROR,
"source_unbooking",
"Close buffer[%d] stat:", i, status);
488 static char bars[] =
"|/-\\";
505 status = bm_receive_event(ebch[i].hBuf, ebch[i].pfragment, &size, ASYNC);
512 ebch[
i].
serial = ((EVENT_HEADER *) ebch[i].pfragment)->serial_number;
521 psbh = (BANK_HEADER *) (((EVENT_HEADER *) ebch[i].pfragment) + 1);
522 bk_swap(psbh,
FALSE);
530 printf(
"SUCC: ch:%d ser:%d Dest_emask:%d cdemask:%x emask:%x sz:%d\n"
535 case BM_ASYNC_RETURN :
538 printf(
"ASYNC: ch:%d ser:%d Dest_emask:%d cdemask:%x emask:%x sz:%d\n"
544 cm_msg(MERROR,
"event_scan",
"bm_receive_event error %d", status);
554 found = event_mismatch =
FALSE;
557 if (ebch[j].set.emask && !found) {
562 if (ebch[j].set.emask && (serial != ebch[j].
serial)) {
564 event_mismatch =
TRUE;
575 if (event_mismatch) {
579 strcpy(str,
"event mismatch: ");
581 sprintf (strsub,
"Ser[%d]:%d ", j, ebch[j].serial);
582 strcat (str, strsub);
591 if (
wheel && (serial % 1024)==0) {
597 memset(dest_event, 0,
sizeof(EVENT_HEADER));
602 bm_compose_event((EVENT_HEADER *) dest_event
604 act_size, ebch[0].
serial);
607 status =
eb_user(nfragment, ebch, (EVENT_HEADER *) dest_event
608 , (
void *) ((EVENT_HEADER *)dest_event+1), &act_size);
609 if (status != SS_SUCCESS)
615 if (ebch[j].set.emask) {
618 cm_msg(MERROR,
"source_scan",
"compose fragment:%d current size:%d (%d)"
619 , j, act_size, status);
627 act_size = ((EVENT_HEADER *)dest_event)->data_size +
sizeof(EVENT_HEADER);
630 status = rpc_send_event(dest_hBuf, dest_event, act_size, SYNC);
631 if (status != BM_SUCCESS) {
633 printf(
"rpc_send_event returned error %d, event_size %d\n",
635 cm_msg(MERROR,
"EBuilder",
"rpc_send_event returned error %d",status);
658 int main(
unsigned int argc,
char **argv)
660 static char bars[] =
"|\\-/";
670 HNDLE hBuf,
hSubkey, hEKey, hSetKey, hChKey;
676 memset (&ebch[0], 0,
sizeof(ebch));
680 expt_name,
sizeof(expt_name));
683 for (i=1 ; i<argc ; i++)
685 if (argv[i][0] ==
'-' && argv[i][1] ==
'd')
687 else if (argv[i][0] ==
'-' && argv[i][1] ==
'D')
689 else if (argv[i][0] ==
'-' && argv[i][1] ==
'w')
691 else if (argv[i][0] ==
'-')
693 if (i+1 >= argc || argv[i+1][0] ==
'-')
695 if (strncmp(argv[i],
"-e",2) == 0)
696 strcpy(expt_name, argv[++i]);
697 else if (strncmp(argv[i],
"-h",2)==0)
698 strcpy(host_name, argv[++i]);
703 printf(
"usage: mevb [-h <Hostname>] [-e <Experiment>] [-d debug]\n");
704 printf(
" -w show wheel -D to start as a daemon\n\n");
709 printf(
"Program mevb/EBuilder version 3 started\n\n");
712 printf(
"Becoming a daemon...\n");
713 ss_daemon_init(
FALSE);
717 status = cm_connect_experiment(host_name, expt_name,
"EBuilder", NULL);
718 if (status != CM_SUCCESS)
722 status = cm_exist(
"Ebuilder",
FALSE);
723 if (status == CM_SUCCESS)
725 cm_msg(MERROR,
"Ebuilder",
"Ebuilder running already!.\n");
726 cm_disconnect_experiment();
731 cm_get_experiment_database(&
hDB, &
hKey);
734 if (db_find_key(
hDB, 0,
"EBuilder", &hEKey) != DB_SUCCESS)
735 db_create_record(
hDB, 0,
"EBuilder", strcomb(ebuilder_str));
736 db_find_key(
hDB, 0,
"EBuilder", &hEKey);
739 db_find_key(
hDB, hEKey,
"Settings", &hSetKey);
741 status = db_get_record(
hDB, hSetKey, &ebset, &size, 0);
746 db_set_value(
hDB, hSetKey,
"hostname", ebset.
hostname, size, 1, TID_STRING);
752 if (equal_ustring(ebset.
format,
"YBOS"))
754 else if (equal_ustring(ebset.
format,
"MIDAS"))
758 cm_msg(MERROR,
"EBuilder",
"Format not permitted");
763 size =
sizeof(state);
764 db_get_value(
hDB,0,
"/Runinfo/state", &state, &size, TID_INT,
TRUE);
765 if (state != STATE_STOPPED)
767 cm_msg(MTALK,
"EBuilder",
"Run must be stopped before starting EBuilder");
772 if (db_find_key(
hDB, hEKey,
"Channels", &hChKey) != DB_SUCCESS)
774 db_create_record(
hDB, hEKey,
"Channels", strcomb(ebuilder_channel_str));
775 db_find_key(
hDB, hEKey,
"Channels", &hChKey);
780 db_enum_key(
hDB, hChKey, i, &hSubkey);
783 db_get_key(
hDB, hSubkey, &key);
784 if (key.type == TID_KEY)
788 status = db_find_key(
hDB, hSubkey,
"Statistics", &(ebch[j].hStat));
789 status = db_find_key(
hDB, hSubkey,
"Settings", &
hKey);
791 status = db_get_record(
hDB,
hKey, &(ebch[j].set), &size, 0);
798 if (cm_register_transition(TR_START,
tr_prestart, 300) != CM_SUCCESS)
800 if (cm_register_transition(TR_STOP,
tr_stop, 700) != CM_SUCCESS)
804 cm_set_watchdog_params(
TRUE, 0);
807 status = bm_open_buffer(ebset.
buffer, EVENT_BUFFER_SIZE, &hBuf);
808 if(
debug)
printf(
"bm_open_buffer dest returns %d\n",status);
809 if (status != BM_SUCCESS && status != BM_CREATED) {
810 printf(
"Error return from bm_open_buffer\n");
815 status = bm_set_cache_size(hBuf, 0, 200000);
816 if(
debug)
printf(
"bm_set_cache_size dest returns %d\n",status);
819 dest_event = (
char *) malloc(nfragment*(
max_event_size +
sizeof(EVENT_HEADER)));
820 memset(dest_event, 0, nfragment*(
max_event_size +
sizeof(EVENT_HEADER)));
821 if (dest_event == NULL) {
822 cm_msg(MERROR,
"EBuilder",
"Not enough memory for event buffer\n");
827 if (fmt == FORMAT_MIDAS)
829 else if (fmt == FORMAT_YBOS)
832 cm_msg(MERROR,
"mevb",
"Unknown data format :%d", fmt);
840 status = cm_yield(500);
856 status =
source_scan(fmt, nfragment, hBuf, dest_event);
858 case BM_ASYNC_RETURN:
861 for (fragn=0; fragn<
nfragment ;fragn++) {
864 if (
debug)
printf (
"Stop requested on timeout %d\n", status);
867 bm_flush_cache(hBuf, SYNC);
880 sprintf(strout,
"Run %d Stop on frag#%d; events_sent %1.0lf DT:%d[ms]",
884 cm_msg(MINFO,
"EBuilder",
"%s",strout);
892 status = cm_yield(100);
908 cm_msg(MTALK,
"EBuilder",
"Error signaled by user code - stopping run...");
910 cm_msg(MTALK,
"EBuilder",
"Event mismatch - Stopping run...");
912 if (cm_transition(TR_STOP, 0, NULL, 0, ASYNC, 0) != CM_SUCCESS) {
913 cm_msg(MERROR,
"EBuilder",
"Stop Transition request failed");
923 cm_msg(MERROR,
"Source_scan",
"unexpected return %d", status);
934 bm_flush_cache(hBuf, ASYNC);
945 db_set_record(
hDB, ebch[j].hStat
966 last_time = ss_millitime();
973 status = cm_yield(50);
979 }
while (status != RPC_SHUTDOWN && status != SS_ABORT);
980 if (status == SS_ABORT)
986 cm_msg(MTALK,
"EBuilder",
"Event builder error. Check messages");
990 printf(
"EBuilder-Unbooking\n");
997 cm_disconnect_experiment();