view vis_threading.h @ 75:0083b2f7b3c7

Partially working implementation of List. Modified build scripts to allow use of other compilers. Fixed some bugs involving method implementations on different types returning different numbers of outputs. Added Fold to the 'builtins' in the comipler.
author Mike Pavone <pavone@retrodev.com>
date Tue, 06 Jul 2010 07:52:59 -0400
parents 76568becd6d6
children
line wrap: on
line source

#ifndef	_VIS_THREADING_H_
#define	_VIS_THREADING_H_

#ifndef COMPILE_THREADS
#ifdef	NO_THREADS
#define	COMPILE_THREADS	1
#else
#define	COMPILE_THREADS	4
#endif
#endif

#if	COMPILE_THREADS > 1

#ifdef WIN32

#include "windows.h"
/*
__inline void VIS_EnterCriticalSectionImpl(short * cs)
{
	int tmp = (int)cs;
	__asm
	{
		mov	ebx, tmp
	CriticalLoop:
		bts	[ebx], 0
		jnc	End
	}
	Sleep(0);
	__asm
	{
		jmp	CriticalLoop
	}
	
End:
	return;
}*/

extern int lock_fail_counter;
extern int lock_counter;
extern int spin_counter;

volatile __inline void VIS_EnterCriticalSectionImpl(short * cs)
{
	int tmp = (int)cs;
	//int spins = 0;
	__asm
	{
		mov	ebx, tmp
	CriticalLoop:
		mov ax, 1
		xchg ax, [ebx]
		test ax, ax
		
		
		jz	End
	}
	//++spins;
	Sleep(0);
	__asm
	{
		jmp	CriticalLoop
	}
	
End:
/*	if(spins > 0)
	{
		tmp = (int)(&lock_fail_counter);
		__asm
		{
			mov ebx, tmp
			lock inc dword ptr [ebx]
		}
		tmp = (int)(&spin_counter);
		__asm
		{
			mov ebx, tmp
			mov eax, spins
			lock xadd dword ptr [ebx], eax
		}
	}
	tmp = (int)(&lock_counter);
	__asm
	{
		mov ebx, tmp
		lock inc dword ptr [ebx]
	}*/
	return;
}

volatile __inline void VIS_LeaveCriticalSectionImpl(short * cs)
{
	int tmp = (int)cs;
	__asm
	{
		mov	ebx, tmp
		mov ax, 0
		xchg ax, [ebx]
	}
}
#else
/*
#include <unistd.h>

volatile inline void VIS_EnterCriticalSectionImpl(short * cs)
{
	int code;
VIS_EnterStart:
	asm(
	"movw $1, %%ax\n\t"
	"xchg %%ax, (%1)\n\t"
	"test %%ax, %%ax\n\t"
	"jz VIS_EnterEnd\n\t"
	"movl $1, %0\n\t"
	"jmp VIS_EnterCont\n"
"VIS_EnterEnd:\n\t"
	"movl $0, %0\n"
"VIS_EnterCont:":
	"=r"(code):
	"r"(cs):
	"%ax");
	if(!code)
		return;
	sleep(0);
	goto VIS_EnterStart;
}

volatile inline void VIS_LeaveCriticalSectionImpl(short * cs)
{
	asm(
	"movw $0, %%ax\n\t"
	"mfence\n\t"
	"xchg %%ax, (%0)"::
	"r"(cs):
	"%ax");
}*/
#ifdef CPLUSPLUS
extern "C" {
#endif
volatile void VIS_EnterCriticalSectionImpl(short * cs);
volatile void VIS_LeaveCriticalSectionImpl(short * cs);

#ifdef CPLUSPLUS
}
#endif

#endif //Win32

