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

📄 rf_dagutils.c

📁 RAIDFrame是个非常好的磁盘阵列RAID仿真工具
💻 C
📖 第 1 页 / 共 4 页
字号:
}static RF_FreeList_t *rf_dagh_freelist;#define RF_MAX_FREE_DAGH 128#define RF_DAGH_INC       16#define RF_DAGH_INITIAL   32static void rf_ShutdownDAGs(ignored)  void  *ignored;{	RF_FREELIST_DESTROY(rf_dagh_freelist,next,(RF_DagHeader_t *));}int rf_ConfigureDAGs(listp)  RF_ShutdownList_t  **listp;{	int rc;	RF_FREELIST_CREATE(rf_dagh_freelist, RF_MAX_FREE_DAGH,		RF_DAGH_INC, sizeof(RF_DagHeader_t));	if (rf_dagh_freelist == NULL)		return(ENOMEM);	rc = rf_ShutdownCreate(listp, rf_ShutdownDAGs, NULL);	if (rc) {		RF_ERRORMSG3("Unable to add to shutdown list file %s line %d rc=%d\n",			__FILE__, __LINE__, rc);		rf_ShutdownDAGs(NULL);		return(rc);	}	RF_FREELIST_PRIME(rf_dagh_freelist, RF_DAGH_INITIAL,next,		(RF_DagHeader_t *));	return(0);}RF_DagHeader_t *rf_AllocDAGHeader(){	RF_DagHeader_t *dh;	RF_FREELIST_GET(rf_dagh_freelist,dh,next,(RF_DagHeader_t *));	if (dh) {		bzero((char *)dh, sizeof(RF_DagHeader_t));	}	return(dh);}void rf_FreeDAGHeader(RF_DagHeader_t *dh){	RF_FREELIST_FREE(rf_dagh_freelist,dh,next);}/* allocates a buffer big enough to hold the data described by pda */void *rf_AllocBuffer(  RF_Raid_t           *raidPtr,  RF_DagHeader_t      *dag_h,  RF_PhysDiskAddr_t   *pda,  RF_AllocListElem_t  *allocList){  char *p;  RF_MallocAndAdd(p, pda->numSector << raidPtr->logBytesPerSector,    (char *), allocList);  return((void *)p);}/****************************************************************************** * * debug routines * *****************************************************************************/char *rf_NodeStatusString(RF_DagNode_t *node){  switch (node->status) {    case rf_wait: return("wait");    case rf_fired: return("fired");    case rf_good: return("good");    case rf_bad: return("bad");    default: return("?");  }}void rf_PrintNodeInfoString(RF_DagNode_t *node){  RF_PhysDiskAddr_t *pda;  int (*df)() = node->doFunc;  int i, lk, unlk;  void *bufPtr;    if ((df==rf_DiskReadFunc) || (df==rf_DiskWriteFunc)      || (df==rf_DiskReadMirrorIdleFunc)      || (df == rf_DiskReadMirrorPartitionFunc))  {    pda = (RF_PhysDiskAddr_t *)node->params[0].p;    bufPtr = (void *)node->params[1].p;    lk = RF_EXTRACT_LOCK_FLAG(node->params[3].v);    unlk = RF_EXTRACT_UNLOCK_FLAG(node->params[3].v);    RF_ASSERT( !(lk && unlk) );    printf("r %d c %d offs %ld nsect %d buf 0x%lx %s\n", pda->row, pda->col,       pda->startSector, pda->numSector, bufPtr,       (lk) ? "LOCK" : ((unlk) ? "UNLK" : " "));    return;  }  if (df == rf_DiskUnlockFunc) {    pda = (RF_PhysDiskAddr_t *)node->params[0].p;    lk = RF_EXTRACT_LOCK_FLAG(node->params[3].v);    unlk = RF_EXTRACT_UNLOCK_FLAG(node->params[3].v);    RF_ASSERT( !(lk && unlk) );    printf("r %d c %d %s\n", pda->row, pda->col,      (lk) ? "LOCK" : ((unlk) ? "UNLK" : "nop"));    return;  }  if ((df==rf_SimpleXorFunc) || (df==rf_RegularXorFunc)      || (df==rf_RecoveryXorFunc))  {    printf("result buf 0x%lx\n",(long) node->results[0]);    for (i=0; i<node->numParams-1; i+=2) {      pda = (RF_PhysDiskAddr_t *)node->params[i].p;      bufPtr = (RF_PhysDiskAddr_t *)node->params[i+1].p;      printf("    buf 0x%lx r%d c%d offs %ld nsect %d\n",        bufPtr, pda->row, pda->col, pda->startSector, pda->numSector);    }    return;  }#if RF_INCLUDE_PARITYLOGGING > 0  if (df==rf_ParityLogOverwriteFunc || df==rf_ParityLogUpdateFunc) {    for (i=0; i<node->numParams-1; i+=2) {      pda = (RF_PhysDiskAddr_t *)node->params[i].p;      bufPtr = (RF_PhysDiskAddr_t *)node->params[i+1].p;      printf(" r%d c%d offs %ld nsect %d buf 0x%lx\n", pda->row, pda->col,        pda->startSector, pda->numSector, bufPtr);    }    return;  }#endif /* RF_INCLUDE_PARITYLOGGING > 0 */  if ((df==rf_TerminateFunc) || (df==rf_NullNodeFunc)) {    printf("\n");    return;  }  printf("?\n");}static void rf_RecurPrintDAG(node, depth, unvisited)  RF_DagNode_t  *node;  int            depth;  int            unvisited;{  char *anttype;  int i;  node->visited = (unvisited) ? 0 : 1;  printf("(%d) %d C%d %s: %s,s%d %d/%d,a%d/%d,p%d,r%d S{", depth,    node->nodeNum, node->commitNode, node->name, rf_NodeStatusString(node),    node->numSuccedents, node->numSuccFired, node->numSuccDone, 	node->numAntecedents, node->numAntDone, node->numParams,node->numResults);  for (i=0; i<node->numSuccedents; i++) {    printf("%d%s", node->succedents[i]->nodeNum,      ((i==node->numSuccedents-1) ? "\0" : " "));  }  printf("} A{");  for (i=0; i<node->numAntecedents; i++) {    switch (node->antType[i]) {    case rf_trueData :      anttype = "T";      break;    case rf_antiData :      anttype = "A";      break;    case rf_outputData :      anttype = "O";      break;    case rf_control :      anttype = "C";      break;    default :      anttype = "?";      break;    }    printf("%d(%s)%s", node->antecedents[i]->nodeNum, anttype, (i==node->numAntecedents-1) ? "\0" : " ");  }  printf("}; ");  rf_PrintNodeInfoString(node);  for (i=0; i<node->numSuccedents; i++) {    if (node->succedents[i]->visited == unvisited)      rf_RecurPrintDAG(node->succedents[i], depth+1, unvisited);  }}static void rf_PrintDAG(dag_h)  RF_DagHeader_t  *dag_h;{  int unvisited, i;  char *status;  /* set dag status */  switch (dag_h->status) {  case rf_enable :    status = "enable";    break;  case rf_rollForward :    status = "rollForward";    break;  case rf_rollBackward :    status = "rollBackward";    break;  default :    status = "illegal!";    break;  }  /* find out if visited bits are currently set or clear */  unvisited = dag_h->succedents[0]->visited;    printf("DAG type:  %s\n", dag_h->creator);  printf("format is (depth) num commit type: status,nSucc nSuccFired/nSuccDone,nAnte/nAnteDone,nParam,nResult S{x} A{x(type)};  info\n");  printf("(0) %d Hdr: %s, s%d, (commit %d/%d) S{", dag_h->nodeNum,    status, dag_h->numSuccedents, dag_h->numCommitNodes, dag_h->numCommits);  for (i=0; i<dag_h->numSuccedents; i++) {    printf("%d%s", dag_h->succedents[i]->nodeNum,      ((i==dag_h->numSuccedents-1) ? "\0" : " "));  }  printf("};\n");  for (i=0; i<dag_h->numSuccedents; i++) {    if (dag_h->succedents[i]->visited == unvisited)      rf_RecurPrintDAG(dag_h->succedents[i], 1, unvisited);  }}/* assigns node numbers */int rf_AssignNodeNums(RF_DagHeader_t *dag_h){  int unvisited, i, nnum;  RF_DagNode_t *node;  nnum = 0;  unvisited = dag_h->succedents[0]->visited;    dag_h->nodeNum = nnum++;  for (i=0; i<dag_h->numSuccedents; i++) {    node = dag_h->succedents[i];    if (node->visited == unvisited) {      nnum = rf_RecurAssignNodeNums(dag_h->succedents[i], nnum, unvisited);    }  }  return(nnum);}int rf_RecurAssignNodeNums(node, num, unvisited)  RF_DagNode_t  *node;  int            num;  int            unvisited;{  int i;  node->visited = (unvisited) ? 0 : 1;  node->nodeNum = num++;  for (i=0; i<node->numSuccedents; i++) {    if (node->succedents[i]->visited == unvisited) {      num = rf_RecurAssignNodeNums(node->succedents[i], num, unvisited);    }  }  return(num);}/* set the header pointers in each node to "newptr" */void rf_ResetDAGHeaderPointers(dag_h, newptr)  RF_DagHeader_t  *dag_h;  RF_DagHeader_t  *newptr;{  int i;  for (i=0; i<dag_h->numSuccedents; i++)    if (dag_h->succedents[i]->dagHdr != newptr)      rf_RecurResetDAGHeaderPointers(dag_h->succedents[i], newptr);}void rf_RecurResetDAGHeaderPointers(node, newptr)  RF_DagNode_t    *node;  RF_DagHeader_t  *newptr;{  int i;  node->dagHdr = newptr;  for (i=0; i<node->numSuccedents; i++)    if (node->succedents[i]->dagHdr != newptr)      rf_RecurResetDAGHeaderPointers(node->succedents[i], newptr);}void rf_PrintDAGList(RF_DagHeader_t *dag_h){  int i=0;  for (; dag_h; dag_h=dag_h->next) {    rf_AssignNodeNums(dag_h);    printf("\n\nDAG %d IN LIST:\n",i++);    rf_PrintDAG(dag_h);  }}static int rf_ValidateBranch(node, scount, acount, nodes, unvisited)  RF_DagNode_t   *node;  int            *scount;  int            *acount;  RF_DagNode_t  **nodes;  int             unvisited;{  int i, retcode = 0;  /* construct an array of node pointers indexed by node num */  node->visited = (unvisited) ? 0 : 1;  nodes[ node->nodeNum ] = node;  if (node->next != NULL) {    printf("INVALID DAG: next pointer in node is not NULL\n");    retcode = 1;  }  if (node->status != rf_wait) {    printf("INVALID DAG: Node status is not wait\n");    retcode = 1;  }  if (node->numAntDone != 0) {    printf("INVALID DAG: numAntDone is not zero\n");    retcode = 1;  }  if (node->doFunc == rf_TerminateFunc) {    if (node->numSuccedents != 0) {      printf("INVALID DAG: Terminator node has succedents\n");      retcode = 1;    }  } else {    if (node->numSuccedents == 0) {      printf("INVALID DAG: Non-terminator node has no succedents\n");      retcode = 1;    }  }  for (i=0; i<node->numSuccedents; i++)  {    if (!node->succedents[i]) {      printf("INVALID DAG: succedent %d of node %s is NULL\n",i,node->name);      retcode = 1;    }    scount[ node->succedents[i]->nodeNum ]++;  }  for (i=0; i<node->numAntecedents; i++) {    if (!node->antecedents[i]) {      printf("INVALID DAG: antecedent %d of node %s is NULL\n",i,node->name);

⌨️ 快捷键说明

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