示例#1
0
文件: db_view.c 项目: pahihu/mumps
void DB_ViewPut(int vol, struct GBD *ptr)		// que block for write
{ short s;						// for funcs

  volnum = vol;						// for ron
  writing = 0;						// clear this
  s = SemOp(SEM_GLOBAL, WRITE);				// write lock
  if (s < 0)						// check error
  { return;						// quit if so
  }
  ptr->last_accessed = MTIME(0);			// reset access
  if (ptr->mem->type)					// if used
  { Used_block(ptr->block);				// mark it so
  }
  else 							// trying to free it
  { Free_block(ptr->block);				// do so
    bzero(ptr->mem, systab->vol[(volnum)-1]->vollab->block_size); // clear it
  }
  level = 0;						// for Queit
  if (ptr->dirty == NULL)				// check dirty ptr
  { ptr->dirty = ptr;					// set if reqd
    blk[level] = ptr;					// ditto
    Queit();						// do this
  }
  if (curr_lock)
  { SemOp(SEM_GLOBAL, -curr_lock);			// release lock
  }
  return;						// and exit
}
示例#2
0
文件: db_main.c 项目: codeaudit/mumps
int DB_SetFlags(mvar *var, int flags)                  	// Set flags
{ int clearit = 0;
  int i;
  short s;

  if (flags < 0)
  { clearit = 1;					// setup to clear
    flags = -flags;					// get flags correct
  }
  s = Copy2local(var);					// get local copy
  if (s < 0)
  { return s;						// exit on error
  }
  systab->vol[volnum-1]->stats.dbset++;                 // update stats
  writing = 1;						// say we are writing
  while (systab->vol[volnum - 1]->writelock)		// check for write lock
  { i = sleep(5);					// wait a bit
    if (partab.jobtab->attention)
    { return -(ERRZLAST+ERRZ51);			// for <Control><C>
    }
  }							// end writelock check
  Get_GBDs(1);						// ensure this many
  s = Get_data(0);                                      // try to find that
  if ((s < 0) && (s != -ERRM7))                         // check for errors
  { if (curr_lock)					// if locked
    { SemOp( SEM_GLOBAL, -curr_lock);			// release global lock
    }
    return (int) s;					// return error
  }
  i = ((int *)record)[1];				// get current flags
  if (clearit)
  { i = i & ~flags;					// clear flags
  }
  else
  { i = i | flags;					// set flags
  }
  ((int *)record)[1] = i;				// set back to GD
  if (blk[level]->dirty == (gbd *) 1)			// if reserved
  { blk[level]->dirty = blk[level];			// terminate list
    Queit();						// que for write
  }
  SemOp( SEM_GLOBAL, -curr_lock);			// release global lock
  return i;						// return current flags
}
示例#3
0
short Set_key(u_int ptr_blk, int this_level)		// set a block#
{ short s;						// for returns
  u_char tmp[8];					// some space
  u_char gtmp[16];					// to find glob
  int i;						// a handy int
  u_int *ui;						// an int ptr
  cstring *ptr;						// spare ptr
  int rs;						// reqd space
  int ts;						// trailing size
  int rls;						// RL space
  int trailings;					// ptr to orig trail
  gbd *cblk[3];						// current level blks
  u_int tgb;						// top blk in GD
  DB_Block *btmp;					// ditto

  ptr = (cstring *) tmp;				// point at this
  ptr->len = 4;						// always
  ui = (u_int *) ptr->buf;				// for pointers
  *ui = ptr_blk;					// copy this here
  
  level = this_level;					// set current level
  if (!this_level)					// top level split
  { gtmp[1] = 128;					// start string key
    for (i=0; i<8; i++)					// for each char
    { if (db_var.name.var_cu[i] == '\0')		// check for null
      { break;						// break if found
      }
      gtmp[i+2] = db_var.name.var_cu[i];		// copy char
    }
    i +=2;						// correct count
    gtmp[i] = '\0';					// null terminate
    gtmp[0] = (u_char) i;				// add the count
    s=Get_block(systab->vol[db_var.volset-1]->vollab->uci[db_var.uci-1].global);
    if (s < 0)						// failed?
    { return s;						// return error
    }
    s = Locate(gtmp);					// search for it
    if (s < 0)						// failed?
    { return s;						// return error
    }
    Allign_record();					// if not alligned
    tgb = *(u_int *) record;				// get block#

    level = 1;						// at top level
    s = New_block();					// get a new block
    if (s < 0)						// if that failed
    { return s;						// return error
    }

    blk[level]->mem->type = db_var.uci;			// pointer block
    blk[level]->mem->last_idx = 10;			// first Index
    blk[level]->mem->last_free
      = (systab->vol[volnum-1]->vollab->block_size >> 2) - 3; // use 2 words
    bcopy(&db_var.name.var_cu[0], &blk[level]->mem->global, 8);
    idx[10] = blk[level]->mem->last_free + 1;		// the data
    chunk = (cstring *) &iidx[idx[10]];			// point at it
    chunk->len = 8;					// used two words
    chunk->buf[0] = 0;					// ccc
    chunk->buf[1] = 0;					// ucc
    record = (cstring *) &chunk->buf[chunk->buf[1]+2];	// setup record ptr

    *( (u_int *) record) = tgb;				// first entry
    s = Insert(&db_var.slen, ptr);			// insert this one
    if (s < 0)						// failed?
    { return s;						// return error
    }
    level = 0;						// point at GD
    s = Locate(gtmp);					// search for it
    if (s < 0)						// failed?
    { return s;						// return error
    }
    Allign_record();					// if not alligned
    *( (u_int *) record) = blk[1]->block;		// new top level blk
    level = 1;
    blk[level]->dirty = blk[level];			// hook to self
    if (blk[0]->dirty == (gbd *) 1)			// if not queued
    { blk[0]->dirty = blk[level];			// hook it
      level = 0;					// and clear level
    }
    Queit();						// que to write
    return 0;						// end of level == 0
  }