コード例 #1
0
ファイル: shield.c プロジェクト: et4te/memory-pool-system
/* If the segment is out of sync, either sync it, or ensure
 * depth > 0, and the arena is suspended.
 */
static void cache(Arena arena, Seg seg)
{
  /* <design/trace/#fix.noaver> */
  AVERT_CRITICAL(Arena, arena);
  AVERT_CRITICAL(Seg, seg);

  if (SegSM(seg) == SegPM(seg)) return;
  if (SegDepth(seg) > 0) {
    ShieldSuspend(arena);
    return;
  }
  if (ShieldCacheSIZE == 0 || !arena->suspended)
    shieldSync(arena, seg);
  else {
    SegSetDepth(seg, SegDepth(seg) + 1);
    ++arena->shDepth;
    AVER(arena->shDepth > 0);
    AVER(SegDepth(seg) > 0);
    AVER(arena->shCacheLimit <= ShieldCacheSIZE);
    AVER(arena->shCacheI < arena->shCacheLimit);
    flush(arena, arena->shCacheI);
    arena->shCache[arena->shCacheI] = seg;
    ++arena->shCacheI;
    if (arena->shCacheI == ShieldCacheSIZE)
      arena->shCacheI = 0;
    if (arena->shCacheI == arena->shCacheLimit)
      ++arena->shCacheLimit;
  }
}
コード例 #2
0
ファイル: shield.c プロジェクト: bhanug/mps
static void shieldSync(Shield shield, Seg seg)
{
  SHIELD_AVERT_CRITICAL(Seg, seg);

  if (!SegIsSynced(seg)) {
    shieldSetPM(shield, seg, SegSM(seg));
    ProtSet(SegBase(seg), SegLimit(seg), SegPM(seg));
  }
}
コード例 #3
0
ファイル: shield.c プロジェクト: sionescu/mps-temporary
static void shieldSync(Arena arena, Seg seg)
{
    AVERT(Arena, arena);
    AVERT(Seg, seg);

    if (SegPM(seg) != SegSM(seg)) {
        ProtSet(SegBase(seg), SegLimit(seg), SegSM(seg));
        SegSetPM(seg, SegSM(seg));
        /* inv.prot.shield */
    }
}
コード例 #4
0
ファイル: shield.c プロジェクト: bhanug/mps
static void shieldSetPM(Shield shield, Seg seg, AccessSet mode)
{
  if (SegPM(seg) != mode) {
    if (SegIsSynced(seg)) {
      SegSetPM(seg, mode);
      ++shield->unsynced;
    } else {
      SegSetPM(seg, mode);
      if (SegIsSynced(seg)) {
        AVER(shield->unsynced > 0);
        --shield->unsynced;
      }
    }
  }
}  
コード例 #5
0
ファイル: shield.c プロジェクト: sionescu/mps-temporary
void (ShieldCover)(Arena arena, Seg seg)
{
    /* <design/trace/#fix.noaver> */
    AVERT_CRITICAL(Arena, arena);
    AVERT_CRITICAL(Seg, seg);
    AVER_CRITICAL(SegPM(seg) == AccessSetEMPTY);

    AVER_CRITICAL(arena->shDepth > 0);
    AVER_CRITICAL(SegDepth(seg) > 0);
    SegSetDepth(seg, SegDepth(seg) - 1);
    --arena->shDepth;

    /* ensure inv.unsynced.depth */
    cache(arena, seg);
}
コード例 #6
0
ファイル: shield.c プロジェクト: bhanug/mps
void (ShieldCover)(Arena arena, Seg seg)
{
  Shield shield;
  
  /* <design/trace/#fix.noaver> */
  AVERT_CRITICAL(Arena, arena);
  shield = ArenaShield(arena);
  AVERT_CRITICAL(Seg, seg);
  AVER_CRITICAL(SegPM(seg) == AccessSetEMPTY);
 
  AVER_CRITICAL(SegDepth(seg) > 0);
  SegSetDepth(seg, SegDepth(seg) - 1);
  AVER_CRITICAL(shield->depth > 0);
  --shield->depth;

  /* Ensure design.mps.shield.inv.unsynced.depth. */
  shieldQueue(arena, seg);
}
コード例 #7
0
ファイル: shield.c プロジェクト: sionescu/mps-temporary
void (ShieldExpose)(Arena arena, Seg seg)
{
    AccessSet mode = AccessREAD | AccessWRITE;
    /* <design/trace/#fix.noaver> */
    AVERT_CRITICAL(Arena, arena);
    AVER_CRITICAL(arena->insideShield);

    SegSetDepth(seg, SegDepth(seg) + 1);
    ++arena->shDepth;
    /* <design/trace/#fix.noaver> */
    AVER_CRITICAL(arena->shDepth > 0);
    AVER_CRITICAL(SegDepth(seg) > 0);
    if (SegPM(seg) & mode)
        ShieldSuspend(arena);

    /* This ensures inv.expose.prot */
    protLower(arena, seg, mode);
}
コード例 #8
0
ファイル: shield.c プロジェクト: bhanug/mps
void (ShieldExpose)(Arena arena, Seg seg)
{
  Shield shield;
  AccessSet mode = AccessREAD | AccessWRITE;

  /* <design/trace/#fix.noaver> */
  AVERT_CRITICAL(Arena, arena);
  shield = ArenaShield(arena);
  AVER_CRITICAL(shield->inside);

  SegSetDepth(seg, SegDepth(seg) + 1);
  AVER_CRITICAL(SegDepth(seg) > 0); /* overflow */
  ++shield->depth;
  AVER_CRITICAL(shield->depth > 0); /* overflow */
  
  if (BS_INTER(SegPM(seg), mode) != AccessSetEMPTY)
    shieldSuspend(arena);

  /* Ensure design.mps.shield.inv.expose.prot. */
  /* TODO: Mass exposure -- see
     design.mps.shield.improv.mass-expose. */
  shieldProtLower(shield, seg, mode);
}
コード例 #9
0
ファイル: shield.c プロジェクト: bhanug/mps
static Bool SegIsSynced(Seg seg)
{
  SHIELD_AVERT_CRITICAL(Seg, seg);
  return SegSM(seg) == SegPM(seg);
}