From 365925a9ad6cac4f125a12cc184ddff3c7e6b8df Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Thu, 26 Jun 2014 11:55:02 +0200 Subject: [PATCH] ps2_drv: handle event-queue overflow Fixes #1185 --- repos/os/src/drivers/input/ps2/ps2_keyboard.h | 5 +++++ repos/os/src/drivers/input/ps2/ps2_mouse.h | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/repos/os/src/drivers/input/ps2/ps2_keyboard.h b/repos/os/src/drivers/input/ps2/ps2_keyboard.h index f4a059a7b..26c5dd363 100644 --- a/repos/os/src/drivers/input/ps2/ps2_keyboard.h +++ b/repos/os/src/drivers/input/ps2/ps2_keyboard.h @@ -444,6 +444,11 @@ class Ps2_keyboard : public Input_driver PLOG("post %s, key_code = %d\n", press ? "PRESS" : "RELEASE", key_code); + if (_ev_queue.avail_capacity() == 0) { + PWRN("event queue overflow - dropping events"); + _ev_queue.reset(); + } + /* post event to event queue */ _ev_queue.add(Input::Event(press ? Input::Event::PRESS : Input::Event::RELEASE, diff --git a/repos/os/src/drivers/input/ps2/ps2_mouse.h b/repos/os/src/drivers/input/ps2/ps2_mouse.h index 7896a47bb..9593b9fc4 100644 --- a/repos/os/src/drivers/input/ps2/ps2_mouse.h +++ b/repos/os/src/drivers/input/ps2/ps2_mouse.h @@ -82,6 +82,15 @@ class Ps2_mouse : public Input_driver int _packet_len; int _packet_idx; + void _check_for_event_queue_overflow() + { + if (_ev_queue.avail_capacity()) + return; + + PWRN("event queue overflow - dropping events"); + _ev_queue.reset(); + } + /** * Generate mouse button event on state changes * @@ -97,6 +106,8 @@ class Ps2_mouse : public Input_driver if (verbose) Genode::printf("post %s, key_code = %d\n", new_state ? "PRESS" : "RELEASE", key_code); + _check_for_event_queue_overflow(); + _ev_queue.add(Input::Event(new_state ? Input::Event::PRESS : Input::Event::RELEASE, key_code, 0, 0, 0, 0)); @@ -223,6 +234,8 @@ class Ps2_mouse : public Input_driver if (verbose) Genode::printf("post MOTION, rel_x = %d, rel_y = %d\n", rel_x, rel_y); + _check_for_event_queue_overflow(); + _ev_queue.add(Input::Event(Input::Event::MOTION, 0, 0, 0, rel_x, rel_y)); } @@ -243,6 +256,8 @@ class Ps2_mouse : public Input_driver if (verbose) Genode::printf("post WHEEL, rel_z = %d\n", rel_z); + _check_for_event_queue_overflow(); + _ev_queue.add(Input::Event(Input::Event::WHEEL, 0, 0, 0, 0, rel_z)); }