atomvmCtrlIntRequest bug fix (and other updates)

This commit is contained in:
Natie van Rooyen
2011-02-28 16:49:35 +01:00
parent 2e99ef35d5
commit 10b93017a3
4 changed files with 28 additions and 18 deletions

View File

@@ -54,14 +54,14 @@ void
atomvmRun ()
{
atomvmCtrlInit (&the_atomvm) ;
cntrl_thread = CreateThread (NULL, 0, cntrl_thread_proc, 0, CREATE_SUSPENDED, NULL) ;
cntrl_thread = CreateThread (NULL, 0, cntrl_thread_proc, (uint32_t*)the_atomvm, CREATE_SUSPENDED, NULL) ;
ResumeThread (cntrl_thread) ;
}
DWORD WINAPI
cntrl_thread_proc (LPVOID lpParameter)
{
atomvmCtrlRun (the_atomvm, 0) ;
atomvmCtrlRun ((HATOMVM)lpParameter, 0) ;
return 0 ;
}

View File

@@ -176,6 +176,7 @@ typedef struct ATOMVM_S {
HANDLE atomvm_int ;
HANDLE atomvm_int_complete ;
HANDLE atomvm_close ;
HANDLE atomvm_event ;
/* next ISR */
volatile void (*isr)(void) ;
@@ -203,8 +204,7 @@ typedef struct ATOMVM_S {
/* Global declarations */
volatile uint32_t g_atomvm_counter = 0 ;
HANDLE g_atomvm_event = 0 ;
DWORD g_atomvm_tls_idx ;
volatile DWORD g_atomvm_tls_idx ;
PATOMVM g_vms[ATOMVM_MAX_VM] ;
@@ -244,7 +244,6 @@ atomvmCtrlInit (HATOMVM *atomvm)
patomvm->atomvm_id = InterlockedIncrement(&g_atomvm_counter) - 1 ;
if (patomvm->atomvm_id == 0) {
g_atomvm_event = CreateEvent (NULL, FALSE, FALSE, 0) ;
g_atomvm_tls_idx = TlsAlloc () ;
for (i=0; i<ATOMVM_MAX_VM; i++) {
g_vms[i] = 0 ;
@@ -256,6 +255,7 @@ atomvmCtrlInit (HATOMVM *atomvm)
patomvm->atomvm_int = CreateEvent (NULL, TRUE, FALSE, 0) ;
patomvm->atomvm_int_complete = CreateEvent (NULL, FALSE, TRUE, 0) ;
patomvm->atomvm_close = CreateEvent (NULL, TRUE, FALSE, 0) ;
patomvm->atomvm_event = CreateEvent (NULL, FALSE, FALSE, 0) ;
patomvm->vm_thread = CreateThread (NULL, 0, vm_thread, (void*)patomvm, CREATE_SUSPENDED, NULL) ;
@@ -385,6 +385,10 @@ atomvmCtrlRun (HATOMVM atomvm, uint32_t flags)
break ;
} else {
ATOMVM_ASSERT(res == 1 , _T("WaitForMultipleObjects failed")) ;
}
}
@@ -554,9 +558,9 @@ atomvmEnterCritical ()
* \ingroup atomvm
* \b atomvmCriticalCount
*
* Rerurns the critical count of the current context.
* Rerurns the critical cont of the current context.
*
* @return the critical count of the current context.
* @return the critical cont of the current context.
*/
int32_t
atomvmCriticalCount ()
@@ -591,7 +595,7 @@ atomvmCtrlIntRequest (HATOMVM atomvm, uint32_t isr)
PATOMVM patomvm = (PATOMVM) atomvm ;
WaitForSingleObject (patomvm->atomvm_int_complete, INFINITE) ;
while (InterlockedCompareExchange ((volatile uint32_t *)&patomvm->isr, isr, 0) == 0) {
while (InterlockedCompareExchange ((volatile uint32_t *)&patomvm->isr, isr, 0) != 0) {
SwitchToThread() ;
}
SetEvent (patomvm->atomvm_int) ;
@@ -818,7 +822,7 @@ atomvmGetVmId ()
uint32_t
callbackEventWait (PATOMVM patomvm, PATOMVM_CALLBACK callback)
{
return WaitForSingleObject (g_atomvm_event, INFINITE) == WAIT_OBJECT_0 ;
return WaitForSingleObject (patomvm->atomvm_event, INFINITE) == WAIT_OBJECT_0 ;
}
@@ -859,7 +863,14 @@ atomvmEventWait ()
uint32_t
callbackEventSend (PATOMVM patomvm, PATOMVM_CALLBACK callback)
{
return SetEvent (g_atomvm_event) ;
int32_t i ;
for (i=0; i<ATOMVM_MAX_VM; i++) {
if (g_vms[i] && (g_vms[i] != patomvm)) {
SetEvent (g_vms[i]->atomvm_event) ;
}
}
return 1 ;
}
/**
@@ -898,7 +909,7 @@ atomvmEventSend ()
uint32_t
callbackInterruptWait (PATOMVM patomvm, PATOMVM_CALLBACK callback)
{
//WaitForSingleObject (patomvm->atomvm_int_complete, INFINITE) ;
WaitForSingleObject (patomvm->atomvm_int_complete, INFINITE) ;
return WaitForSingleObject (patomvm->atomvm_int, INFINITE) == WAIT_OBJECT_0 ;
}
@@ -943,13 +954,12 @@ callbackScheduleIpi (PATOMVM patomvm, PATOMVM_CALLBACK callback)
PATOMVM_CALLBACK_IPI callback_ipi = (PATOMVM_CALLBACK_IPI)callback ;
uint32_t res = 0 ;
if (callback_ipi->target < ATOMVM_MAX_VM) {
if (g_vms[callback_ipi->target] != patomvm) {
if ((callback_ipi->target < ATOMVM_MAX_VM) &&
(g_vms[callback_ipi->target] != patomvm) ) {
atomvmCtrlIntRequest ((HATOMVM)g_vms[callback_ipi->target], callback_ipi->isr) ;
res = 1 ;
atomvmCtrlIntRequest ((HATOMVM)g_vms[callback_ipi->target], callback_ipi->isr) ;
res = 1 ;
}
}
return res ;

View File

@@ -64,7 +64,7 @@
#if defined _DEBUG || defined DEBUG
#define ATOMVM_ASSERT(x, msg) _ASSERT(x)
#define ATOMVM_ASSERT(x, msg) _ASSERT((x))
#else
#define ATOMVM_ASSERT(x, msg)
#endif

View File

@@ -11,7 +11,7 @@
extern uint32_t test_start (void) ;
#endif
#define TEST_THREADS 51
#define TEST_THREADS 47
#define TEST_STACK_BYTE_SIZE 0x10000
#define IDLE_STACK_BYTE_SIZE 0x10000