support: meanvalue/sum of multiple fts
[physik/nlsop.git] / nlsop_server.c
index 5a627db..d67fae8 100644 (file)
@@ -122,7 +122,7 @@ int add_node(void) {
   return 1;
 }
 
-int save_job(unsigned char dc) {
+int save_job(unsigned char dc,unsigned char *ack) {
 
   char filename[128];
   int fd;
@@ -142,12 +142,21 @@ int save_job(unsigned char dc) {
   network_receive_chan(&(priv.net),gi,(unsigned char *)j->cc,
                        j->size*sizeof(int));
   network_receive_chan(&(priv.net),gi,(unsigned char *)&(j->step),sizeof(int));
+  network_receive_chan(&(priv.net),gi,ack,sizeof(unsigned char));
 
   if(dc!=DC_QUIT) {
-    snprintf(filename,128,"./data/nlsop_b%f_c%f_s%f_ds%d_dr%f_-_%d_of_%d.save",
-             j->info.b,j->info.c,j->info.s,
-             j->info.diff_rate,j->info.dr_ac,
-             j->step,j->info.steps);
+    if(*ack==DATA_OK)
+      snprintf(filename,128,
+               "./data/nlsop_b%f_c%f_s%f_ds%d_dr%f_-_%d_of_%d.save",
+               j->info.b,j->info.c,j->info.s,
+               j->info.diff_rate,j->info.dr_ac,
+               j->step,j->info.steps);
+    else
+      snprintf(filename,128,
+               "./data/nlsop_b%f_c%f_s%f_ds%d_dr%f_-_%d_of_%d.corrupt",
+               j->info.b,j->info.c,j->info.s,
+               j->info.diff_rate,j->info.dr_ac,
+               j->step,j->info.steps);
     if((fd=open(filename,O_WRONLY|O_CREAT))<0) {
       printf("FATAL: unable to open file %s\n",filename);
       return -1;
@@ -228,19 +237,26 @@ int send_status(void) {
 
   data=GUI_INFO;
 
-  count=list_count(&(priv.job));
-
-  printf("sending job info\n");
-
   network_send_chan(&(priv.net),gi,&data,sizeof(unsigned char));
-  network_send_chan(&(priv.net),gi,(unsigned char *)&count,sizeof(int));
+  printf("sending job + client list ...\n");
 
+  count=list_count(&(priv.job));
+  network_send_chan(&(priv.net),gi,(unsigned char *)&count,sizeof(int));
   list_reset(&(priv.job));
   for(i=0;i<count;i++) {
     network_send_chan(&(priv.net),gi,priv.job.current->data,sizeof(t_job));
     list_next(&(priv.job));
   }
 
+  count=list_count(&(priv.client));
+  network_send_chan(&(priv.net),gi,(unsigned char *)&count,sizeof(int));
+  list_reset(&(priv.client));
+  for(i=0;i<count;i++) {
+    network_send_chan(&(priv.net),gi,priv.client.current->data,
+                      sizeof(t_client));
+    list_next(&(priv.client));
+  }
+
   return 1;
 }
 
@@ -249,6 +265,7 @@ int handle_node(void) {
   unsigned char data;
   t_client *c;
   t_job *j;
+  unsigned char ack;
 
   for(gi=0;gi<MAX_CONNECTIONS;gi++) {
     if(FD_ISSET(priv.net.connection[gi].fd,&(priv.event.rfds))) {
@@ -267,7 +284,7 @@ int handle_node(void) {
         c=(t_client *)priv.client.current->data;
 
         if(data==DC_END) {
-          save_job(DC_END);
+          save_job(DC_END,&ack);
           /* reset client */
           c->status=IDLE;
           /* free job memory */
@@ -279,22 +296,32 @@ int handle_node(void) {
         }
 
         if(data==DC_OK) {
-          save_job(DC_OK);
+          save_job(DC_OK,&ack);
           /* inc progress state */
           j->progress+=1;
           printf("job at next level, saved.\n");
         }
 
         if(data==DC_QUIT) {
-          save_job(DC_QUIT);
+         ack=0;
+          save_job(DC_QUIT,&ack);
           /* network disconnect */
           event_math(priv.net.connection[gi].fd,&(priv.event),READ,REMOVE);
           network_close(&(priv.net),gi);
           /* del from client list */
           list_del_current(&(priv.client));
-          /* change job state */
-          j->status=IN_QUEUE;
-          printf("client terminating, job queued, client removed.\n");
+          /* change job state (or reset it if corrupted) */
+         if(ack==DATA_OK) {
+            j->status=IN_QUEUE;
+            printf("client terminating, job queued, client removed.\n");
+         }
+         else {
+            j->channel=-1;
+            j->status=IN_QUEUE;
+            j->progress=0;
+            j->step=0;
+            printf("client terminating, corr. job cleared , client removed.\n");
+          }
         }
       }
 
@@ -439,6 +466,8 @@ int parse_incoming(t_event *event,void *allineed) {
 
 void destroy_it(int signum) {
 
+  t_job *j;
+
   printf("connection to client (ch %d) fucked up!\n",gi);
   event_math(priv.net.connection[gi].fd,&(priv.event),READ,REMOVE);
   network_close(&(priv.net),gi);
@@ -446,6 +475,14 @@ void destroy_it(int signum) {
     list_del_current(&(priv.client));
     printf("removed client from list\n");
   }
+  if(list_search_data(&(priv.job),&gi,sizeof(int))==L_SUCCESS) {
+    printf("associated job found. resetting & queueing job.\n");
+    j=(t_job *)priv.job.current->data;
+    j->channel=-1;
+    j->status=IN_QUEUE;
+    j->progress=0;
+    j->step=0;
+  }
   if(list_search_data(&(priv.gui),&gi,sizeof(int))==L_SUCCESS) {
     list_del_current(&(priv.gui));
     printf("removed gui from list\n");