[Stackless-checkins] CVS: slpdev/src/2.3/dev/Stackless/core stacklesseval.c, 1.159, 1.160

Christian Tismer tismer at centera.de
Sun Jun 6 15:58:17 CEST 2004


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

Modified Files:
	stacklesseval.c 
Log Message:
solved a quite hard to find bug in cstack allocation.
I think it is now time to publish Stackless 3.1 :-)

Index: stacklesseval.c
===================================================================
RCS file: /home/cvs/slpdev/src/2.3/dev/Stackless/core/stacklesseval.c,v
retrieving revision 1.159
retrieving revision 1.160
diff -C2 -d -r1.159 -r1.160
*** a/stacklesseval.c	6 Jun 2004 13:15:44 -0000	1.159
--- b/stacklesseval.c	6 Jun 2004 13:58:14 -0000	1.160
***************
*** 56,60 ****
  			stack = cstack_cache[i];
  			cstack_cache[i] = (PyCStackObject *) stack->startaddr;
! 			PyMem_Free(stack);
  		}
  	}
--- 56,60 ----
  			stack = cstack_cache[i];
  			cstack_cache[i] = (PyCStackObject *) stack->startaddr;
! 			PyObject_Del(stack);
  		}
  	}
***************
*** 69,77 ****
  			 prev);
  	if (cst->ob_size >= CSTACK_SLOTS) {
! 		PyMem_Free(cst);
  	}
  	else {
  		if (cstack_cachecount >= CSTACK_MAXCACHE)
! 		slp_cstack_cacheclear();
  		cst->startaddr = (int *) cstack_cache[cst->ob_size];
  		cstack_cache[cst->ob_size] = cst;
--- 69,77 ----
  			 prev);
  	if (cst->ob_size >= CSTACK_SLOTS) {
! 		PyObject_Del(cst);
  	}
  	else {
  		if (cstack_cachecount >= CSTACK_MAXCACHE)
! 			slp_cstack_cacheclear();
  		cst->startaddr = (int *) cstack_cache[cst->ob_size];
  		cstack_cache[cst->ob_size] = cst;
***************
*** 88,100 ****
  	int size = stackbase - stackref;
  
! 	if (size < 0)
! 		RUNTIME_ERROR("negative stack size", NULL);
! 	if (*cst && (*cst)->ob_size == size && (*cst)->ob_refcnt == 1) {
! 		/* reuse it */
! 		(*cst)->task = task;
! 		printf("cstack new probable error, true=%d %d\n", ts->st.nesting_level, (*cst)->nesting_level);
! 		return *cst;
! 	}
! 	    
  	if (*cst != NULL) {
  		if ((*cst)->task == task)
--- 88,93 ----
  	int size = stackbase - stackref;
  
! 	assert(size >= 0);
! 
  	if (*cst != NULL) {
  		if ((*cst)->task == task)
***************
*** 106,118 ****
  		cstack_cache[size] = (PyCStackObject *) (*cst)->startaddr;
  		--cstack_cachecount;
  	}
! 	else {
! 		/* PyObject_NewVar is inlined */
! 		*cst = (PyCStackObject *)
! 		       PyObject_MALLOC(sizeof(PyCStackObject) + 
! 				       (size-1) * sizeof(int*));
! 		if (*cst == NULL) return NULL;
! 	}
! 	(void) PyObject_INIT_VAR(*cst, &PyCStack_Type, size);
  
  	(*cst)->startaddr = stackbase;
--- 99,107 ----
  		cstack_cache[size] = (PyCStackObject *) (*cst)->startaddr;
  		--cstack_cachecount;
+ 		_Py_NewReference((PyObject *)(*cst));
  	}
! 	else
! 		*cst = PyObject_NewVar(PyCStackObject, &PyCStack_Type, size);
! 	if (*cst == NULL) return NULL;
  
  	(*cst)->startaddr = stackbase;
***************
*** 123,127 ****
  	(*cst)->tstate = ts;
  	(*cst)->nesting_level = ts->st.nesting_level;
- 	printf("cstack new with %d\n", (*cst)->nesting_level);
  	return *cst;
  }
--- 112,115 ----
***************
*** 141,145 ****
  {
  	cst->tstate->st.nesting_level = cst->nesting_level;
- 	printf("cstack restore with %d\n", cst->nesting_level);
  	/* mark task as no longer responsible for cstack instance */
  	cst->task = NULL;
--- 129,132 ----
***************
*** 579,583 ****
  
  	++ts->st.nesting_level;
- 	printf("dispatch ++ %d\n", ts->st.nesting_level);
  
  /* 
--- 566,569 ----
***************
*** 602,606 ****
  	}
  	--ts->st.nesting_level;
- 	printf("dispatch -- %d\n", ts->st.nesting_level);
  	/* see whether we need to trigger a pending interrupt */
  	/* note that an interrupt handler guarantees current to exist */
--- 588,591 ----


_______________________________________________
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