Exemplo n.º 1
0
//截断一个文件,只能截断读缓存中的文件,因为只有这种文件是可写的
int baiduapi_truncate(const char * path, off_t offset) {
    filedec *f = getfcache(path);

    if (f) {
        if ((f->flags & DELETE) || (f->type == forread)) {
            pthread_mutex_unlock(&f->lock);
            return -EACCES;
        }
        
        f->flags &= ~SYNCED;
        if (f->flags & TRANSF) {
            f->flags |= REOPEN;
        }
        pthread_mutex_unlock(&f->lock);
        int oc = GetWriteBlkNo(f->lengh); //原来的块数
        int nc = GetWriteBlkNo(offset);   //扩展后的块数
        if (offset > f->lengh) {      //文件长度被扩展
            if (oc && GETD(f->cache.w.flags, oc) == 0) {
                sem_wait(&wcache);                                           //不能有太多的block没有同步
            }
            pthread_mutex_lock(&f->lock);
            SETD(f->cache.w.flags, oc);
            if (f->cache.w.taskid[oc]) {
                SETR(f->cache.w.flags, oc);
            }
            for(int i=oc+1; i<=nc; ++i){
                SETZ(f->cache.w.flags, i);
            }
        }else{
            if (nc && GETD(f->cache.w.flags, nc) == 0) {
                sem_wait(&wcache);                                           //不能有太多的block没有同步
            }
            pthread_mutex_lock(&f->lock);
            SETD(f->cache.w.flags, nc);
            if (f->cache.w.taskid[nc]) {
                SETR(f->cache.w.flags, nc);
            }
            for(int i=nc+1; i<=oc; ++i){
                CLRA(f->cache.w.flags, i);
            }
        }
        int ret = ftruncate(f->file, offset);
        if(ret) {
            pthread_mutex_unlock(&f->lock);
            return ret;
        }

        f->lengh = offset;
        pthread_mutex_unlock(&f->lock);
        return 0;
    }
    return -EACCES;
}
Exemplo n.º 2
0
int64 stream_in_module(FILE *fp)
{
	int64 count=0;
	MODULE *m;

	while (GETBT && B(MODULE) && T(BEGIN))
	{
		char name[1024]; 
		memset(name,0,sizeof(name));
		OK;
		while (GETBT && B(MODULE) && !T(END))
		{
			OK;
			if T(NAME) 
			{
				GETD(name,sizeof(name));
				m = module_load(name,0,NULL);
				if (m==NULL)
					return stream_error("module %s version is not found", name);
			}
			else if T(VERSION) 
			{
				unsigned short major, minor;
				GETS(major);
				GETS(minor);
				if (m->major!=major || m->minor!=minor)
					return stream_error("module %s version %d.%02d specified does not match version %d.%02d found", name, major, minor, m->major, m->minor);
			}
			else
				stream_warning("ignoring token %d in module stream", t);
		}
Exemplo n.º 3
0
/*
 * 同步一个文件,如果flag被置位的话就等直到这些文件真的被同步成功
 * 否则只是添加一个任务,然后结果什么样就不管了
 * 说实话,我并不知道这个flag原来实际上是什么用……
 */
int baiduapi_fsync(const char *path, int flag, struct fuse_file_info *fi)
{
    if (fi->fh) {
        int i ;
        filedec *f = (filedec *) fi->fh;
        switch (f->type) {
        case forread:
            break;
        case forwrite:
            pthread_mutex_lock(&f->lock);
            for (i = 0; i <= GetWriteBlkNo(f->lengh); ++i) {
                if ((f->cache.w.taskid[i] == 0) && 
                    (GETD(f->cache.w.flags, i) || GETZ(f->cache.w.flags, i))) {
                    block *b = malloc(sizeof(block));
                    b->bno = i;
                    b->fd = f;
                    f->cache.w.taskid[i] = addtask((taskfunc) uploadblock, b, 0);
                }
            }
            pthread_mutex_unlock(&f->lock);
            if (flag) {
                int done = 0;
                while (!done) {
                    done = 1;
                    for (i = 0; i <= GetWriteBlkNo(f->lengh); ++i) {
                        if (f->cache.w.taskid[i]) {
                            waittask(f->cache.w.taskid[i]);
                        }
                        if (GETD(f->cache.w.flags, i) || GETZ(f->cache.w.flags, i)) {
                            pthread_mutex_lock(&f->lock);
                            block *b = malloc(sizeof(block));
                            b->bno = i;
                            b->fd =  f;
                            f->cache.w.taskid[i] = addtask((taskfunc) uploadblock, b, 0);
                            pthread_mutex_unlock(&f->lock);
                            done = 0;
                        }
                    };

                }
            }
            break;
        }
    }

    return 0;
}
Exemplo n.º 4
0
/*
 * 写文件,只有本地的文件才可以写,已经传到服务器上的就不能写了
 *
 */
int baiduapi_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi)
{

    filedec *f = (filedec *) fi->fh;
    int c = GetWriteBlkNo(offset);   //计算一下在哪个块
    int len = Min(size, GetWriteBlkEndPointFromP(offset) - offset);      //计算最长能写入的字节
    switch (f->type) {

    case forread:
        errno = EBADF;
        return -EBADF;

    case forwrite:
        if(offset > f->lengh) {
            baiduapi_truncate(f->path, offset);
        }
        if (c && GETD(f->cache.w.flags, c) == 0) {
            sem_wait(&wcache);                                           //不能有太多的block没有同步
        }
        pthread_mutex_lock(&f->lock);
        f->flags &= ~SYNCED;
        lseek(f->file, offset, SEEK_SET);
        size_t ret = write(f->file,buf, len);
        SETD(f->cache.w.flags, c);
        if (f->cache.w.taskid[c]) {
            SETR(f->cache.w.flags, c);
        }
        pthread_mutex_unlock(&f->lock);

        if (ret != len) {                   //写入出错
            return ret;
        }

        if (ret + offset > f->lengh) {      //文件长度被扩展
            f->lengh = ret + offset;
        }

        if (len < size) {                   //需要写入下一个block
            int tmp = baiduapi_write(f->path, buf + len, size - len, offset + len, fi);
            if (tmp < 0) {                  //调用出错
                return tmp;
            } else {
                ret += tmp;
            }
        }

        return ret;
    }

    errno = EPERM;
    return -errno;
}
Exemplo n.º 5
0
int agc_naive(char *s1, char *s2, int r1, int r2, int c1, int c2) {
    // fprintf(stderr, "[1] r1: %d, r2: %d, c1: %d, c2: %d\n", r1, r2, c1, c2);
    for (; r1 < r2 + 1; ++r1) {
        // fprintf(stderr, "R1: %d\n", r1);
        for(int c = c1; c < c2 + 1; ++c) {
            // fprintf(stderr, "(r1, c1) == (%d, %d)\n", r1, c1);
            GETD(s1, s2, r1, c);
            GETI(s1, s2, r1, c);
            GETG(s1, s2, r1, c);
        }
    }
    // fprintf(stderr, "[2] r1: %d, r2: %d, c1: %d, c2: %d\n", r1, r2, c1, c2);
    return G[r2][c2];
}
Exemplo n.º 6
0
/* 遍历fcache的处理函数
 * 如果文件已经被释放,则同步该文件
 * 否则:
 * 对于写缓存:已经同步完的block取回结果
 * 写满的脏block,上传该block
 * 对于同步完有段时间的和被标记删除的,则删除该缓存
 */
void handlefcache(filedec *f)
{
    size_t i;
    if (pthread_mutex_trylock(&f->lock) == 0) {
        if (f->flags == 0) {                       //如果该文件未被同步,未在同步,未被标记删除
            if (f->count == 0) {                    //文件已被关闭
                f->flags |= TRANSF;
                addtask((taskfunc)fcachesync, f, 0);
            } else {
                switch (f->type) {
                case forread:
                    break;
                case forwrite:
                    for (i = 0; i < GetWriteBlkNo(f->lengh); ++i) {
                        if (f->cache.w.taskid[i] == 0 &&
                            GETD(f->cache.w.flags, i))              //如果这个block是脏的那么加个上传任务
                        {
                            block *b = (block *)malloc(sizeof(block));
                            b->bno = i;
                            b->fd = f;
                            f->cache.w.taskid[i] = addtask((taskfunc) uploadblock, b, 0);
                        }
                    }
                    break;
                }
            }
        } else if (f->count == 0) {
            if((f->flags & SYNCED) &&
               (f->flags & DELETE) == 0 &&
               (time(NULL) - f->mtime > 60 * 10))                 //同步结束时间超过10分种
            {
                f->flags |= RELEASE;
                f->flags |= ONDELE;
                addtask((taskfunc)freefcache, f, 0);                             //释放它
            }else if ((f->flags & (DELETE | RELEASE))&&
                (f->flags & ONDELE) == 0)                      //删除被标记删除的项
            {
                f->flags |= ONDELE;
                addtask((taskfunc)freefcache, f, 0);
            }
        }
        pthread_mutex_unlock(&f->lock);
    }
}
Exemplo n.º 7
0
static void ALU( mb86233_state *cpustate, UINT32 alu)
{
	float	ftmp;

	switch(alu)
	{
		case 0x00:	/* NOP */
		break;

		case 0x01:	/* D = D & A */
			GETD().u &= GETA().u;
			FLAGSI(cpustate, GETD().u);
		break;

		case 0x02:	/* D = D | A */
			GETD().u |= GETA().u;
			FLAGSI(cpustate, GETD().u);
		break;

		case 0x03:	/* D = D ^ A */
			GETD().u ^= GETA().u;
			FLAGSI(cpustate, GETD().u);
		break;

		case 0x05:	/* CMP D,A */
			ftmp = GETD().f - GETA().f;
			FLAGSF(cpustate, ftmp);
			cpustate->icount--;
		break;

		case 0x06:	/* D = D + A */
			GETD().f += GETA().f;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x07:	/* D = D - A */
			GETD().f -= GETA().f;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x08:	/* P = A * B */
			GETP().f = GETA().f * GETB().f;
			cpustate->icount--;
		break;

		case 0x09:	/* D = D + P; P = A * B */
			GETD().f += GETP().f;
			GETP().f = GETA().f * GETB().f;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x0A:	/* D = D - P; P = A * B */
			GETD().f -= GETP().f;
			GETP().f = GETA().f * GETB().f;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x0B:	/* D = fabs(D) */
			GETD().f = fabs( GETD().f );
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x0C:	/* D = D + P */
			GETD().f += GETP().f;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x0D:	/* D = P; P = A * B */
			GETD().f = GETP().f;
			GETP().f = GETA().f * GETB().f;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x0E:	/* D = float(D) */
			GETD().f = (float)GETD().i;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x0F:	/* D = int(D) */
			GETD().i = (INT32)GETD().f;
			FLAGSI(cpustate, GETD().u);
		break;

		case 0x10:	/* D = D / A */
			if ( GETA().u != 0 )
				GETD().f = GETD().f / GETA().f;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x11:	/* D = -D */
			GETD().f = -GETD().f;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x13:	/* D = A + B */
			GETD().f = GETA().f + GETB().f;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x14:	/* D = B - A */
			GETD().f = GETB().f - GETA().f;
			FLAGSF(cpustate, GETD().f);
			cpustate->icount--;
		break;

		case 0x16:	/* LSR D, SHIFT */
			GETD().u >>= GETSHIFT();
			FLAGSI(cpustate, GETD().u);
		break;

		case 0x17:	/* LSL D, SHIFT */
			GETD().u <<= GETSHIFT();
			FLAGSI(cpustate, GETD().u);
		break;

		case 0x18:	/* ASR D, SHIFT */
//          GETD().u = (GETD().u & 0x80000000) | (GETD().u >> GETSHIFT());
			GETD().i >>= GETSHIFT();
			FLAGSI(cpustate, GETD().u);
		break;

		case 0x1A:	/* D = D + A */
			GETD().i += GETA().i;
			FLAGSI(cpustate, GETD().u);
		break;

		case 0x1B:	/* D = D - A */
			GETD().i -= GETA().i;
			FLAGSI(cpustate, GETD().u);
		break;

		default:
			logerror( "TGP: Unknown ALU op %x at PC:%04x\n", alu, GETPC() );
		break;
	}
}
Exemplo n.º 8
0
void mb86233_cpu_device::ALU( UINT32 alu)
{
	float   ftmp;

	switch(alu)
	{
		case 0x00:  /* NOP */
		break;

		case 0x01:  /* D = D & A */
			GETD().u &= GETA().u;
			FLAGSI( GETD().u);
		break;

		case 0x02:  /* D = D | A */
			GETD().u |= GETA().u;
			FLAGSI( GETD().u);
		break;

		case 0x03:  /* D = D ^ A */
			GETD().u ^= GETA().u;
			FLAGSI( GETD().u);
		break;

		case 0x04:  /* D = D ~ A */
			GETD().u = ~GETA().u;
			FLAGSI( GETD().u);
		break;

		case 0x05:  /* CMP D,A */
			ftmp = GETD().f - GETA().f;
			FLAGSF( ftmp);
			m_icount--;
		break;

		case 0x06:  /* D = D + A */
			GETD().f += GETA().f;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x07:  /* D = D - A */
			GETD().f -= GETA().f;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x08:  /* P = A * B */
			GETP().f = GETA().f * GETB().f;
			m_icount--;
		break;

		case 0x09:  /* D = D + P; P = A * B */
			GETD().f += GETP().f;
			GETP().f = GETA().f * GETB().f;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x0A:  /* D = D - P; P = A * B */
			GETD().f -= GETP().f;
			GETP().f = GETA().f * GETB().f;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x0B:  /* D = fabs(D) */
			GETD().f = fabs( GETD().f );
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x0C:  /* D = D + P */
			GETD().f += GETP().f;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x0D:  /* D = P; P = A * B */
			GETD().f = GETP().f;
			GETP().f = GETA().f * GETB().f;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x0E:  /* D = float(D) */
			GETD().f = (float)GETD().i;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x0F:  /* D = int(D) */
			switch((m_fpucontrol>>1)&3)
			{
				//case 0: GETD().i = floor(GETD().f+0.5f); break;
				//case 1: GETD().i = ceil(GETD().f); break;
				case 2: GETD().i = floor(GETD().f); break; // Manx TT
				case 3: GETD().i = (INT32)GETD().f; break;
				default: popmessage("TGP uses D = int(D) with FPU control = %02x, contact MAMEdev",m_fpucontrol>>1); break;
			}

			FLAGSI( GETD().i);
		break;

		case 0x10:  /* D = D / A */
			if ( GETA().u != 0 )
				GETD().f = GETD().f / GETA().f;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x11:  /* D = -D */
			GETD().f = -GETD().f;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x13:  /* D = A + B */
			GETD().f = GETA().f + GETB().f;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x14:  /* D = B - A */
			GETD().f = GETB().f - GETA().f;
			FLAGSF( GETD().f);
			m_icount--;
		break;

		case 0x16:  /* LSR D, SHIFT */
			GETD().u >>= GETSHIFT();
			FLAGSI( GETD().u);
		break;

		case 0x17:  /* LSL D, SHIFT */
			GETD().u <<= GETSHIFT();
			FLAGSI( GETD().u);
		break;

		case 0x18:  /* ASR D, SHIFT */
//          GETD().u = (GETD().u & 0x80000000) | (GETD().u >> GETSHIFT());
			GETD().i >>= GETSHIFT();
			FLAGSI( GETD().u);
		break;

		case 0x1A:  /* D = D + A */
			GETD().i += GETA().i;
			FLAGSI( GETD().u);
		break;

		case 0x1B:  /* D = D - A */
			GETD().i -= GETA().i;
			FLAGSI( GETD().u);
		break;

		default:
			fatalerror( "TGP: Unknown ALU op %x at PC:%04x\n", alu, GETPC() );
	}
}