[Stackless-checkins] CVS: slpdev/src/2.3/dev/Stackless safe_pickle.c, NONE, 1.1 stackless_impl.h, 1.79, 1.80

Christian Tismer tismer at centera.de
Sun Apr 18 21:51:30 CEST 2004


Update of /home/cvs/slpdev/src/2.3/dev/Stackless
In directory centera.de:/tmp/cvs-serv4029/dev/Stackless

Modified Files:
	stackless_impl.h 
Added Files:
	safe_pickle.c 
Log Message:
a first shot at safe pickling, see the new file safe_pickle.c

--- NEW FILE: safe_pickle.c ---
#include "Python.h"
#ifdef STACKLESS

#include "compile.h"

#include "stackless_impl.h"

static int(*cPickle_save)(PyObject *, PyObject *, int) = NULL;

static PyObject *
pickle_callback(PyFrameObject *f, PyObject *retval)
{
	PyThreadState *ts = PyThreadState_GET();
	PyTaskletObject *cur = ts->st.current;
	PyCStackObject *cst = cur->cstate;
	PyObject *self, *args;
	int pers_save, ret;
	if (!PyArg_ParseTuple(retval, "OOi", &self, &args, &pers_save))
		return NULL;
	ret = cPickle_save(self, args, pers_save);
	cur->tempval = PyInt_FromLong(ret);
	/* jump back */
	ts->frame = f->f_back;
	Py_DECREF(f);
	slp_transfer(NULL, cst, NULL);
	/* never come here */
	return NULL;
}

int slp_safe_pickling(int(*save)(PyObject *, PyObject *, int), 
					  PyObject *self, PyObject *args, int pers_save)
{
	PyThreadState *ts = PyThreadState_GET();
	PyTaskletObject *cur = ts->st.current;
	PyCStackObject *cst = cur->cstate;
	PyCStackObject *stub = ts->st.initial_stub;
	PyObject *retval = NULL;
	int ret = -1;
	PyObject *cb_args = Py_BuildValue("OOi", self, args, pers_save);
	PyBaseFrameObject *bf = NULL;

	if (cb_args == NULL)
		goto finally;
	cPickle_save = save;
	cur->tempval = cb_args;
	bf = slp_baseframe_new(pickle_callback, 1, 0);
	if (bf == NULL)
		goto finally;
	ts->frame = (PyFrameObject *) bf;
	cur->cstate = NULL;
	if (slp_transfer(&cur->cstate, stub, cur))
		goto finally;
	Py_XDECREF(cur->cstate);
	cur->cstate = cst;
	retval = cur->tempval;
	cur->tempval = NULL;
	if (retval == NULL)
		goto finally;
	if (PyInt_Check(retval))
		ret = PyInt_AsLong(retval);
finally:
	Py_XDECREF(retval);
	Py_XDECREF(cb_args);
	return ret;
}

#endif

Index: stackless_impl.h
===================================================================
RCS file: /home/cvs/slpdev/src/2.3/dev/Stackless/stackless_impl.h,v
retrieving revision 1.79
retrieving revision 1.80
diff -C2 -d -r1.79 -r1.80
*** stackless_impl.h	18 Apr 2004 15:14:37 -0000	1.79
--- stackless_impl.h	18 Apr 2004 19:51:27 -0000	1.80
***************
*** 275,288 ****
  PyAPI_FUNC(PyObject *) slp_schedule_task(PyTaskletObject *prev, PyTaskletObject *next, int stackless, PyObject *retval);
  
! PyObject * slp_run_tasklet(PyFrameObject *f);
! PyObject * slp_resume_tasklet(PyFrameObject *f);
! int initialize_main_and_current(PyFrameObject *f);
  
  /* handy abbrevations */
  
! PyObject * slp_type_error(const char *msg);
! PyObject * slp_runtime_error(const char *msg);
! PyObject * slp_value_error(const char *msg);
! PyObject * slp_null_error(void);
  
  /* this seems to be needed for gcc */
--- 275,288 ----
  PyAPI_FUNC(PyObject *) slp_schedule_task(PyTaskletObject *prev, PyTaskletObject *next, int stackless, PyObject *retval);
  
! PyAPI_FUNC(PyObject *) slp_run_tasklet(PyFrameObject *f);
! PyAPI_FUNC(PyObject *) slp_resume_tasklet(PyFrameObject *f);
! PyAPI_FUNC(int) initialize_main_and_current(PyFrameObject *f);
  
  /* handy abbrevations */
  
! PyAPI_FUNC(PyObject *) slp_type_error(const char *msg);
! PyAPI_FUNC(PyObject *) slp_runtime_error(const char *msg);
! PyAPI_FUNC(PyObject *) slp_value_error(const char *msg);
! PyAPI_FUNC(PyObject *) slp_null_error(void);
  
  /* this seems to be needed for gcc */
***************
*** 301,315 ****
  #define VALUE_ERROR(str, ret) (slp_value_error(str), ret)
  
! PyBaseFrameObject * slp_baseframe_new(PyFrame_ExecFunc *exec, unsigned int linked, 
!                                       unsigned int extra);
! PyCFrameObject * slp_cframe_new(PyObject *func, PyObject *args, PyObject *kwds, unsigned int linked);
  
! PyFrameObject * slp_get_frame(PyTaskletObject *task);
! PyTaskletFlagStruc * slp_get_flags(PyTaskletObject *task);
! void slp_check_pending_irq(void);
! int slp_return_wrapper(PyObject *retval);
! int slp_int_wrapper(PyObject *retval);
! int slp_current_wrapper( int(*func)(PyTaskletObject*), PyTaskletObject *task);
! int slp_revive_main(void);
  
  /* debugging/monitoring */
--- 301,320 ----
  #define VALUE_ERROR(str, ret) (slp_value_error(str), ret)
  
! PyAPI_FUNC(PyBaseFrameObject *) slp_baseframe_new(PyFrame_ExecFunc *exec, unsigned int linked, 
!                                                   unsigned int extra);
! PyAPI_FUNC(PyCFrameObject *) slp_cframe_new(PyObject *func, PyObject *args, PyObject *kwds, unsigned int linked);
  
! PyAPI_FUNC(PyFrameObject *) slp_get_frame(PyTaskletObject *task);
! PyAPI_FUNC(PyTaskletFlagStruc *) slp_get_flags(PyTaskletObject *task);
! PyAPI_FUNC(void) slp_check_pending_irq(void);
! PyAPI_FUNC(int) slp_return_wrapper(PyObject *retval);
! PyAPI_FUNC(int) slp_int_wrapper(PyObject *retval);
! PyAPI_FUNC(int) slp_current_wrapper( int(*func)(PyTaskletObject*), PyTaskletObject *task);
! PyAPI_FUNC(int) slp_revive_main(void);
! 
! /* stackless pickling support */
! 
! PyAPI_FUNC(int) slp_safe_pickling(int(*save)(PyObject *, PyObject *, int), 
! 								  PyObject *self, PyObject *args, int pers_save);
  
  /* debugging/monitoring */


_______________________________________________
Stackless-checkins mailing list
Stackless-checkins at stackless.com
http://www.stackless.com/mailman/listinfo/stackless-checkins



More information about the Stackless-checkins mailing list