/** * 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); }
/** * 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; }