#ifdef USE_OS_PRIMITIVES
#ifdef WIN32
//TODO fill this in
#else
#ifdef SYLLABLE
//TODO fill this in
#else
#include <pthread.h>
#define	VIS_CRITICAL_SECTION(cs)	pthread_mutex_t cs;
#define VIS_EXTERN_CRITICAL_SECTION(cs)	extern pthread_mutex_t cs;
#define	VIS_InitializeCriticalSection(cs)	pthread_mutex_init(&(cs), NULL)
#define VIS_EnterCriticalSection(cs)		pthread_mutex_lock(&(cs))
#define VIS_LeaveCriticalSection(cs)		pthread_mutex_unlock(&(cs))
#define	VIS_DeleteCriticalSection(cs)		pthread_mutex_destroy(&(cs))
#endif //SYLLABLE
#endif //WIN32
#else
#define	VIS_CRITICAL_SECTION(cs)	short cs;//CRITICAL_SECTION cs;//
#define VIS_EXTERN_CRITICAL_SECTION(cs)	extern short cs;
#define	VIS_InitializeCriticalSection(cs)	cs = 0
#define VIS_EnterCriticalSection(cs)		VIS_EnterCriticalSectionImpl(&(cs))
#define VIS_LeaveCriticalSection(cs)		cs = 0//VIS_LeaveCriticalSectionImpl(&(cs))
#define	VIS_DeleteCriticalSection(cs)
#endif/*
#define	VIS_InitializeCriticalSection(cs)	InitializeCriticalSectionAndSpinCount(&(cs),0x400);
#define VIS_EnterCriticalSection(cs)		EnterCriticalSection(&(cs))
#define VIS_LeaveCriticalSection(cs)		LeaveCriticalSection(&(cs))
#define	VIS_DeleteCriticalSection(cs)		DeleteCriticalSection(&(cs))*/

#ifdef WIN32

#define	VIS_Event(evt)			HANDLE evt;
#define	VIS_CreateEvent(evt)	evt = CreateEvent(NULL, TRUE, FALSE, NULL)
#define VIS_DestroyEvent(evt)	CloseHandle(evt)
#define	VIS_SetEvent(evt)		SetEvent(evt)
#define	VIS_ResetEvent(evt)		ResetEvent(evt)
#define	VIS_WaitEvent(evt)		WaitForSingleObject(evt, INFINITE)

#else
#ifdef SYLLABLE
//TODO fill this in
#define	VIS_Event(evt)
#define	VIS_CreateEvent(evt)
#define VIS_DestroyEvent(evt)
#define	VIS_SetEvent(evt)
#define	VIS_ResetEvent(evt)
#define	VIS_WaitEvent(evt)	sleep(0)
#else
#define	VIS_Event(evt)			pthread_cond_t evt; pthread_mutex_t evt##_mutex;
#define	VIS_CreateEvent(evt)	pthread_cond_init(&(evt), NULL); pthread_mutex_init(&(evt##_mutex),NULL)
#define VIS_DestroyEvent(evt)	pthread_cond_destroy(&(evt)); pthread_mutex_destroy(&(evt##_mutex))
#define	VIS_SetEvent(evt)		pthread_mutex_lock(&(evt##_mutex)); pthread_cond_signal(&(evt)); pthread_mutex_unlock(&evt##_mutex);
#define VIS_ResetEvent(evt)
#define	VIS_WaitEvent(evt)		pthread_mutex_lock(&(evt##_mutex)); pthread_cond_wait(&(evt), &(evt##_mutex)); pthread_mutex_unlock(&evt##_mutex)
#endif //SYLLABLE
#endif //WIN32

#ifdef WIN32
	#define VIS_NewThread(func, data)	CreateThread(NULL, 0, func, data, 0, NULL)
#else
#ifdef SYLLABLE
	#define VIS_NewThread(func, data)	resume_thread(spawn_thread("vis_worker", func, 1, 0, data));
#else
	#include <pthread.h>
	pthread_t pid;
	#define VIS_NewThread(func, data)	pthread_create(&pid, NULL, func, data); 
#endif
#endif

#else

#define	VIS_CRITICAL_SECTION(cs)
#define VIS_EXTERN_CRITICAL_SECTION(cs)
#define	VIS_InitializeCriticalSection(cs)
#define VIS_EnterCriticalSection(cs)
#define VIS_LeaveCriticalSection(cs)
#define	VIS_DeleteCriticalSection(cs)

#define	VIS_Event(evt)
#define	VIS_CreateEvent(evt)
#define VIS_DestroyEvent(evt)
#define	VIS_SetEvent(evt)
#define	VIS_WaitEvent(evt)
#define VIS_ResetEvent(evt)
#define VIS_NewThread(func, data)

#endif //COMPILE_THREADS > 1


#endif //_VIS_THREADING_H_