From 7127e14b5dc0bb8fa56fefa3d59ebca0d83983fe Mon Sep 17 00:00:00 2001
From: Andrew Plaza <andrew.plaza15@gmail.com>
Date: Mon, 24 Apr 2017 22:07:02 -0400
Subject: [PATCH] Fix PIT Interrupt Not Context Switching [irq]

PIT interrupt should context switch or else all of redox crashes.
This will fix programs like the Snake game crashing all of Redox.
A global AtomicUSize counter was added, and a line to switch contexts
on every 10 PIT interrupts in irq.rs.
---
 src/interrupt/irq.rs | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/interrupt/irq.rs b/src/interrupt/irq.rs
index 0d8fbcb3..2a27f81a 100644
--- a/src/interrupt/irq.rs
+++ b/src/interrupt/irq.rs
@@ -1,7 +1,12 @@
 use context::timeout;
 use device::pic;
 use device::serial::{COM1, COM2};
+use core::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT};
+
 use time;
+use context;
+
+static PIT_TICKS: AtomicUsize = ATOMIC_USIZE_INIT;
 
 unsafe fn trigger(irq: u8) {
     extern {
@@ -46,6 +51,10 @@ interrupt!(pit, {
 
     pic::MASTER.ack();
 
+    if PIT_TICKS.fetch_add(1, Ordering::SeqCst) % 10 == 0 {
+        context::switch();
+    }
+
     // Any better way of doing this?
     timeout::trigger();
 });
-- 
GitLab