Cancels the assignment of the current interrupt handler to the specified level and disables the level.
BOOLEAN ResetRtInterruptHandler( WORD wLevel );
wLevel
If an interrupt thread has also been assigned to the level, the interrupt thread is deleted.
The level reserved for the system clock (IRQ0_LEVEL) is considered invalid for this call.
Note: This call is the only way to delete an interrupt thread. DeleteRtThread when invoked on an interrupt thread will fail with a status of E_CONTEXT. To cleanly delete an interrupt thread, call ResetRtInterruptHandler from inside the thread. Normally, when a thread runs to completion, it executes the user code associated with RslMain() and RSL_THREAD_DETACH. Calling ResetRtInterruptHandler from outside the interrupt thread will delete the thread but may not clean up all the resources associated with RSLs used by the process. This is a concern if you will be calling SetRtInterruptHandler again within the current process. See example below to show how an interrupt thread might be deleted with a view to recreating it within the same process.
Note: Before INtime version 6.3 there was an error in this call which meant that the RSL handlers did not get called in all cases. An acceptable workaround is to call DeleteRtThread just prior to calling ResetRtInterruptHandler. The DeleteRtThread call will fail with a status of E_CONTEXT, but will always call the RSL handlers, then the subsequent call to ResetRtInterruptHandlers will correctly delete the thread. If the workaround is left in after INtime 6.3 it will correctly fail the DeleteRtThread calls and call the RSL handlers from the ResetRtInterruptHandler call.
The following code show how an interrupt thread might be deleted without leaking resources. The first snippet shows a simplified interrupt thread:
int kill_thread = 0; void int_thread(void *param) { : : while (1) { if (!WaitForRtInterrupt(level, WAIT_FOREVER)) { printf("WaitForRtInterrupt failed: %04x\n", GetLastRtError()); break; } if (kill_thread) { kill_thread = 0; printf("Killing interrupt thread\n"); break; } // TODO: handle interrupt here : } // WORKAROUND for bug described above. DeleteRtThread(NULL_RTHANDLE); // now delete the interrupt thread if (!ResetRtInterruptHandler(level)) { printf("Failed to ResetRtInterruptHandler: %04x\n", GetLastRtError()); } : }
The next snippet shows how to signal the interrupt thread from another thread to cause it to delete itself cleanly.
kill_thread = 1; SignalRtInterruptThread(level);
TRUE
FALSE
E_OK 0x0000
E_CONTEXT 0x0005
E_PARAM 0x8004
wLevel
contains an invalid value. Versions | Defined in | Include | Link to |
---|---|---|---|
INtime 3.0 | intime/rt/includertbase.h | rt.h | rt.lib |