Ejemplo n.º 1
0
int tcp_write_buf(struct tcp_sock *tsk, void *data, unsigned int len)
{
	struct cbuf *cbuf = tsk->rcv_buf;
	int rlen;

	/* first text */
	if (!cbuf) {
		cbuf = alloc_cbuf(tsk->rcv_wnd);
		tsk->rcv_buf = cbuf;
	}

	/* write text to circular buffer */
	rlen = write_cbuf(cbuf, (char *)data, len);
	if (rlen > 0) {
		tsk->rcv_wnd -= rlen;	/* assert rlen >= 0 */
		tsk->rcv_nxt += rlen;
	}
	return rlen;
}
Ejemplo n.º 2
0
static t_client	*read_client(fd_set const * const fd_read, t_client *list)
{
  t_client	*client;
  t_client	*client2;

  client = first_node(&list->node);
  while (client != NULL)
    {
      client2 = client->node.next;
      if (FD_ISSET(client->ca.cfd, fd_read))
	{
	  if (write_cbuf(&client->cbuf, client->ca.cfd) <= 0)
	    list = sup_client(client);
	  else
	    if (clock_gettime(CLOCK_MONOTONIC_RAW, &client->time) == -1)
	      {
		perror("clock_gettime :");
		list = sup_client(client);
	      }
	}
      client = client2;
    }
  return (list);
}
Ejemplo n.º 3
0
int main(int argc,char *argv[])
{
    int i,j,k,c,err,nthr;
    int block_size,extend,detail,combine,out_cnt,format;
    struct lk_compress *lkc;
    struct contig *contigs,*ctg;
    struct range_blk *r;
    struct tdc_par tp;
    char *ranges_file,*target_file,*output_file,*compare_ref;
    char *filter,*suffix,*tn,*prefix,*pp;
    count *ct,cc,cbuf[OUT_WIDTH];
    u_int64_t *hist,*thist,nn,kk,tnn,tkk,number;
    u_int32_t x;
    pthread_t *read_threads;
    FILE *ofptr,*ctg_fptr;
    static struct option longopts[]= {
        {"ranges_file",required_argument,0,'r'},
        {"target_file",required_argument,0,'t'},
        {"block_size",required_argument,0,'b'},
        {"number",required_argument,0,'n'},
        {"output",required_argument,0,'o'},
        {"extend_regions",required_argument,0,'x'},
        {"detailed_output",no_argument,0,'d'},
        {"combine",no_argument,0,'c'},
        {"compare",required_argument,0,'C'},
        {"eland",no_argument,0,'E'},
        {"gem",no_argument,0,'G'},
        {"prefix",no_argument,0,'p'},
        {0,0,0,0}
    };

    err=0;
    detail=combine=0;
    ranges_file=target_file=output_file=compare_ref=prefix=0;
    block_size=1;
    extend=0;
    contigs=0;
    number=0;
    format=GEM_FMT;
    while((c=getopt_long(argc,argv,"p:r:t:b:o:n:x:C:dcEG",longopts,0))!=-1) {
        switch(c) {
        case 'p':
            set_opt("prefix",&prefix,optarg);
            break;
        case 'r':
            set_opt("ranges_file",&ranges_file,optarg);
            break;
        case 't':
            set_opt("target_file",&target_file,optarg);
            break;
        case 'C':
            set_opt("compare",&compare_ref,optarg);
            break;
        case 'o':
            set_opt("output",&output_file,optarg);
            break;
        case 'b':
            block_size=atoi(optarg);
            break;
        case 'E':
            format=ELAND_FMT;
            break;
        case 'G':
            format=GEM_FMT;
            break;
        case 'x':
            extend=atoi(optarg);
            break;
        case 'n':
            number=strtoul(optarg,&pp,10);
            break;
        case 'd':
            detail=1;
            break;
        case 'c':
            combine=1;
            break;
        }
    }
    if(!ranges_file) {
        fprintf(stderr,"No ranges file specified.  Use -r or --ranges_file option\n");
        exit(-1);
    }
    if(!output_file) output_file=strdup("coverage_hist.txt");
    if(block_size<1) {
        fprintf(stderr,"Invalid block size specified - must be >0\n");
        exit(-1);
    }
    printf("Block size = %d, extend range = %d\n",block_size,extend);
    hist=lk_malloc(sizeof(u_int64_t)*(MAX_COUNT+1));
    if(target_file) thist=lk_malloc(sizeof(u_int64_t)*(MAX_COUNT+1));
    else thist=0;
    lkc=init_compress();
    err=read_ranges_file(ranges_file,&contigs,lkc);
    if(!err && target_file) err=read_target_file(target_file,contigs,extend,lkc);
    nthr=(int)sysconf(_SC_NPROCESSORS_ONLN);
    input_files=argv;
    input_idx=optind;
    n_input_files=argc;
    if(!nthr) nthr=1;
    read_threads=malloc(sizeof(pthread_t)*nthr);
    if(combine) {
        tp.ctg=contigs;
        tp.lkc=lkc;
        for(i=0; i<nthr; i++) {
            if((j=pthread_create(read_threads+i,NULL,read_det_cov,&tp))) abt(__FILE__,__LINE__,"Thread creation %d failed: %d\n",i+1,j);
        }
        for(i=0; i<nthr; i++) pthread_join(read_threads[i],NULL);
    } else {
        for(i=optind; !err && i<argc; i++) {
            err=process_file(argv[i],contigs,block_size,format,&number,lkc);
        }
    }
    printf("Generating histogram\n");
    filter=suffix=0;
    if(lkc->default_compress<COMPRESS_NONE) {
        i=lkc->default_compress;
        filter=lkc->comp_path[i][i==COMPRESS_ZIP?1:0];
        suffix=lkc->compress_suffix[i];
    }
    tn=0;
    if(prefix) {
        asprintf(&tn,"%s_contig_summ.txt",prefix);
        assert(tn);
        ctg_fptr=fopen(tn,"w");
        free(tn);
    } else ctg_fptr=fopen("contig_summ.txt","w");
    if(target_file) {
        for(i=0; i<=MAX_COUNT; i++) hist[i]=thist[i]=0;
        for(ctg=contigs; ctg; ctg=ctg->hh.next) {
            ct=ctg->counts;
            for(i=0; i<(int)ctg->size; i+=block_size) {
                cc=ct[i];
                if(cc<=MAX_COUNT) {
                    hist[cc]++;
                    ctg->tot_count+=cc;
                }
            }
            ct=ctg->tcounts;
            for(i=0; i<(int)ctg->tsize; i+=block_size) {
                cc=ct[i];
                if(cc<=MAX_COUNT) {
                    thist[cc]++;
                    ctg->tot_tcount+=cc;
                }
            }
            if(ctg_fptr) {
                fprintf(ctg_fptr,"%s\t%u\t%"PRIu64"\t%g",ctg->name,ctg->tot_bases,ctg->tot_count,(double)ctg->tot_count/(double)ctg->tot_bases);
                fprintf(ctg_fptr,"\t%u\t%"PRIu64"\t%g\n",ctg->tot_tbases,ctg->tot_tcount,ctg->tot_tbases?(double)ctg->tot_tcount/(double)ctg->tot_tbases:0.0);
            }
        }
        if(ctg_fptr) fclose(ctg_fptr);
        nn=tnn=0;
        for(i=0; i<=MAX_COUNT; i++) {
            nn+=hist[i];
            tnn+=thist[i];
        }
        kk=tkk=0;
        ofptr=fopen(output_file,"w");
        if(!ofptr) ofptr=stdout;
        for(i=0; i<=MAX_COUNT; i++) {
            kk+=hist[i];
            tkk+=thist[i];
            fprintf(ofptr,"%d\t%"PRIu64"\t%g\t%g\t",i,hist[i],(double)hist[i]/(double)nn,(double)kk/(double)nn);
            fprintf(ofptr,"%"PRIu64"\t%g\t%g\n",thist[i],(double)thist[i]/(double)tnn,(double)tkk/(double)tnn);
        }
        if(ofptr!=stdout) fclose(ofptr);
    } else {
        for(i=0; i<=MAX_COUNT; i++) hist[i]=0;
        for(ctg=contigs; ctg; ctg=ctg->hh.next) {
            ct=ctg->counts;
            for(i=0; i<(int)ctg->size; i+=block_size) {
                cc=ct[i];
                if(cc<=MAX_COUNT) {
                    hist[cc]++;
                    ctg->tot_count+=cc;
                }
            }
            if(ctg_fptr) {
                fprintf(ctg_fptr,"%s\t%u\t%"PRIu64"\t%g\n",ctg->name,ctg->tot_bases,ctg->tot_count,(double)ctg->tot_count/(double)ctg->tot_bases);
            }
        }
        if(ctg_fptr) fclose(ctg_fptr);
        nn=0;
        for(i=0; i<=MAX_COUNT; i++) nn+=hist[i];
        kk=0;
        ofptr=fopen(output_file,"w");
        if(!ofptr) ofptr=stdout;
        for(i=0; i<=MAX_COUNT; i++) {
            kk+=hist[i];
            fprintf(ofptr,"%d\t%"PRIu64"\t%g\t%g\n",i,hist[i],(double)hist[i]/(double)nn,(double)kk/(double)nn);
        }
        if(ofptr!=stdout) fclose(ofptr);
    }
    if(detail) {
        tn=0;
        ofptr=0;
        if(filter && suffix) {
            asprintf(&tn,"detailed_coverage.txt.%s",suffix);
            if(tn) {
                i=child_open(WRITE,tn,filter);
                ofptr=fdopen(i,"w");
            }
        }
        if(!ofptr) ofptr=fopen("detailed_coverage.txt","w");
        if(!ofptr) ofptr=stdout;
        printf("Writing detailed coverage information\n");
        for(ctg=contigs; ctg; ctg=ctg->hh.next) {
            k=0;
            ct=ctg->counts;
            /*      ct1=ctg->tcounts;*/
            for(r=ctg->ranges; r; r=r->next) {
                for(i=0; i<r->idx; i++) {
                    if(!k++) fprintf(ofptr,"*%s\t%x\n",ctg->name,r->x1[i]);
                    else fprintf(ofptr,"*\t%x\n",r->x1[i]);
                    out_cnt=0;
                    for(x=r->x1[i]; x<=r->x2[i]; x++) {
                        cbuf[out_cnt++]=ct[x-1];
                        if(out_cnt==OUT_WIDTH) {
                            out_cnt=write_cbuf(cbuf,out_cnt,ofptr);
                        }
                    }
                    while(out_cnt) out_cnt=write_cbuf(cbuf,out_cnt,ofptr);
                }
            }
        }
        if(ofptr!=stdout) {
            fclose(ofptr);
            if(tn) {
                free(tn);
                while(waitpid(-1,&i,WNOHANG)>0);
            }
        }
    }
    return err;
}