//截断一个文件,只能截断读缓存中的文件,因为只有这种文件是可写的 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; }
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); }
/* * 同步一个文件,如果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; }
/* * 写文件,只有本地的文件才可以写,已经传到服务器上的就不能写了 * */ 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; }
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]; }
/* 遍历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); } }
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; } }
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() ); } }