⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcbmttest.c

📁 Tokyo Cabinet的Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符
💻 C
📖 第 1 页 / 共 4 页
字号:
      break;    case 13:      if(id == 0) iputchar('D');      if(!tcbdbget3(bdb, kbuf, ksiz, &vsiz) && tcbdbecode(bdb) != TCENOREC){        eprint(bdb, "tcbdbget3");        err = true;      }      break;    case 14:      if(id == 0) iputchar('E');      if(myrand(rnum / 50) == 0){        switch(myrand(5)){        case 0:          if(!tcbdbcurfirst(cur) && tcbdbecode(bdb) != TCENOREC){            eprint(bdb, "tcbdbcurfirst");            err = true;          }          break;        case 1:          if(!tcbdbcurlast(cur) && tcbdbecode(bdb) != TCENOREC){            eprint(bdb, "tcbdbcurlast");            err = true;          }          break;        default:          if(!tcbdbcurjump(cur, kbuf, ksiz) && tcbdbecode(bdb) != TCENOREC){            eprint(bdb, "tcbdbcurjump");            err = true;          }          break;        }      }      TCXSTR *ikey = tcxstrnew();      TCXSTR *ival = tcxstrnew();      for(int j = myrand(rnum) / 1000 + 1; j >= 0; j--){        if(j % 3 == 0){          if(!tcbdbcurrec(cur, ikey, ival)){            int ecode = tcbdbecode(bdb);            if(ecode != TCEINVALID && ecode != TCENOREC){              eprint(bdb, "tcbdbcurrec");              err = true;            }          }        } else {          int iksiz;          if(!tcbdbcurkey3(cur, &iksiz)){            int ecode = tcbdbecode(bdb);            if(ecode != TCEINVALID && ecode != TCENOREC){              eprint(bdb, "tcbdbcurkey3");              err = true;            }          }        }        if(myrand(5) == 0){          if(!tcbdbcurprev(cur)){            int ecode = tcbdbecode(bdb);            if(ecode != TCEINVALID && ecode != TCENOREC){              eprint(bdb, "tcbdbcurprev");              err = true;            }          }        } else {          if(!tcbdbcurnext(cur)){            int ecode = tcbdbecode(bdb);            if(ecode != TCEINVALID && ecode != TCENOREC){              eprint(bdb, "tcbdbcurnext");              err = true;            }          }        }      }      tcxstrdel(ival);      tcxstrdel(ikey);      break;    default:      if(id == 0) iputchar('@');      if(tcbdbtranbegin(bdb)){        if(myrand(2) == 0){          if(!tcbdbput(bdb, kbuf, ksiz, vbuf, vsiz)){            eprint(bdb, "tcbdbput");            err = true;          }          if(!nc) tcmapput(map, kbuf, ksiz, vbuf, vsiz);        } else {          if(!tcbdbout(bdb, kbuf, ksiz) && tcbdbecode(bdb) != TCENOREC){            eprint(bdb, "tcbdbout");            err = true;          }          if(!nc) tcmapout(map, kbuf, ksiz);        }        if(nc && myrand(2) == 0){          if(!tcbdbtranabort(bdb)){            eprint(bdb, "tcbdbtranabort");            err = true;          }        } else {          if(!tcbdbtrancommit(bdb)){            eprint(bdb, "tcbdbtrancommit");            err = true;          }        }      } else {        eprint(bdb, "tcbdbtranbegin");        err = true;      }      if(myrand(1000) == 0){        if(!tcbdbforeach(bdb, iterfunc, NULL)){          eprint(bdb, "tcbdbforeach");          err = true;        }      }      if(myrand(10000) == 0) srand((unsigned int)(tctime() * 1000) % UINT_MAX);      break;    }    if(!nc) tcglobalmutexunlock();    if(id == 0){      if(i % 50 == 0) iprintf(" (%08d)\n", i);      if(id == 0 && i == rnum / 4){        if(!tcbdboptimize(bdb, -1, -1, -1, -1, -1, -1) && tcbdbecode(bdb) != TCEINVALID){          eprint(bdb, "tcbdboptimize");          err = true;        }        if(!tcbdbcurfirst(cur) && tcbdbecode(bdb) != TCENOREC){          eprint(bdb, "tcbdbcurfirst");          err = true;        }      }    }  }  tcbdbcurdel(cur);  return err ? "error" : NULL;}/* thread the typical function */static void *threadtypical(void *targ){  TCBDB *bdb = ((TARGTYPICAL *)targ)->bdb;  int rnum = ((TARGTYPICAL *)targ)->rnum;  bool nc = ((TARGTYPICAL *)targ)->nc;  int rratio = ((TARGTYPICAL *)targ)->rratio;  int id = ((TARGTYPICAL *)targ)->id;  bool err = false;  TCMAP *map = (!nc && id == 0) ? tcmapnew2(rnum + 1) : NULL;  int base = id * rnum;  int mrange = tclmax(50 + rratio, 100);  BDBCUR *cur = tcbdbcurnew(bdb);  for(int i = 1; !err && i <= rnum; i++){    char buf[RECBUFSIZ];    int len = sprintf(buf, "%08d", base + myrandnd(i));    int rnd = myrand(mrange);    if(rnd < 10){      if(!tcbdbput(bdb, buf, len, buf, len)){        eprint(bdb, "tcbdbput");        err = true;      }      if(map) tcmapput(map, buf, len, buf, len);    } else if(rnd < 15){      if(!tcbdbputkeep(bdb, buf, len, buf, len) && tcbdbecode(bdb) != TCEKEEP){        eprint(bdb, "tcbdbputkeep");        err = true;      }      if(map) tcmapputkeep(map, buf, len, buf, len);    } else if(rnd < 20){      if(!tcbdbputcat(bdb, buf, len, buf, len)){        eprint(bdb, "tcbdbputcat");        err = true;      }      if(map) tcmapputcat(map, buf, len, buf, len);    } else if(rnd < 25){      if(!tcbdbout(bdb, buf, len) && tcbdbecode(bdb) && tcbdbecode(bdb) != TCENOREC){        eprint(bdb, "tcbdbout");        err = true;      }      if(map) tcmapout(map, buf, len);    } else if(rnd < 27){      switch(myrand(3)){      case 0:        if(!tcbdbcurfirst(cur) && tcbdbecode(bdb) != TCENOREC){          eprint(bdb, "tcbdbcurfirst");          err = true;        }        for(int j = 0; !err && j < 10; j++){          int ksiz;          char *kbuf = tcbdbcurkey(cur, &ksiz);          if(kbuf){            int vsiz;            char *vbuf = tcbdbcurval(cur, &vsiz);            if(vbuf){              tcfree(vbuf);            } else if(tcbdbecode(bdb) != TCENOREC){              eprint(bdb, "tcbdbcurval");              err = true;            }            tcfree(kbuf);          } else if(tcbdbecode(bdb) != TCENOREC){            eprint(bdb, "tcbdbcurkey");            err = true;          }          tcbdbcurnext(cur);        }        break;      case 1:        if(!tcbdbcurlast(cur) && tcbdbecode(bdb) != TCENOREC){          eprint(bdb, "tcbdbcurlast");          err = true;        }        for(int j = 0; !err && j < 10; j++){          int ksiz;          char *kbuf = tcbdbcurkey(cur, &ksiz);          if(kbuf){            int vsiz;            char *vbuf = tcbdbcurval(cur, &vsiz);            if(vbuf){              tcfree(vbuf);            } else if(tcbdbecode(bdb) != TCENOREC){              eprint(bdb, "tcbdbcurval");              err = true;            }            tcfree(kbuf);          } else if(tcbdbecode(bdb) != TCENOREC){            eprint(bdb, "tcbdbcurkey");            err = true;          }          tcbdbcurprev(cur);        }        break;      case 2:        if(!tcbdbcurjump(cur, buf, len) && tcbdbecode(bdb) != TCENOREC){          eprint(bdb, "tcbdbcurjump");          err = true;        }        for(int j = 0; !err && j < 10; j++){          int ksiz;          char *kbuf = tcbdbcurkey(cur, &ksiz);          if(kbuf){            int vsiz;            char *vbuf = tcbdbcurval(cur, &vsiz);            if(vbuf){              tcfree(vbuf);            } else if(tcbdbecode(bdb) != TCENOREC){              eprint(bdb, "tcbdbcurval");              err = true;            }            tcfree(kbuf);          } else if(tcbdbecode(bdb) != TCENOREC){            eprint(bdb, "tcbdbcurkey");            err = true;          }          tcbdbcurnext(cur);        }        break;      }    } else {      int vsiz;      char *vbuf = tcbdbget(bdb, buf, len, &vsiz);      if(vbuf){        if(map){          int msiz;          const char *mbuf = tcmapget(map, buf, len, &msiz);          if(!mbuf || msiz != vsiz || memcmp(mbuf, vbuf, vsiz)){            eprint(bdb, "(validation)");            err = true;          }        }        tcfree(vbuf);      } else {        if(tcbdbecode(bdb) != TCENOREC){          eprint(bdb, "tcbdbget");          err = true;        }        if(map && tcmapget(map, buf, len, &vsiz)){          eprint(bdb, "(validation)");          err = true;        }      }    }    if(id == 0 && rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  tcbdbcurdel(cur);  if(map){    tcmapiterinit(map);    int ksiz;    const char *kbuf;    while(!err && (kbuf = tcmapiternext(map, &ksiz)) != NULL){      int vsiz;      char *vbuf = tcbdbget(bdb, kbuf, ksiz, &vsiz);      if(vbuf){        int msiz;        const char *mbuf = tcmapget(map, kbuf, ksiz, &msiz);        if(!mbuf || msiz != vsiz || memcmp(mbuf, vbuf, vsiz)){          eprint(bdb, "(validation)");          err = true;        }        tcfree(vbuf);      } else {        eprint(bdb, "(validation)");        err = true;      }    }    tcmapdel(map);  }  return err ? "error" : NULL;}/* thread the race function */static void *threadrace(void *targ){  TCBDB *bdb = ((TARGRACE *)targ)->bdb;  int rnum = ((TARGRACE *)targ)->rnum;  int id = ((TARGRACE *)targ)->id;  bool err = false;  int mid = rnum * 2;  for(int i = 1; !err && i <= rnum; i++){    char buf[RECBUFSIZ];    int len = sprintf(buf, "%d", myrandnd(i));    int rnd = myrand(100);    if(rnd < 10){      if(!tcbdbputkeep(bdb, buf, len, buf, len) && tcbdbecode(bdb) != TCEKEEP){        eprint(bdb, "tcbdbputkeep");        err = true;      }    } else if(rnd < 20){      if(!tcbdbputcat(bdb, buf, len, buf, len)){        eprint(bdb, "tcbdbputcat");        err = true;      }    } else if(rnd < 30){      if(!tcbdbputdup(bdb, buf, len, buf, len)){        eprint(bdb, "tcbdbputdup");        err = true;      }    } else if(rnd < 40){      if(!tcbdbputdupback(bdb, buf, len, buf, len)){        eprint(bdb, "tcbdbputdupback");        err = true;      }    } else if(rnd < 50){      if(!tcbdbout(bdb, buf, len) && tcbdbecode(bdb) != TCENOREC){        eprint(bdb, "tcbdbout");        err = true;      }    } else {      if(myrand(10) == 0){        int rsiz = myrand(1024);        char *rbuf = tcmalloc(rsiz + 1);        for(int j = 0; j < rsiz; j++){          rbuf[j] = myrand('z' - 'a') + 'a';        }        if(myrand(2) == 0){          if(!tcbdbput(bdb, buf, len, rbuf, rsiz)){            eprint(bdb, "tcbdbputcat");            err = true;          }        } else {          if(!tcbdbputcat(bdb, buf, len, rbuf, rsiz)){            eprint(bdb, "tcbdbputcat");            err = true;          }        }        tcfree(rbuf);      } else {        if(!tcbdbput(bdb, buf, len, buf, len)){          eprint(bdb, "tcbdbput");          err = true;        }      }    }    if(id == 0){      if(myrand(mid) == 0){        iprintf("[v]");        if(!tcbdbvanish(bdb)){          eprint(bdb, "tcbdbvanish");          err = true;        }      }      if(myrand(mid) == 0){        iprintf("[o]");        if(!tcbdboptimize(bdb, -1, -1, myrand(rnum) + 1, myrand(10), myrand(10), 0)){          eprint(bdb, "tcbdbvanish");          err = true;        }      }      if(myrand(mid) == 0){        iprintf("[i]");        BDBCUR *cur = tcbdbcurnew(bdb);        if(!tcbdbcurfirst(cur) && tcbdbecode(bdb) != TCENOREC){          eprint(bdb, "tcbdbcurfirst");          err = true;        }        char *kbuf;        int ksiz;        while((kbuf = tcbdbcurkey(cur, &ksiz)) != NULL){          int vsiz;          char *vbuf = tcbdbcurval(cur, &vsiz);          if(vbuf){            tcfree(vbuf);          } else if(tcbdbecode(bdb) != TCENOREC){            eprint(bdb, "tcbdbget");            err = true;          }          tcfree(kbuf);          tcbdbcurnext(cur);        }        if(tcbdbecode(bdb) != TCENOREC){          eprint(bdb, "(validation)");          err = true;        }        tcbdbcurdel(cur);      }      if(rnum > 250 && i % (rnum / 250) == 0){        iputchar('.');        if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);      }    }  }  return err ? "error" : NULL;}// END OF FILE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -