From 10b93017a3e307a7c8a93190687b3445d3debb20 Mon Sep 17 00:00:00 2001 From: Natie van Rooyen Date: Mon, 28 Feb 2011 16:49:35 +0100 Subject: [PATCH] atomvmCtrlIntRequest bug fix (and other updates) --- ports/atomvm/atomport.c | 4 ++-- ports/atomvm/atomvm.c | 38 ++++++++++++++++++++++++-------------- ports/atomvm/atomvm.h | 2 +- ports/atomvm/test/main.c | 2 +- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/ports/atomvm/atomport.c b/ports/atomvm/atomport.c index b930fde..7660040 100644 --- a/ports/atomvm/atomport.c +++ b/ports/atomvm/atomport.c @@ -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 ; } diff --git a/ports/atomvm/atomvm.c b/ports/atomvm/atomvm.c index c01c28d..286428a 100644 --- a/ports/atomvm/atomvm.c +++ b/ports/atomvm/atomvm.c @@ -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; iatomvm_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; iatomvm_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 ; diff --git a/ports/atomvm/atomvm.h b/ports/atomvm/atomvm.h index acc10d6..0b61570 100644 --- a/ports/atomvm/atomvm.h +++ b/ports/atomvm/atomvm.h @@ -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 diff --git a/ports/atomvm/test/main.c b/ports/atomvm/test/main.c index 9a7eb99..4bd4efb 100644 --- a/ports/atomvm/test/main.c +++ b/ports/atomvm/test/main.c @@ -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