Blame tests/trace/windows/stacktrace.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "win32/w32_stack.h"
Packit Service 20376f
Packit Service 20376f
#if defined(GIT_MSVC_CRTDBG)
Packit Service 20376f
static void a(void)
Packit Service 20376f
{
Packit Service 20376f
	char buf[10000];
Packit Service 20376f
Packit Service 20376f
	cl_assert(git_win32__stack(buf, sizeof(buf), 0, NULL, NULL) == 0);
Packit Service 20376f
Packit Service 20376f
#if 0
Packit Service 20376f
	fprintf(stderr, "Stacktrace from [%s:%d]:\n%s\n", __FILE__, __LINE__, buf);
Packit Service 20376f
#endif
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static void b(void)
Packit Service 20376f
{
Packit Service 20376f
	a();
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static void c(void)
Packit Service 20376f
{
Packit Service 20376f
	b();
Packit Service 20376f
}
Packit Service 20376f
#endif
Packit Service 20376f
Packit Service 20376f
void test_trace_windows_stacktrace__basic(void)
Packit Service 20376f
{
Packit Service 20376f
#if defined(GIT_MSVC_CRTDBG)
Packit Service 20376f
	c();
Packit Service 20376f
#endif
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
Packit Service 20376f
void test_trace_windows_stacktrace__leaks(void)
Packit Service 20376f
{
Packit Service 20376f
#if defined(GIT_MSVC_CRTDBG)
Packit Service 20376f
	void * p1;
Packit Service 20376f
	void * p2;
Packit Service 20376f
	void * p3;
Packit Service 20376f
	void * p4;
Packit Service 20376f
	int before, after;
Packit Service 20376f
	int leaks;
Packit Service 20376f
	int error;
Packit Service 20376f
Packit Service 20376f
	/* remember outstanding leaks due to set setup
Packit Service 20376f
	 * and set mark/checkpoint.
Packit Service 20376f
	 */
Packit Service 20376f
	before = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__QUIET |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__LEAKS_TOTAL |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__SET_MARK,
Packit Service 20376f
		NULL);
Packit Service 20376f
Packit Service 20376f
	p1 = git__malloc(5);
Packit Service 20376f
	leaks = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__QUIET |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__LEAKS_SINCE_MARK,
Packit Service 20376f
		"p1");
Packit Service 20376f
	cl_assert((leaks == 1));
Packit Service 20376f
Packit Service 20376f
	p2 = git__malloc(5);
Packit Service 20376f
	leaks = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__QUIET |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__LEAKS_SINCE_MARK,
Packit Service 20376f
		"p1,p2");
Packit Service 20376f
	cl_assert((leaks == 2));
Packit Service 20376f
Packit Service 20376f
	p3 = git__malloc(5);
Packit Service 20376f
	leaks = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__QUIET |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__LEAKS_SINCE_MARK,
Packit Service 20376f
		"p1,p2,p3");
Packit Service 20376f
	cl_assert((leaks == 3));
Packit Service 20376f
Packit Service 20376f
	git__free(p2);
Packit Service 20376f
	leaks = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__QUIET |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__LEAKS_SINCE_MARK,
Packit Service 20376f
		"p1,p3");
Packit Service 20376f
	cl_assert((leaks == 2));
Packit Service 20376f
Packit Service 20376f
	/* move the mark. only new leaks should appear afterwards */
Packit Service 20376f
	error = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__SET_MARK,
Packit Service 20376f
		NULL);
Packit Service 20376f
	cl_assert((error == 0));
Packit Service 20376f
Packit Service 20376f
	leaks = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__QUIET |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__LEAKS_SINCE_MARK,
Packit Service 20376f
		"not_p1,not_p3");
Packit Service 20376f
	cl_assert((leaks == 0));
Packit Service 20376f
Packit Service 20376f
	p4 = git__malloc(5);
Packit Service 20376f
	leaks = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__QUIET |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__LEAKS_SINCE_MARK,
Packit Service 20376f
		"p4,not_p1,not_p3");
Packit Service 20376f
	cl_assert((leaks == 1));
Packit Service 20376f
Packit Service 20376f
	git__free(p1);
Packit Service 20376f
	git__free(p3);
Packit Service 20376f
	leaks = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__QUIET |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__LEAKS_SINCE_MARK,
Packit Service 20376f
		"p4");
Packit Service 20376f
	cl_assert((leaks == 1));
Packit Service 20376f
Packit Service 20376f
	git__free(p4);
Packit Service 20376f
	leaks = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__QUIET |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__LEAKS_SINCE_MARK,
Packit Service 20376f
		"end");
Packit Service 20376f
	cl_assert((leaks == 0));
Packit Service 20376f
Packit Service 20376f
	/* confirm current absolute leaks count matches beginning value. */
Packit Service 20376f
	after = git_win32__crtdbg_stacktrace__dump(
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__QUIET |
Packit Service 20376f
		GIT_WIN32__CRTDBG_STACKTRACE__LEAKS_TOTAL,
Packit Service 20376f
		"total");
Packit Service 20376f
	cl_assert((before == after));
Packit Service 20376f
#endif
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
#if defined(GIT_MSVC_CRTDBG)
Packit Service 20376f
static void aux_cb_alloc__1(unsigned int *aux_id)
Packit Service 20376f
{
Packit Service 20376f
	static unsigned int aux_counter = 0;
Packit Service 20376f
Packit Service 20376f
	*aux_id = aux_counter++;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static void aux_cb_lookup__1(unsigned int aux_id, char *aux_msg, unsigned int aux_msg_len)
Packit Service 20376f
{
Packit Service 20376f
	p_snprintf(aux_msg, aux_msg_len, "\tQQ%08x\n", aux_id);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
#endif
Packit Service 20376f
Packit Service 20376f
void test_trace_windows_stacktrace__aux1(void)
Packit Service 20376f
{
Packit Service 20376f
#if defined(GIT_MSVC_CRTDBG)
Packit Service 20376f
	git_win32__stack__set_aux_cb(aux_cb_alloc__1, aux_cb_lookup__1);
Packit Service 20376f
	c();
Packit Service 20376f
	c();
Packit Service 20376f
	c();
Packit Service 20376f
	c();
Packit Service 20376f
	git_win32__stack__set_aux_cb(NULL, NULL);
Packit Service 20376f
#endif
Packit Service 20376f
}