Res ThreadRegister(Thread *threadReturn, Arena arena)
{
    Res res;
    Thread thread;
    Ring ring;
    void *p;

    AVER(threadReturn != NULL);

    res = ControlAlloc(&p, arena, sizeof(ThreadStruct),
                       /* withReservoirPermit */ FALSE);
    if(res != ResOK) return res;
    thread = (Thread)p;

    thread->arena = arena;
    RingInit(&thread->arenaRing);

    thread->sig = ThreadSig;
    thread->serial = arena->threadSerial;
    ++arena->threadSerial;

    AVERT(Thread, thread);

    ring = ArenaThreadRing(arena);
    AVER(RingCheckSingle(ring));  /* .single */

    RingAppend(ring, &thread->arenaRing);

    *threadReturn = thread;
    return ResOK;
}
示例#2
0
文件: thxc.c 项目: Ravenbrook/mps
Res ThreadRegister(Thread *threadReturn, Arena arena)
{
  Res res;
  Thread thread;
  Ring ring;
  void *p;

  AVER(threadReturn != NULL);

  res = ControlAlloc(&p, arena, sizeof(ThreadStruct));
  if (res != ResOK)
    return res;
  thread = (Thread)p;

  thread->arena = arena;
  RingInit(&thread->arenaRing);

  thread->serial = arena->threadSerial;
  ++arena->threadSerial;
  thread->alive = TRUE;
  thread->forking = FALSE;
  thread->port = mach_thread_self();
  AVER(MACH_PORT_VALID(thread->port));
  thread->sig = ThreadSig;
  AVERT(Thread, thread);

  ProtThreadRegister();

  ring = ArenaThreadRing(arena);

  RingAppend(ring, &thread->arenaRing);

  *threadReturn = thread;
  return ResOK;
}
Res ThreadRegister(Thread *threadReturn, Arena arena)
{
  Res res;
  Thread thread;
  void *p;

  AVER(threadReturn != NULL);
  AVERT(Arena, arena);

  res = ControlAlloc(&p, arena, sizeof(ThreadStruct),
                     /* withReservoirPermit */ FALSE);
  if(res != ResOK)
    return res;
  thread = (Thread)p;

  thread->id = pthread_self();

  RingInit(&thread->arenaRing);

  thread->sig = ThreadSig;
  thread->serial = arena->threadSerial;
  ++arena->threadSerial;
  thread->arena = arena;
  thread->mfc = NULL;

  PThreadextInit(&thread->thrextStruct, thread->id);

  AVERT(Thread, thread);

  RingAppend(ArenaThreadRing(arena), &thread->arenaRing);

  *threadReturn = thread;
  return ResOK;
}
示例#4
0
void (ShieldSuspend)(Arena arena)
{
    AVERT(Arena, arena);
    AVER(arena->insideShield);

    if (!arena->suspended) {
        ThreadRingSuspend(ArenaThreadRing(arena));
        arena->suspended = TRUE;
    }
}
示例#5
0
文件: shield.c 项目: bhanug/mps
static void shieldSuspend(Arena arena)
{
  Shield shield;
  
  AVERT(Arena, arena);
  shield = ArenaShield(arena);
  AVER(shield->inside);

  if (!shield->suspended) {
    ThreadRingSuspend(ArenaThreadRing(arena), ArenaDeadRing(arena));
    shield->suspended = TRUE;
  }
}
示例#6
0
void (ShieldLeave)(Arena arena)
{
    AVERT(Arena, arena);
    AVER(arena->insideShield);

    ShieldFlush(arena);
    /* Cache is empty so inv.outside.depth holds */
    AVER(arena->shDepth == 0);

    /* Ensuring the mutator is running at this point
     * guarantees inv.outside.running */
    if (arena->suspended) {
        ThreadRingResume(ArenaThreadRing(arena));
        arena->suspended = FALSE;
    }
    arena->insideShield = FALSE;
}
示例#7
0
文件: thw3.c 项目: thejeed/hornet
Res ThreadRegister(Thread *threadReturn, Arena arena)
{
    Res res;
    Thread thread;
    HANDLE procHandle;
    BOOL b;
    void *p;

    AVER(threadReturn != NULL);
    AVERT(Arena, arena);

    res = ControlAlloc(&p, arena, sizeof(ThreadStruct),
                       /* withReservoirPermit */ FALSE);
    if(res != ResOK)
        return res;
    thread = (Thread)p; /* avoid pun */

    /* Duplicate handle gives us a new handle with updated privileges.
     * .thread.handle describes the ones needed.
     */
    procHandle = GetCurrentProcess();

    b = DuplicateHandle(procHandle, GetCurrentThread(), procHandle,
                        &thread->handle,
                        THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT,
                        FALSE, 0);
    if(!b)
        return ResRESOURCE;

    thread->id = GetCurrentThreadId();

    RingInit(&thread->arenaRing);

    thread->sig = ThreadSig;
    thread->serial = arena->threadSerial;
    ++arena->threadSerial;
    thread->arena = arena;

    AVERT(Thread, thread);

    RingAppend(ArenaThreadRing(arena), &thread->arenaRing);

    *threadReturn = thread;
    return ResOK;
}
示例#8
0
文件: shield.c 项目: bhanug/mps
void (ShieldLeave)(Arena arena)
{
  Shield shield;
  
  AVERT(Arena, arena);
  shield = ArenaShield(arena);
  AVER(shield->inside);
  AVER(shield->depth == 0); /* no pending covers */
  AVER(shield->holds == 0);

  ShieldFlush(arena);

  AVER(shield->unsynced == 0); /* everything back in sync */

  /* Ensuring the mutator is running at this point guarantees
     .inv.outside.running */
  if (shield->suspended) {
    ThreadRingResume(ArenaThreadRing(arena), ArenaDeadRing(arena));
    shield->suspended = FALSE;
  }

  shield->inside = FALSE;
}