From acc832c81063b8dd02cf97ff78989127f6caed7b Mon Sep 17 00:00:00 2001 From: hackbard Date: Mon, 7 Feb 2005 16:05:59 +0000 Subject: [PATCH] care for corrupted data, improved client termination behaviour --- nlsop_server.c | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/nlsop_server.c b/nlsop_server.c index 9adc6f8..d67fae8 100644 --- a/nlsop_server.c +++ b/nlsop_server.c @@ -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; @@ -256,6 +265,7 @@ int handle_node(void) { unsigned char data; t_client *c; t_job *j; + unsigned char ack; for(gi=0;gidata; if(data==DC_END) { - save_job(DC_END); + save_job(DC_END,&ack); /* reset client */ c->status=IDLE; /* free job memory */ @@ -286,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"); + } } } @@ -461,6 +481,7 @@ void destroy_it(int signum) { 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)); -- 2.20.1