Example #1
0
static void
_enum_threads(_ctx* (*f) (PyThreadState *))
{
    PyThreadState *ts;
    PyInterpreterState* is;

    for(is=PyInterpreterState_Head();is!=NULL;is = PyInterpreterState_Next(is))
    {
        for (ts=PyInterpreterState_ThreadHead(is) ; ts != NULL; ts = ts->next) {
            f(ts);
        }
    }
}
Example #2
0
int
rootstate_traverse(NyHeapTraverse *ta)
{
    visitproc visit = ta->visit;
    NyHeapViewObject *hv = (void *)ta->hv;
    void *arg = ta->arg;
    PyThreadState *ts, *bts = PyThreadState_GET();
    PyInterpreterState *is;
    int err;

    for (is = PyInterpreterState_Head(); is; is = PyInterpreterState_Next(is)) {
	if (hv->is_hiding_calling_interpreter && is == bts->interp)
	  continue;
	VISIT(is->modules);
	VISIT(is->sysdict);
	VISIT(is->builtins);
	
#if PY_VERSION_HEX >= 0x020303f0
	VISIT(is->codec_search_path);
	VISIT(is->codec_search_cache);
	VISIT(is->codec_error_registry);
#endif	
	
	for (ts = is->tstate_head; ts; ts = ts->next) {
	    if (ts == bts && hv->limitframe) {
		VISIT(hv->limitframe);
	    } else if (!hv->limitframe) {
		VISIT(ts->frame);
	    }
	    VISIT(ts->c_profileobj);
	    VISIT(ts->c_traceobj);
	    VISIT(ts->curexc_type);
	    VISIT(ts->curexc_value);
	    VISIT(ts->curexc_traceback);
	    VISIT(ts->exc_type);
	    VISIT(ts->exc_value);
	    VISIT(ts->exc_traceback);
	    
	    VISIT(ts->dict);

#if PY_VERSION_HEX >= 0x020303f0
	    VISIT(ts->async_exc);
#endif	    

	      
	}
    }
    return 0;
}
Example #3
0
static PyInterpreterState *
interp_look_up_id(PY_INT64_T requested_id)
{
    PyInterpreterState *interp = PyInterpreterState_Head();
    while (interp != NULL) {
        PY_INT64_T id = PyInterpreterState_GetID(interp);
        if (id < 0) {
            return NULL;
        }
        if (requested_id == id) {
            return interp;
        }
        interp = PyInterpreterState_Next(interp);
    }
    return NULL;
}
Example #4
0
PyInterpreterState *
_PyInterpreterState_LookUpID(PY_INT64_T requested_id)
{
    if (requested_id < 0)
        goto error;

    PyInterpreterState *interp = PyInterpreterState_Head();
    while (interp != NULL) {
        PY_INT64_T id = PyInterpreterState_GetID(interp);
        if (id < 0)
            return NULL;
        if (requested_id == id)
            return interp;
        interp = PyInterpreterState_Next(interp);
    }

error:
    PyErr_Format(PyExc_RuntimeError,
                 "unrecognized interpreter ID %lld", requested_id);
    return NULL;
}
Example #5
0
static PyObject *
rootstate_getattr(PyObject *obj, PyObject *name)
{
    char *s = PyString_AsString(name);
    PyInterpreterState *is;
    int ino;
    unsigned long tno;
    char buf[100];
    if (!s)
      return 0;
    if (sscanf(s, "i%d_%50s", &ino, buf) == 2) {
	int countis;
	int numis;
	for (is = PyInterpreterState_Head(), numis = 0;
	     is;
	     is = PyInterpreterState_Next(is), numis++)
	  ;
	for (is = PyInterpreterState_Head(), countis = 0;
	     is;
	     is = PyInterpreterState_Next(is), countis++) {
	    int isno = numis - countis - 1;
	    if (isno == ino) {
		PyObject *ret = PyMember_Get((char *)is, is_members, buf);
		if (!ret)
		  PyErr_Format(PyExc_AttributeError,
			       "interpreter state has no attribute '%s'",
			       buf);
		return ret;
	    }
	}
	PyErr_SetString(PyExc_AttributeError, "no such interpreter state number");
	return 0;
    }
    if (sscanf(s, "t%lu_%50s", &tno, buf) == 2) {
	for (is = PyInterpreterState_Head();
	     is;
	     is = PyInterpreterState_Next(is)) {
	    PyThreadState *ts;
	    for (ts = is->tstate_head; ts; ts = ts->next) {
		if (THREAD_ID(ts) == tno) {
		    int frameno = 0;
		    if (sscanf(buf, "f%d", &frameno) == 1) {
			PyFrameObject *frame;
			int numframes = 0;
			for (frame = ts->frame; frame; frame = frame->f_back) {
			    numframes ++;
			}
			for (frame = ts->frame; frame; frame = frame->f_back) {
			    numframes --;
			    if (numframes == frameno) {
				Py_INCREF(frame);
				return (PyObject *)frame;
			    }
			}
			PyErr_Format(PyExc_AttributeError,
				     "thread state has no frame numbered %d from bottom",
				     frameno);
			return 0;
		    } else {
			PyObject *ret = PyMember_Get((char *)ts, ts_members, buf);
			if (!ret)
			  PyErr_Format(PyExc_AttributeError,
				       "thread state has no attribute '%s'",
				       buf);
			return ret;
		    }
		}
	    }
	}
		
    }
    PyErr_Format(PyExc_AttributeError, "root state has no attribute '%.200s'", s);
    return 0;
}
Example #6
0
static int
rootstate_relate(NyHeapRelate *r)
{
    NyHeapViewObject *hv = (void *)r->hv;
    PyThreadState *ts,  *bts = PyThreadState_GET();
    PyInterpreterState *is;
    int isframe = PyFrame_Check(r->tgt);
    int isno;
    for (is = PyInterpreterState_Head(), isno = 0;
	 is;
	 is = PyInterpreterState_Next(is), isno++)
      ;
    for (is = PyInterpreterState_Head(), isno--;
	 is;
	 is = PyInterpreterState_Next(is), isno--) {
	char buf[100];
	ISATTR(modules);
	ISATTR(sysdict);
	ISATTR(builtins);
#if PY_VERSION_HEX >= 0x020303f0
	ISATTR(codec_search_path);
	ISATTR(codec_search_cache);
	ISATTR(codec_error_registry);
#endif	

	for (ts = is->tstate_head; ts; ts = ts->next) {
	    if ((ts == bts && r->tgt == hv->limitframe) ||
		(!hv->limitframe && isframe)) {
		int frameno = -1;
		int numframes = 0;
		PyFrameObject *frame;
		for (frame = (PyFrameObject *)ts->frame; frame; frame = frame->f_back) {
		    numframes ++;
		    if (r->tgt == (PyObject *)frame)
		      frameno = numframes;
		}
		if (frameno != -1) {
		    frameno = numframes - frameno;
		    sprintf(buf,"t%lu_f%d", THREAD_ID(ts), frameno);
		    if (r->visit(NYHR_ATTRIBUTE, PyString_FromString(buf), r))
		      return 1;
		}
	    }
	    TSATTR(ts, c_profileobj);
	    TSATTR(ts, c_traceobj);
	    TSATTR(ts, curexc_type);
	    TSATTR(ts, curexc_value);
	    TSATTR(ts, curexc_traceback);
	    TSATTR(ts, exc_type);
	    TSATTR(ts, exc_value);
	    TSATTR(ts, exc_traceback);
	    
	    TSATTR(ts, dict);
#if PY_VERSION_HEX >= 0x020303f0
	    TSATTR(ts, async_exc);
#endif
	      
	}
    }
    return 0;
}