testdlist.cc

来自「Coda分布式文件系统源代码。其特色在于可以支持离线文件操作以及在线后的自动更新」· CC 代码 · 共 193 行

CC
193
字号
#ifdef __cplusplusextern "C" {#endif __cplusplus#include "coda_assert.h"#include <stdio.h>#include <struct.h>#ifdef __cplusplus}#endif __cplusplus#include <dlist.h>#include <vcrcommon.h>#include "tallyent.h"#ifdef TESTING#define LOG(level, stmt)	printf stmt#endif /* TESTING *//* List of tallyents sorted by <priority, vuid> */dlist *TallyList;tallyent::tallyent(int p, vuid_t v, int b, TallyStatus s) {    priority = p;    vuid = v;    incomplete = 0;    switch(s) {      case TSavailable:	available_blocks = b;        break;      case TSunavailable:	unavailable_blocks = b;	break;      case TSunknown:	incomplete = 1;        break;      default:        CODA_ASSERT(1 == 0);        break;    }}tallyent::tallyent(tallyent&) {    abort();}tallyent::operator=(tallyent& i) {    abort();    return(0);}tallyent::~tallyent() {    CODA_ASSERT(TallyList != NULL);    TallyList->remove(&prioq_handle);}int tallyentPriorityFN(dlink *d1, dlink *d2) {  tallyent *t1, *t2;  CODA_ASSERT(d1 != NULL);  CODA_ASSERT(d2 != NULL);  t1 = strbase(tallyent, d1, prioq_handle);  t2 = strbase(tallyent, d2, prioq_handle);  CODA_ASSERT(t1 != NULL);  CODA_ASSERT(t2 != NULL);  if (t1->priority == t2->priority) {    if (t1->vuid == t2->vuid)      return(0);    else if (t1->vuid > t2->vuid)      return(1);    else       return(-1);  } else if (t1->priority > t2->priority)    return(1);  else    return(-1);}void InitTally() {  TallyList = new dlist(tallyentPriorityFN);}dlink *Find(int priority, vuid_t vuid) {  dlist_iterator next(*TallyList);  dlink *d;  while (d = next()) {    tallyent *te = strbase(tallyent, d, prioq_handle);    if ((te->priority == priority) && (te->vuid == vuid)) return(d);  }  return(0);}void Tally(int priority, vuid_t vuid, int blocks, TallyStatus status) {  tallyent *te;  dlink *d;  LOG(100, ("Tally: priority=%d, vuid=%d, blocks=%d, status=%d\n", 	 priority, (int)vuid, blocks, (int)status));  CODA_ASSERT(TallyList != NULL);  d = Find(priority, vuid);  if (d != NULL) {    te = strbase(tallyent, d, prioq_handle);    CODA_ASSERT(te != NULL);    CODA_ASSERT(te->priority == priority);    CODA_ASSERT(te->vuid == vuid);    switch(status) {      case TSavailable:        te->available_blocks += blocks;        break;      case TSunavailable:        te->unavailable_blocks += blocks;        break;      case TSunknown:        te->incomplete = 1;        break;      default:        CODA_ASSERT(1 == 0);        break;    }    LOG(100, ("tallyent::tallyent: updated <priority=%d, vuid=%d>\n", priority, (int)vuid));  } else {    te = new tallyent(priority, vuid, blocks, status);    TallyList->insert(&(te->prioq_handle));    LOG(100, ("tallyent::tallyent: inserted <priority=%d, vuid=%d>\n", priority, (int)vuid));  }}void Print(vuid_t vuid) {  LOG(0, ("\n\nTally for vuid=%d:\n", (int)vuid));  dlist_iterator next(*TallyList);  dlink *d;  while (d = next()) {    tallyent *te = strbase(tallyent, d, prioq_handle);    CODA_ASSERT(te != NULL);    if (te->vuid != vuid) continue;    float percent_available;    percent_available = (float)te->available_blocks / (float)(te->available_blocks + te->unavailable_blocks);     LOG(0, ("\tPriority=%d: Available=%d Unavailable=%d PercentAvailable=%f Unknown=%d\n",	   te->priority, te->available_blocks, te->unavailable_blocks, 	   percent_available, te->incomplete));  }}#ifdef TESTINGint main(int argc, char *argv[]) {  InitTally();  Tally(1000, 2660, 10, TSavailable);  Tally(1000, 2660, 20, TSavailable);  Tally(1000, 2660, 1000, TSavailable);  Tally(900, 2660, 20, TSunavailable);  Tally(900, 2660, 30, TSavailable);  Tally(900, 2660, 40, TSavailable);  Tally(900, 2660, 20, TSunavailable);  Tally(825, 2660, 50, TSunavailable);  Tally(850, 2660, 50, TSavailable);  Tally(875, 2660, 30, TSunknown);  Tally(1000, 2208, 400, TSavailable);  Tally(1000, 2208, 400, TSunavailable);  Tally(700, 2208, 234, TSavailable);  Tally(700, 2208, 345, TSavailable);  Tally(700, 2208, 567, TSunavailable);    Print(2660);  Print(2208);}#endif /* TESTING */

⌨️ 快捷键说明

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