Ejemplo n.º 1
0
/**
 * Returns a process-specific fmutex used to guard OS/2 TCP/IP DLL calls.
 * This mutex must be used to provide thread safety where it (or reentrancy)
 * is guaranteed by the respective API. Note that we assume that TCP/IP DLL
 * calls are process safe and process-reentrant and thus only guarantee thread
 * safety within a single process.
 */
_fmutex *global_tcpip_sem()
{
  _fmutex *fsem = NULL;

  global_lock();

  ProcDesc *proc = find_proc_desc(getpid());

  ASSERT(proc);

  if (proc->tcpip_fsem.hev == NULLHANDLE)
  {
    /*
     * Lazily create the mutex. Note that we never destroy it as
     * process-specific ones will be freed automatically on process termination
     */
    int rc = _fmutex_create(&proc->tcpip_fsem, 0);
    ASSERT(!rc);
  }

  fsem = &proc->tcpip_fsem;

  global_unlock();

  return fsem;
}
static CORE_ADDR
alpha_saved_pc_after_call (struct frame_info *frame)
{
  CORE_ADDR pc = frame->pc;
  alpha_extra_func_info_t proc_desc;
  int pcreg;

  proc_desc = find_proc_desc (pc, frame->next, NULL);
  pcreg = proc_desc ? PROC_PC_REG (proc_desc) : RA_REGNUM;

  return read_register (pcreg);
}
Ejemplo n.º 3
0
/**
 * Returns the spawn2 semaphore lazily creating it or making sure it's
 * available in the given process (the current process if NULL). Will return
 * NULLHANDLE if lazy creation fails. Must be called under global_lock().
 */
unsigned long global_spawn2_sem(ProcDesc *proc)
{
  APIRET arc;

  if (!proc)
    proc = find_proc_desc(getpid());

  ASSERT(proc);

  if (gpData->spawn2_sem == NULLHANDLE)
  {
    ASSERT(proc->spawn2_sem == NULLHANDLE);

    arc = DosCreateEventSem(NULL, &gpData->spawn2_sem, DC_SEM_SHARED | DCE_AUTORESET, FALSE);
    if (arc != NO_ERROR)
      return NULLHANDLE;

    ASSERT(gpData->spawn2_sem_refcnt == 0);
    gpData->spawn2_sem_refcnt = 1;

    proc->spawn2_sem = gpData->spawn2_sem;
  }
  else if (proc->spawn2_sem == NULLHANDLE)
  {
    arc = DosOpenEventSem(NULL, &gpData->spawn2_sem);
    ASSERT_MSG(arc == NO_ERROR, "%ld %lx", arc, gpData->spawn2_sem);

    ASSERT(gpData->spawn2_sem_refcnt != 0);
    ++gpData->spawn2_sem_refcnt;

    proc->spawn2_sem = gpData->spawn2_sem;
  }

  TRACE("spawn2_sem %lx (refcnt %d)\n", proc->spawn2_sem, gpData->spawn2_sem_refcnt);

  return proc->spawn2_sem;
}