static PyObject* RLockObject_acquire(RLockObject *self, PyObject *args, PyObject *kwargs) { PyObject *timeout = NULL; PyObject *blocking = Py_True; long seconds = 0; static char *keywords[] = {"blocking", "timeout", NULL}; DEBUG("self:%p", self); if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OO:acquire", keywords, &blocking, &timeout)) { return NULL; } if (timeout == NULL) { return rlock_acquire(self, blocking, seconds); } else if (timeout == Py_None) { return rlock_acquire(self, blocking, seconds); } else if (PyLong_Check(timeout)) { seconds = PyLong_AsLong(timeout); if (seconds < 0) { PyErr_SetString(PyExc_ValueError, "timeout value out of range"); return NULL; } return rlock_acquire(self, blocking, seconds); } PyErr_SetString(PyExc_TypeError, "an integer is required"); return NULL; }
Elf_Addr _mips_rtld_bind(Obj_Entry *obj, Elf_Size reloff) { Elf_Addr *got = obj->pltgot; const Elf_Sym *def; const Obj_Entry *defobj; Elf_Addr *where; Elf_Addr target; RtldLockState lockstate; rlock_acquire(rtld_bind_lock, &lockstate); if (sigsetjmp(lockstate.env, 0) != 0) lock_upgrade(rtld_bind_lock, &lockstate); where = &got[obj->local_gotno + reloff - obj->gotsym]; def = find_symdef(reloff, obj, &defobj, SYMLOOK_IN_PLT, NULL, &lockstate); if (def == NULL) rtld_die(); target = (Elf_Addr)(defobj->relocbase + def->st_value); dbg("bind now/fixup at %s sym # %jd in %s --> was=%p new=%p", obj->path, (intmax_t)reloff, defobj->strtab + def->st_name, (void *)*where, (void *)target); if (!ld_bind_not) *where = target; lock_release(rtld_bind_lock, &lockstate); return (Elf_Addr)target; }
void _rtld_atfork_pre(int *locks) { RtldLockState ls[2]; wlock_acquire(rtld_phdr_lock, &ls[0]); rlock_acquire(rtld_bind_lock, &ls[1]); /* XXXKIB: I am really sorry for this. */ locks[0] = ls[1].lockstate; locks[2] = ls[0].lockstate; }
static PyObject* RLockObject_enter(RLockObject *self, PyObject *args) { return rlock_acquire(self, Py_True, 0); }