Пример #1
0
static void idbg_readStdin( SGS_IDBG )
{
	/* read from STDIN */
	size_t wsz = 31, i = 0;
	char bfr[ BFR_SIZE ];
	sgs_membuf_resize( &D->input, D->C, 0 );
	while( fgets( bfr, BFR_SIZE, stdin ) )
	{
		size_t len = strlen( bfr );
		sgs_membuf_appbuf( &D->input, D->C, bfr, len );
		if( len && bfr[ len - 1 ] == '\n' )
			break;
	}
	sgs_membuf_appchr( &D->input, D->C, 0 );
	
	/* parse first word */
	while( i < wsz && i < D->input.size && isalpha( D->input.ptr[ i ] ) )
	{
		D->iword[ i ] = D->input.ptr[ i ];
		i++;
	}
	D->iword[ i ] = 0;
}
Пример #2
0
void ss_ResetBuffer()
{
	sgs_membuf_resize( &g_tmpbuf, g_C, 0 );
}
Пример #3
0
char* ss_RequestMemory( size_t numbytes )
{
	sgs_membuf_resize( &g_tmpbuf, g_C, g_tmpbuf.size + numbytes );
	return g_tmpbuf.ptr + g_tmpbuf.size - numbytes;
}
Пример #4
0
static void mode3hook( void* userdata, SGS_CTX, int evid )
{
	sgs_ProfData* P = (sgs_ProfData*) userdata;
	if( P->hfn )
		P->hfn( P->hctx, C, evid );
	
	if( evid == SGS_HOOK_ENTER || evid == SGS_HOOK_CONT ||
		evid == SGS_HOOK_EXIT || evid == SGS_HOOK_PAUSE )
	{
		SGS_SHCTX_USE;
		mode3item CD = { NULL, S->numallocs, S->numfrees, S->numblocks, (double) S->memsize };
		
		sgs_StackFrame* target = NULL, *sf, *lastrec = NULL;
		mode3item* items = SGS_ASSUME_ALIGNED( P->frametmp.ptr, mode3item );
		size_t i, itemcount = P->frametmp.size / sizeof(mode3item);
		
		if( evid == SGS_HOOK_ENTER || evid == SGS_HOOK_CONT )
			target = C->sf_last;
		else if( evid == SGS_HOOK_EXIT )
			target = C->sf_last->prev;
		/* pause => null */
		
		/* ignore the case when target = current */
		if( itemcount && items[ itemcount - 1 ].frame == target )
			return;
		
		/* find target in stack */
		for( i = 0; i < itemcount; ++i )
		{
			if( items[ i ].frame == target )
				break;
		}
		if( i == itemcount )
		{
			/* find last recorded frame in call stack */
			sf = NULL;
			if( itemcount )
			{
				sf = C->sf_first;
				while( sf )
				{
					if( items[ itemcount - 1 ].frame == sf )
						break;
					sf = sf->next;
				}
			}
			lastrec = sf;
			if( sf == NULL || target == NULL )
				i = 0; /* frame not found/req., remove everything */
			/* otherwise, remove nothing, it's an "ENTER" */
		}
		else
			i++; /* remove starting from next frame */
		
		/* if there is anything to remove */
		if( i < itemcount )
		{
			size_t bki = i;
			sf = C->sf_first;
			/* generate core key (from start to first removed incl.) */
			sgs_membuf_resize( &P->keytmp, C, 0 );
			while( sf && sf != items[ i ].frame )
			{
				const char* fname = "<error>";
				sgs_StackFrameInfo( C, sf, &fname, NULL, NULL );
				sgs_membuf_appbuf( &P->keytmp, C, fname, strlen( fname ) );
				sgs_membuf_appchr( &P->keytmp, C, 0 );
				sf = sf->next;
			}
			
			/* iterate removable frames (assuming frame pointers are valid) */
			for( ; i < itemcount; ++i )
			{
				const char* fname = "<error>";
				sgs_StackFrameInfo( C, items[ i ].frame, &fname, NULL, NULL );
				sgs_membuf_appbuf( &P->keytmp, C, fname, strlen( fname ) );
				sgs_membuf_appchr( &P->keytmp, C, 0 );
				
				/* commit memory addition */
				{
					mode3item prevCD = items[ i ], *PD;
					sgs_VHTVar* pair = sgs_vht_get_str( &P->prof->timings, P->keytmp.ptr,
						(uint32_t) P->keytmp.size, sgs_HashFunc( P->keytmp.ptr, P->keytmp.size ) );
					if( pair )
					{
						PD = (mode3item*) pair->val.data.P;
					}
					else
					{
						sgs_Variable key, val;
						val.type = SGS_VT_PTR;
						val.data.P = PD = sgs_Alloc( mode3item );
						memset( PD, 0, sizeof(*PD) );
						sgs_InitStringBuf( C, &key, P->keytmp.ptr, (sgs_SizeVal) P->keytmp.size );
						sgs_vht_set( &P->prof->timings, C, &key, &val );
						sgs_Release( C, &key );
					}
					
					PD->numallocs += CD.numallocs - prevCD.numallocs;
					PD->numfrees += CD.numfrees - prevCD.numfrees;
					PD->numblocks += CD.numblocks - prevCD.numblocks;
					PD->szdelta += CD.szdelta - prevCD.szdelta;
				}
			}
			
			/* commit size */
			sgs_membuf_resize( &P->frametmp, C, bki * sizeof(mode3item) );
			itemcount = bki;
		}
		
		/* add new frame start times */
		if( lastrec || ( target != NULL && itemcount == 0 ) )
		{
			if( lastrec )
				sf = lastrec->next;
			else
				sf = C->sf_first;
			while( sf )
			{
				mode3item NI = CD;
				NI.frame = sf;
				sgs_membuf_appbuf( &P->frametmp, C, &NI, sizeof(NI) );
				if( sf == target )
					break;
				sf = sf->next;
			}
		}
	}
	else if( evid == SGS_HOOK_CREAT )
	{
		sgs_ProfAttach( C, P->prof );
	}
	else if( evid == SGS_HOOK_CFREE )
	{
		sgs_ProfDetach( C, P->prof );
	}
	/* CFORK not supported yet */
}