From e7db944b423060d85ba8b20e09b988c5e0d6acb9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Sep 2016 17:45:25 -0300 Subject: [PATCH] better exit handling --- iguana/iguana777.c | 6 +++--- iguana/iguana_bitmap.c | 2 +- iguana/iguana_blocks.c | 2 +- iguana/iguana_exchanges.c | 2 +- iguana/iguana_mofn.c | 2 +- iguana/iguana_peers.c | 8 ++++---- iguana/iguana_ramchain.c | 16 ++++++++-------- iguana/iguana_spendvectors.c | 15 ++++++++------- iguana/iguana_volatiles.c | 4 ++-- iguana/main.c | 18 ++++++++++-------- includes/iguana_funcs.h | 4 ++-- 11 files changed, 41 insertions(+), 38 deletions(-) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 92586cb24..1be3ba473 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -403,7 +403,7 @@ int32_t iguana_helperA(struct supernet_info *myinfo,struct iguana_info *coin,int else { printf("error validating.[%d], restart iguana\n",bp->hdrsi); - iguana_exit(myinfo); + iguana_exit(myinfo,bp); } return(num); } @@ -569,7 +569,7 @@ int32_t iguana_utxogen(struct supernet_info *myinfo,struct iguana_info *coin,int if ( iguana_utxoaddr_gen(myinfo,coin,(coin->bundlescount - 1) * coin->chain->bundlesize) == 0 ) { printf("restart iguana: fatal error generating ledger file for %s\n",coin->symbol); - iguana_exit(myinfo); + iguana_exit(myinfo,0); } } } @@ -802,7 +802,7 @@ void iguana_coinloop(void *arg) if ( coin->peers == 0 ) { printf("FATAL lack of peers struct\n"); - iguana_exit(myinfo); + iguana_exit(myinfo,0); } if ( coin->virtualchain == 0 ) { diff --git a/iguana/iguana_bitmap.c b/iguana/iguana_bitmap.c index 4fabd6661..25413848f 100755 --- a/iguana/iguana_bitmap.c +++ b/iguana/iguana_bitmap.c @@ -126,7 +126,7 @@ void gen_jpegfile(char *fname,int32_t quality,uint8_t *bitmap,int32_t width,int3 if ( (outfile= fopen(fname,"wb")) == NULL) { fprintf(stderr, "can't open %s\n", fname); - iguana_exit(0); + iguana_exit(0,0); } jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = width; /* image width and height, in pixels */ diff --git a/iguana/iguana_blocks.c b/iguana/iguana_blocks.c index 88870e7cd..01290a5d7 100755 --- a/iguana/iguana_blocks.c +++ b/iguana/iguana_blocks.c @@ -150,7 +150,7 @@ void _iguana_blocklink(struct iguana_info *coin,struct iguana_block *prev,struct if ( memcmp(block->RO.prev_block.bytes,prev->RO.hash2.bytes,sizeof(bits256)) != 0 ) { printf("illegal blocklink mismatched hashes\n"); - iguana_exit(0); + iguana_exit(0,0); return; } block->hh.prev = prev; diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index e057cebee..8ff60232a 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -1035,7 +1035,7 @@ struct exchange_info *exchange_create(char *exchangestr,cJSON *argjson) if ( stringbits((char *)Exchange_funcs[i]->name) == stringbits((char *)Exchange_funcs[j]->name) ) { printf("FIRST 8 chars of Exchange_func[].name must be unique: %d.(%s) vs %d.(%s)\n",i,Exchange_funcs[i]->name,j,Exchange_funcs[j]->name); - iguana_exit(0); + iguana_exit(0,0); } } didinit = 1; diff --git a/iguana/iguana_mofn.c b/iguana/iguana_mofn.c index 505a486dd..ab094bf5d 100755 --- a/iguana/iguana_mofn.c +++ b/iguana/iguana_mofn.c @@ -656,7 +656,7 @@ bits256 iguana_schnorr_noncepair(void *ctx,bits256 *pubkey,uint8_t odd_even,bits if ( j == maxj ) { printf("couldnt generate even noncepair\n"); - iguana_exit(0); + iguana_exit(0,0); } return(privnonce); } diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index 50cd9a187..698c8a522 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -90,7 +90,7 @@ struct iguana_iAddr *_iguana_hashset(struct iguana_info *coin,uint32_t ipbits,in if ( ptr == 0 ) { printf("fatal alloc errorA in hashset\n"); - iguana_exit(0); + iguana_exit(0,0); } //printf("ptr.%p allocsize.%d key.%p keylen.%d itemind.%d\n",ptr,allocsize,key,keylen,itemind); ptr->hh.itemind = itemind; @@ -117,7 +117,7 @@ struct iguana_iAddr *iguana_iAddrhashset(struct iguana_info *coin,struct iguana_ if ( iA == 0 || iA->ipbits == 0 ) { printf("null iA.%p or ipbits.%llx ind.%d status.%d\n",iA,iA!=0?(long long)iA->ipbits:0,iA!=0?iA->hh.itemind:0,iA!=0?iA->status:0); - iguana_exit(0); + iguana_exit(0,0); return(0); } portable_mutex_lock(&coin->peers_mutex); @@ -194,7 +194,7 @@ uint32_t iguana_rwiAddrind(struct iguana_info *coin,int32_t rwflag,struct iguana if ( ptr == 0 ) { printf("fatal alloc errorB in hashset\n"); - iguana_exit(0); + iguana_exit(0,0); } ptr->hh.itemind = m; ptr->ipbits = tmp.ipbits; @@ -528,7 +528,7 @@ int32_t iguana_queue_send(struct iguana_peer *addr,int32_t delay,uint8_t *serial if ( addr == 0 ) { printf("iguana_queue_send null addr\n"); - iguana_exit(0); + iguana_exit(0,0); return(-1); } if ( (datalen= iguana_sethdr((void *)serialized,addr->netmagic,cmd,&serialized[sizeof(struct iguana_msghdr)],len)) < 0 ) diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 8e9200b6d..eb2dea060 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -54,7 +54,7 @@ struct iguana_kvitem *iguana_hashsetPT(struct iguana_ramchain *ramchain,int32_t if ( ptr == 0 ) { printf("fatal alloc errorC in hashset\n"); - iguana_exit(0); + iguana_exit(0,0); } if ( 0 && ramchain->expanded && selector == 'T' ) printf("hashmem.%p selector.%c added.(%s) itemind.%x ptr.%p\n",ramchain->hashmem,selector,str,itemind,ptr); @@ -69,7 +69,7 @@ struct iguana_kvitem *iguana_hashsetPT(struct iguana_ramchain *ramchain,int32_t if ( itemind == 0 ) { printf("negative itemind\n"); - iguana_exit(0); + iguana_exit(0,0); } if ( 0 ) { @@ -79,7 +79,7 @@ struct iguana_kvitem *iguana_hashsetPT(struct iguana_ramchain *ramchain,int32_t if ( tmp != ptr ) { printf("(%s) hashmem.%p selector.%c %s search error %p != %p itemind.%x\n",str,ramchain->hashmem,selector,str,ptr,tmp,itemind); - iguana_exit(0); + iguana_exit(0,0); } } } @@ -233,7 +233,7 @@ uint32_t iguana_ramchain_addpkhash(struct iguana_info *coin,RAMCHAIN_FUNC,uint8_ if ( P[pkind].pkind != pkind ) //unspentind != 0 && (P[pkind].firstunspentind != unspentind || { printf("iguana_ramchain_addpkhash error mismatched pkind.(%x %x) unspentind.%d\n",pkind,P[pkind].pkind,unspentind); - iguana_exit(0); + iguana_exit(0,0); return(0); } if ( memcmp(P[pkind].rmd160,rmd160,sizeof(P[pkind].rmd160)) != 0 ) @@ -396,7 +396,7 @@ uint32_t iguana_ramchain_addunspent(struct iguana_info *coin,RAMCHAIN_FUNC,uint6 if ( u->fileid != fileid || u->scriptpos != fpos || u->scriptlen != scriptlen || u->value != value || u->pkind != pkind || u->value != value || u->txidind != ramchain->H.txidind || (pkind != 0 && u->prevunspentind != A[pkind].lastunspentind) || u->vout != vout || u->hdrsi != hdrsi ) { printf("iguana_ramchain_addunspent: (%d %d %d) vs (%d %d %d) mismatched values.(%d %.8f %d %d %d %d) vs (%d %.8f %d %d %d %d)\n",u->fileid,u->scriptpos,u->scriptlen,fileid,fpos,scriptlen,u->pkind,dstr(u->value),u->txidind,u->prevunspentind,u->vout,u->hdrsi,pkind,dstr(value),ramchain->H.txidind,A[pkind].lastunspentind,vout,hdrsi); - iguana_exit(0); + iguana_exit(0,0); return(0); } } @@ -495,7 +495,7 @@ uint32_t iguana_ramchain_addspend(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 else { printf("addspend illegal txidind.%d vs %d\n",txidind,rdata->numtxids); - iguana_exit(0); + iguana_exit(0,0); } } if ( ramchain->H.ROflag != 0 ) @@ -998,7 +998,7 @@ int64_t iguana_ramchain_init(char *fname,struct iguana_ramchain *ramchain,struct if ( rdata->allocsize != iguana_ramchain_size(fname,RAMCHAIN_ARG,numblocks,scriptspace,zcash) ) { printf("offset.%ld scriptspace.%d allocsize.%ld vs memsize.%ld\n",(long)offset,scriptspace,(long)rdata->allocsize,(long)iguana_ramchain_size(fname,RAMCHAIN_ARG,numblocks,scriptspace,zcash)); - iguana_exit(0); + iguana_exit(0,0); } if ( offset <= mem->totalsize ) iguana_memreset(mem); @@ -1014,7 +1014,7 @@ int64_t iguana_ramchain_init(char *fname,struct iguana_ramchain *ramchain,struct if ( rdata->allocsize > mem->totalsize ) { printf("init.(%d %d %d %d %d) rdata->allocsize.%ld mem->totalsize.%ld hashmemsize.%ld\n",numtxids,numunspents,numspends,numpkinds,numexternaltxids,(long)rdata->allocsize,mem->totalsize,hashmem!=0?hashmem->totalsize:0); - iguana_exit(0); + iguana_exit(0,0); } return(offset); } diff --git a/iguana/iguana_spendvectors.c b/iguana/iguana_spendvectors.c index 456317691..bfe732525 100755 --- a/iguana/iguana_spendvectors.c +++ b/iguana/iguana_spendvectors.c @@ -155,7 +155,7 @@ struct iguana_bundle *iguana_externalspent(struct supernet_info *myinfo,struct i else { printf("illegal hdrsi.%d prev_hash.(%s) for bp.[%d]\n",hdrsi,bits256_str(str,prev_hash),spent_hdrsi); - iguana_exit(myinfo); + iguana_exit(myinfo,0); return(0); } } @@ -164,8 +164,8 @@ struct iguana_bundle *iguana_externalspent(struct supernet_info *myinfo,struct i printf("cant find prev_hash.(%s) for bp.[%d]\n",bits256_str(str,prev_hash),spent_hdrsi); if ( spent_hdrsi < coin->current->hdrsi ) { - iguana_bundleremove(coin,spent_hdrsi,1); - iguana_exit(myinfo); + //iguana_bundleremove(coin,spent_hdrsi,1); + iguana_exit(myinfo,coin->bundles[spent_hdrsi]); } coin->RTdatabad = 1; return(0); @@ -177,8 +177,8 @@ struct iguana_bundle *iguana_externalspent(struct supernet_info *myinfo,struct i else if ( unspentind == 0 || unspentind >= spentbp->ramchain.H.data->numunspents ) printf("%s illegal unspentind.%d vs max.%d spentbp.%p[%d]\n",coin->symbol,unspentind,spentbp->ramchain.H.data->numunspents,spentbp,hdrsi); else return(spentbp); - iguana_bundleremove(coin,spent_hdrsi,1); - iguana_exit(myinfo); + //iguana_bundleremove(coin,spent_hdrsi,1); + iguana_exit(myinfo,coin->bundles[spent_hdrsi]); } //exit(-1); return(0); @@ -957,7 +957,7 @@ int32_t iguana_balanceflush(struct supernet_info *myinfo,struct iguana_info *coi } } #endif - iguana_exit(myinfo); + iguana_exit(myinfo,0); } coin->balanceswritten = iguana_volatilesinit(myinfo,coin); //printf("flush free\n"); @@ -1159,7 +1159,8 @@ int32_t iguana_bundlevalidate(struct supernet_info *myinfo,struct iguana_info *c if ( errs != 0 ) { printf("%s remove.[%d]\n",coin->symbol,bp->hdrsi); - iguana_bundleremove(coin,bp->hdrsi,0); + //iguana_bundleremove(coin,bp->hdrsi,0); + return(-errs); } return(bp->n - errs); } diff --git a/iguana/iguana_volatiles.c b/iguana/iguana_volatiles.c index 1c00f5a60..64a543c6c 100755 --- a/iguana/iguana_volatiles.c +++ b/iguana/iguana_volatiles.c @@ -315,7 +315,7 @@ int32_t iguana_volatileupdate(struct iguana_info *coin,int32_t incremental,struc { //double startmillis = OS_milliseconds(); static double totalmillis; static int32_t utxon; printf("hhutxo deprecated\n"); - iguana_exit(0); + iguana_exit(0,0); } //portable_mutex_unlock(&coin->RTmutex); printf("end iguana_volatileupdate.%d: [%d] spent.(u%u %.8f pkind.%d) double spend? at ht.%d [%d] spendind.%d (%p %p)\n",incremental,spent_hdrsi,spent_unspentind,dstr(spent_value),spent_pkind,fromheight,fromheight/coin->chain->bundlesize,spendind,spentchain->Uextras,spentchain->A2); @@ -336,7 +336,7 @@ int32_t iguana_volatileupdate(struct iguana_info *coin,int32_t incremental,struc bp->ramchain.H.data = 0; } portable_mutex_unlock(&coin->special_mutex); - iguana_exit(0); + iguana_exit(0,0); } } else if ( coin->spendvectorsaved > 1 ) diff --git a/iguana/main.c b/iguana/main.c index 95c70fcfd..09f345200 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -332,7 +332,7 @@ char *SuperNET_JSON(struct supernet_info *myinfo,struct iguana_info *coin,cJSON return(retstr); } -void iguana_exit(struct supernet_info *myinfo) +void iguana_exit(struct supernet_info *myinfo,struct iguana_bundle *bp) { int32_t i,j,iter; struct iguana_info *coin,*tmp; if ( myinfo == 0 ) @@ -365,6 +365,8 @@ void iguana_exit(struct supernet_info *myinfo) sleep(3); } printf("sockets closed\n"); + if ( bp != 0 ) + iguana_bundleremove(bp->coin,bp->hdrsi,1); for (i=0; i<10; i++) { printf("need to exit, please restart after shutdown in %d seconds, or just ctrl-C\n",10-i); @@ -375,12 +377,12 @@ void iguana_exit(struct supernet_info *myinfo) #ifndef _WIN32 #include -void sigint_func() { printf("\nSIGINT\n"); iguana_exit(0); } -void sigillegal_func() { printf("\nSIGILL\n"); iguana_exit(0); } -void sighangup_func() { printf("\nSIGHUP\n"); iguana_exit(0); } -void sigkill_func() { printf("\nSIGKILL\n"); iguana_exit(0); } -void sigabort_func() { printf("\nSIGABRT\n"); iguana_exit(0); } -void sigquit_func() { printf("\nSIGQUIT\n"); iguana_exit(0); } +void sigint_func() { printf("\nSIGINT\n"); iguana_exit(0,0); } +void sigillegal_func() { printf("\nSIGILL\n"); iguana_exit(0,0); } +void sighangup_func() { printf("\nSIGHUP\n"); iguana_exit(0,0); } +void sigkill_func() { printf("\nSIGKILL\n"); iguana_exit(0,0); } +void sigabort_func() { printf("\nSIGABRT\n"); iguana_exit(0,0); } +void sigquit_func() { printf("\nSIGQUIT\n"); iguana_exit(0,0); } void sigchild_func() { printf("\nSIGCHLD\n"); signal(SIGCHLD,sigchild_func); } void sigalarm_func() { printf("\nSIGALRM\n"); signal(SIGALRM,sigalarm_func); } void sigcontinue_func() { printf("\nSIGCONT\n"); signal(SIGCONT,sigcontinue_func); } @@ -1165,7 +1167,7 @@ ZERO_ARGS(SuperNET,stop) { if ( remoteaddr == 0 || strncmp(remoteaddr,"127.0.0.1",strlen("127.0.0.1")) == 0 ) { - iguana_exit(myinfo); + iguana_exit(myinfo,0); return(clonestr("{\"result\":\"exit started\"}")); } else return(clonestr("{\"error\":\"cant do a remote stop of this node\"}")); } diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 4cd7b570e..00266106e 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -187,7 +187,7 @@ int32_t iguana_rpctest(struct iguana_info *coin); extern queue_t helperQ; extern const char *Hardcoded_coins[][3]; void iguana_main(void *arg); -void iguana_exit(struct supernet_info *myinfo); +void iguana_exit(struct supernet_info *myinfo,struct iguana_bundle *bp); int32_t iguana_peerfname(struct iguana_info *coin,int32_t *hdrsip,char *dirname,char *fname,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t numblocks,int32_t dispflag); struct iguana_txblock *iguana_peertxdata(struct iguana_info *coin,int32_t *bundleip,char *fname,struct OS_memspace *mem,uint32_t ipbits,bits256 hash2); @@ -273,7 +273,7 @@ cJSON *iguana_pubkeyjson(struct iguana_info *coin,char *pubkeystr); void iguana_bundleQ(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_bundle *bp,int32_t timelimit); int32_t iguana_bundleiters(struct supernet_info *myinfo,struct iguana_info *coin,struct OS_memspace *mem,struct OS_memspace *memB,struct iguana_bundle *bp,int32_t timelimit,int32_t lag); void ramcoder_test(void *data,int64_t len); -void iguana_exit(); +void iguana_exit(struct supernet_info *myinfo,struct iguana_bundle *bp); int32_t iguana_pendingaccept(struct iguana_info *coin); char *iguana_blockingjsonstr(struct supernet_info *myinfo,struct iguana_info *coin,char *jsonstr,uint64_t tag,int32_t maxmillis,char *remoteaddr,uint16_t port); void iguana_iAkill(struct iguana_info *coin,struct iguana_peer *addr,int32_t markflag);