mirror of
https://github.com/kelvinlawson/atomthreads.git
synced 2026-01-17 21:33:15 +01:00
atomvmCtrlIntRequest bug fix (and other updates)
This commit is contained in:
@@ -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 ;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 ;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user