コード例 #1
0
ファイル: locks.c プロジェクト: chenbk85/jega
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;
}
コード例 #2
0
ファイル: reloc.c プロジェクト: FreeBSDFoundation/freebsd
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;
}
コード例 #3
0
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;
}
コード例 #4
0
ファイル: locks.c プロジェクト: chenbk85/jega
static PyObject*
RLockObject_enter(RLockObject *self, PyObject *args)
{
    return rlock_acquire(self, Py_True, 0);
}