greenlet source code -- g_save

g_save greenlet存在heap上的數據區間由stack_copystack_copy + stack_saved指定 這裏在把greenlet的數據存到heap上時 判斷以前的那段區間是否足夠存放 若是不夠的話 從新申請內存code

static int g_save(PyGreenlet* g, char* stop)
{
	/* Save more of g's stack into the heap -- at least up to 'stop'  */

在此輸入圖片描述

intptr_t sz1 = g->stack_saved;
	intptr_t sz2 = stop - g->stack_start;
	assert(g->stack_start != NULL);
	if (sz2 > sz1) {
		char* c = (char*)PyMem_Realloc(g->stack_copy, sz2);
		if (!c) {
			PyErr_NoMemory();
			return -1;
		}
		memcpy(c+sz1, g->stack_start+sz1, sz2-sz1);
		g->stack_copy = c;
		g->stack_saved = sz2;
	}
	return 0;
}
相關文章
相關標籤/搜索