diff --git a/kernel/device/ps2_kb.c b/kernel/device/ps2_kb.c index 3947022..70b7c99 100644 --- a/kernel/device/ps2_kb.c +++ b/kernel/device/ps2_kb.c @@ -215,8 +215,18 @@ int ps2kb_read_key (struct device* device, struct device_op_ctx* op_ctx, void* a /* didn't pop anything */ if (prev_count == new_count) { + spin_lock (&ps2kb_sq.lock); + struct list_node_link* node = ps2kb_sq.proc_list; + spin_unlock (&ps2kb_sq.lock); + + if (node != NULL) { + spin_unlock (&ps2kb_ringbuffer_lock); + return -ST_PERMISSION_ERROR; + } + *op_ctx->reschedule = proc_sq_suspend (op_ctx->proc, &ps2kb_sq, &ps2kb_ringbuffer_lock, op_ctx->reschedule_cpu); + return ST_OK; }