Index: trunk/FACT++/src/EventBuilder.c
===================================================================
--- trunk/FACT++/src/EventBuilder.c	(revision 11342)
+++ trunk/FACT++/src/EventBuilder.c	(revision 11343)
@@ -60,4 +60,5 @@
 int  g_runStat   ;
 int  g_reset     ;
+int gi_reset, gi_resetR, gi_resetS, gi_resetW, gi_resetX ;
 size_t g_maxMem  ;  //maximum memory allowed for buffer
 
@@ -76,5 +77,5 @@
  int gi_memStat = +1 ;
 
- int32_t gi_myRun ;
+ uint32_t gi_myRun ;
 
 
@@ -248,5 +249,6 @@
 
    for (i=0; i<MAX_EVT*MAX_RUN; i++) {
-      mBuffer[i].evNum = mBuffer[i].runNum = -1;
+      mBuffer[i].evNum = mBuffer[i].nRoi = -1;
+      mBuffer[i].runNum= 0 ;
 
       evtCtrl.evtBuf[  i] = -1 ;
@@ -268,5 +270,5 @@
 
 
-int mBufEvt(uint evID, uint runID, uint nRoi) {
+int mBufEvt( int evID, uint runID, int nRoi) {
 // generate a new Event into mBuffer:   
 // make sure only complete Event are possible, so 'free' will always work
@@ -278,5 +280,5 @@
    size_t needmem = 0 ;
 
-   if (nRoi <=0 || nRoi > 1024) {
+   if (nRoi <0 || nRoi > 1024) {
       snprintf(str,MXSTR,"illegal nRoi: %d",nRoi) ;
       factOut(kError, 1, str ) ;
@@ -419,15 +421,15 @@
    size_t freemem = 0 ;
 
-   if ( mBuffer[i].nRoi > 0) {      //have an fEvent structure generated ...
-      freemem = mBuffer[i].evtLen ; 
-      free(mBuffer[i].fEvent ) ;
-      mBuffer[i].fEvent = NULL ;
-
-      free(mBuffer[i].FADhead ) ;
-      mBuffer[i].FADhead = NULL ;
-
-   }
+   freemem = mBuffer[i].evtLen ; 
+
+   free(mBuffer[i].fEvent ) ;
+   mBuffer[i].fEvent = NULL ;
+
+   free(mBuffer[i].FADhead ) ;
+   mBuffer[i].FADhead = NULL ;
+
    headmem = NBOARDS* sizeof(PEVNT_HEADER) ;
-   mBuffer[i].evNum   = mBuffer[i].runNum = mBuffer[i].nRoi= -1;
+   mBuffer[i].evNum   = mBuffer[i].nRoi= -1;
+   mBuffer[i].runNum  = 0;
 
    gj.usdMem = gj.usdMem - freemem - headmem;
@@ -495,5 +497,4 @@
   int errcnt0 = 0 ;
 
-  int reset, resetR, resetS, resetW, resetX ;
   int sockDef[NBOARDS];    //internal state of sockets
 
@@ -538,6 +539,6 @@
      runCtrl[i].fileId = -2 ;
   }
-  resetS = resetR = 9; 
-
+  gi_resetS = gi_resetR = 9; 
+  for (i=0; i<NBOARDS; i++) sockDef[i]= 0 ; 
 
 START:
@@ -551,5 +552,5 @@
   numok = numok2   = 0 ;
 
-  if ( resetS > 0) {
+  if ( gi_resetS > 0) {
      //make sure all sockets are preallocated as 'not exist'
      for (i=0; i<MAX_SOCK; i++) {
@@ -557,16 +558,4 @@
         rd[i].sockStat = 99 ;
      }
-
-     for (i=0; i<NBOARDS; i++) sockDef[i]= 0 ; 
-
-  }
-
-
-  if ( resetR > 0) {
-     resetEvtStat(); 
-     gj.usdMem = gj.maxMem = gj.xxxMem = 0 ;
-     gj.totMem = g_maxMem ;
-     gj.bufNew = gj.bufEvt = 0 ;
-     gj.evtSkip= gj.evtWrite = gj.evtErr = 0 ;
 
      for (k=0; k<NBOARDS; k++) {
@@ -579,4 +568,15 @@
      }
 
+  }
+
+
+  if ( gi_resetR > 0) {
+     resetEvtStat(); 
+     gj.usdMem = gj.maxMem = gj.xxxMem = 0 ;
+     gj.totMem = g_maxMem ;
+     gj.bufNew = gj.bufEvt = 0 ;
+     gj.evtSkip= gj.evtWrite = gj.evtErr = 0 ;
+
+
      mBufInit() ;    //initialize buffers
 
@@ -586,7 +586,7 @@
 
 
-  reset = resetR = resetS = resetW = 0 ; 
-
-  while (g_runStat >=0 || g_reset ==0 ) {  //loop until global variable g_runStat claims stop
+  gi_reset = gi_resetR = gi_resetS = gi_resetW = 0 ; 
+
+  while (g_runStat >=0 && g_reset ==0 ) {  //loop until global variable g_runStat claims stop
 
     gi_runStat = g_runStat;
@@ -893,5 +893,6 @@
                 gj.evtSkip++; 
              } 
-          } else if (evtCtrl.evtStat[k0] >= 900 ) {
+          } else if (evtCtrl.evtStat[k0] >= 900     //'delete'
+                  || evtCtrl.evtStat[k0] == 0 ) {   //'useless'
 
              int id =evtCtrl.evtBuf[k0] ;
@@ -945,17 +946,17 @@
 
  if (g_reset >0 ) {
-   reset  = g_reset ;
-   resetR = reset%10 ;        //shall we stop reading ?
-   resetS = (reset/10)%10 ;   //shall we close sockets ?
-   resetW = (reset/100)%10 ;  //shall we close files ?
-   resetX = reset/1000 ;      //shall we simply wait resetX seconds ?
+   gi_reset  = g_reset ;
+   gi_resetR = gi_reset%10 ;        //shall we stop reading ?
+   gi_resetS = (gi_reset/10)%10 ;   //shall we close sockets ?
+   gi_resetW = (gi_reset/100)%10 ;  //shall we close files ?
+   gi_resetX = gi_reset/1000 ;      //shall we simply wait resetX seconds ?
    g_reset= 0;
  } else {
-   reset  = 0;
-   if ( g_runStat==-1 ) resetR = 1 ;
-   else                 resetR = 7 ;
-   resetS = 7 ; //close all sockets
-   resetW = 7 ; //close all files
-   resetX = 0 ;
+   gi_reset  = 0;
+   if ( g_runStat==-1 ) gi_resetR = 1 ;
+   else                 gi_resetR = 7 ;
+   gi_resetS = 7 ; //close all sockets
+   gi_resetW = 7 ; //close all files
+   gi_resetX = 0 ;
 
    //inform others we have to quit ....
@@ -964,5 +965,5 @@
  }
 
- if (resetS > 0) {
+ if (gi_resetS > 0) {
     //must close all open sockets ...
     snprintf(str,MXSTR,"close all sockets ...");
@@ -979,5 +980,5 @@
 
 
- if (resetR > 0) {
+ if (gi_resetR > 0) {
     //flag all events as 'read finished'
     int kd = evtCtrl.lastPtr - evtCtrl.frstPtr ;
@@ -1001,5 +1002,5 @@
     //and clear all buffers (might have to wait until all others are done)
     int minclear ;
-    if (resetR == 1) {
+    if (gi_resetR == 1) {
        minclear = 900 ;
        snprintf(str,MXSTR,"drain all buffers ...");
@@ -1035,10 +1036,10 @@
  }
 
- if (reset > 0) {
-    if (resetW > 0) {
+ if (gi_reset > 0) {
+    if (gi_resetW > 0) {
        CloseRunFile(0,0,0) ; //ask all Runs to be closed
     }
-    if (resetX > 0) {
-       xwait.tv_sec = resetX;
+    if (gi_resetX > 0) {
+       xwait.tv_sec = gi_resetX;
        xwait.tv_nsec= 0 ;        
        nanosleep( &xwait , NULL ) ;
@@ -1047,5 +1048,5 @@
     snprintf(str,MXSTR,"Continue read Process ...");
     factOut(kInfo,-1, str ) ;
-    reset = 0 ; 
+    gi_reset = 0 ; 
     goto START ;
  }
@@ -1099,4 +1100,9 @@
 //would be better to use bitmaps for evtStat (allow '&' instead of multi-if)
         if (evtCtrl.evtStat[k0] > 90 && evtCtrl.evtStat[k0] <500) {
+
+         if ( gi_resetR > 1 ) {    //we are asked to flush buffers asap
+           evtCtrl.evtStat[k0] = 991 ; 
+         } else {
+
            int      id   = evtCtrl.evtBuf[k0] ;
            int      ievt = mBuffer[id].evNum ;
@@ -1141,10 +1147,12 @@
            gi.procTot++ ;
            numProc++ ;
-           evtCtrl.evtStat[k0] = 520 ;
            
            if (i<0) {
               evtCtrl.evtStat[k0] = 999 ; //flag event to be skipped
               gi.procErr++ ;
+           } else {
+              evtCtrl.evtStat[k0] = 520 ;
            }
+         }
         } else if ( evtCtrl.evtStat[k0] >=0 && evtCtrl.evtStat[k0] < 90 ) {
            numWait++ ;
@@ -1266,4 +1274,10 @@
 //would be better to use bitmaps for evtStat (allow '&' instead of multi-if)
         if (evtCtrl.evtStat[k0] > 500 && evtCtrl.evtStat[k0] < 900) {
+
+         if ( gi_resetR > 1 ) {        //we must drain the buffer asap
+           evtCtrl.evtStat[k0] = 904 ;
+         } else {
+
+
            int      id   = evtCtrl.evtBuf[k0] ;
            uint32_t irun = mBuffer[id].runNum ;
@@ -1313,5 +1327,5 @@
               snprintf(str,MXSTR,"W no open file for this run %d",irun) ;
               factOut(kWarn,123,str) ;
-              evtCtrl.evtStat[k0] = 902 ;
+              evtCtrl.evtStat[k0] = 903 ;
               gi.wrtErr++ ;
            } else {
@@ -1327,11 +1341,11 @@
                  snprintf(str,MXSTR,"W error writing event for run %d",irun) ;
                  factOut(kError,503, str ) ;
-                 evtCtrl.evtStat[k0] = 901 ;
+                 evtCtrl.evtStat[k0] = 902 ;
                  gi.wrtErr++ ;
               }
 
               if ( i < 0
+                || runCtrl[j].lastTime  < g_actTime-300
                 || runCtrl[j].closeTime < g_actTime 
-                || runCtrl[j].lastTime  < g_actTime-300
                 || runCtrl[j].maxEvt    < runCtrl[j].actEvt )  {
 int ii =0 ;
@@ -1357,5 +1371,7 @@
               }
            }
-        } else if (evtCtrl.evtStat[k0] > 0 ) numWait++ ;
+         }
+        } else if (evtCtrl.evtStat[k0] > 0
+                && evtCtrl.evtStat[k0] < 900 ) numWait++ ;
      }
 
@@ -1408,4 +1424,5 @@
   snprintf(str,MXSTR,"Abort Writing Process ...");
   factOut(kInfo,-1, str ) ;
+
 closerun:
   snprintf(str,MXSTR,"Close all open files ...");
@@ -1456,4 +1473,14 @@
   factOut(kInfo,-1, str ) ;
 
+/* initialize run control logics */
+  for (i=0; i<MAX_RUN; i++) {
+     runCtrl[i].runId = 0 ;
+     runCtrl[i].fileId = -2 ;
+  }
+
+/* partially initialize event control logics */
+  evtCtrl.frstPtr = 0 ;
+  evtCtrl.lastPtr = 0 ;
+
 //start all threads (more to come) when we are allowed to ....
   while (g_runStat == 0 ) {
Index: trunk/FACT++/src/FAD.h
===================================================================
--- trunk/FACT++/src/FAD.h	(revision 11342)
+++ trunk/FACT++/src/FAD.h	(revision 11343)
@@ -199,13 +199,13 @@
 
 typedef struct {
-   int32_t evNum ;
+  int32_t  evNum ;
   uint32_t runNum ;
-  int32_t fadLen ;
-  int32_t nBoard ;
-  int16_t board[ NBOARDS ];
-  int32_t nRoi   ;
+  int32_t  fadLen ;
+  int32_t  nBoard ;
+  int16_t  board[ NBOARDS ];
+  int32_t  nRoi   ;
   uint32_t pcTime ;
-  int32_t evtLen ;
-  EVENT   *fEvent  ;
+  int32_t  evtLen ;
+  EVENT   *fEvent ;
   PEVNT_HEADER *FADhead; //
 
@@ -232,5 +232,5 @@
                                 //(TO BE REVISED)
 
-  int pcTime[MAX_EVT*MAX_RUN] ;     //time when last action happened
+  uint32_t pcTime[MAX_EVT*MAX_RUN] ;     //time when last action happened
 } EVT_CTRL ;     //internal to eventbuilder
 
