/* * Read in the block, like bread, but also start I/O on the * read-ahead block (which is not allocated to the caller). */ struct buf * breada(dev_t dev, daddr_t blkno, daddr_t rablkno, long bsize) { struct buf *bp, *rabp; klwp_t *lwp = ttolwp(curthread); bp = NULL; if (!bio_incore(dev, blkno)) { CPU_STATS_ADD_K(sys, lread, 1); bp = GETBLK(dev, blkno, bsize); if ((bp->b_flags & B_DONE) == 0) { bp->b_flags |= B_READ; bp->b_bcount = bsize; (void) bdev_strategy(bp); if (lwp != NULL) lwp->lwp_ru.inblock++; CPU_STATS_ADD_K(sys, bread, 1); } } if (rablkno && bfreelist.b_bcount > 1 && !bio_incore(dev, rablkno)) { rabp = GETBLK(dev, rablkno, bsize); if (rabp->b_flags & B_DONE) brelse(rabp); else { rabp->b_flags |= B_READ|B_ASYNC; rabp->b_bcount = bsize; (void) bdev_strategy(rabp); if (lwp != NULL) lwp->lwp_ru.inblock++; CPU_STATS_ADD_K(sys, bread, 1); } } if (bp == NULL) return (BREAD(dev, blkno, bsize)); (void) biowait(bp); return (bp); }
int EGC_recv(int src, char* buf, int bufsize){ p_commhdr *shdr; p_msginfo head; // char* ge; char* pbuf; char* minfo = (char*)&head; // char wsbuf[MAX_EGC_KEYVALUE_SIZE]; int psize = bufsize, tsize = 0, rv; shdr = PEGC_comm_gethdr_w_uid(src, id, &intracomm); if(shdr == NULL){ shdr = PEGC_comm_newhdr_blank(mode); shdr->minfo.srcid = src; shdr->minfo.destid = id; shdr->minfo.messageid = 0; shdr->minfo.flags = 0; shdr->minfo.nbytes = 0; switch (mode){ case EGC_COMM_MODE_FILE: shdr->mbuf = shdr->call->bufalloc(pktsize); // sprintf(wsbuf, "EGC_INTRA_HOST_DATAPATH%d", jid); // ge = PEGCU_get_confwithid("EGC_INTRA_HOST_DATAPATH", EGC_MYJOBID); // sprintf(shdr->addr.name, FMT_EGC_INTRSD, ge, src, id); // shdr->addr.portfile=PEGCU_get_confwithid("EGC_INTRA_HOST_DATAPATH", EGC_MYJOBID); shdr->addr.portfile=NULL; shdr->call->adhoc_open_minfo(shdr); //ONGOING(0):ここから読み出しチェックの続行 break; case EGC_COMM_MODE_SOCKET: ERRORF("not implemented\n"); assert(0); break; default: ERRORF("EGC: unexpected intra comm mode\n"); ERROR_EXIT(); } PEGC_comm_addhdrchain(shdr, &intracomm); } DEBUGF(DEBUG_LEVEL_INFO, "INFO: expected data size %d\n", psize); for(pbuf = buf; psize > 0; pbuf += ctnsize){ DEBUGF(DEBUG_LEVEL_INFO, "INFO: expected data size %d\n", psize); // lseek(shdr->fd, shdr->minfo.nbytes, SEEK_SET); rv = BREAD(shdr->fd, minfo, sizeof(p_msginfo)); if(head.nbytes > bufsize){ ERRORF("EGC_recv: buffer is too small. it needs %d bytes\n", head.nbytes); ERROR_EXIT(); } // lseek(shdr->fd, shdr->minfo.nbytes+sizeof(p_msginfo), SEEK_SET); // test code /* int i; for(i = 0; i<5; i++){ fprintf(stderr, "%d\n", ((int*)minfo)[i]); } */ DEBUGF(DEBUG_LEVEL_INFO, "INFO:Read buf(%p) to %p\n", buf, pbuf); if(head.nbytes >= ctnsize){ rv = BREAD(shdr->fd, pbuf, ctnsize); }else{ rv = BREAD(shdr->fd, pbuf, head.nbytes); rv = BREAD(shdr->fd, trashbuf, ctnsize-head.nbytes); break; } // test code // int i; // for(i = 0; i< ctnsize/sizeof(int); i++){ // fprintf(stderr, "%d\n", ((int*)pbuf)[i]); // } tsize += head.nbytes; psize -= ctnsize; } shdr->minfo.nbytes += psize; return tsize; }
int hapsLocalLocus::read(FILE *fp) { if (localLocus::read(fp)==0) return 0; BREAD(rsName,fp); }
/* * Read in (if necessary) the block and return a buffer pointer. * * This interface is provided for binary compatibility. Using * BREAD() directly avoids the extra function call overhead invoked * by calling this routine. */ struct buf * bread(dev_t dev, daddr_t blkno, long bsize) { return (BREAD(dev, blkno, bsize)); }