Exemple #1
0
/*
 * 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);
}
Exemple #2
0
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);
}
Exemple #4
0
/*
 * 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));
}