speakup-r empty line lockup
John Covici
covici at ccs.covici.com
Mon Aug 21 19:36:25 EDT 2017
OK, tested the patch, no joy with this one either. Note that a couple
of thehunks sucedded with a bit of line difference, but that should
not be of significance. The procedure I used was to unpatch the
previous one and then put the new one in, same like I did with the
previous patch, unpatch old one and put in new one.
On Mon, 21 Aug 2017 15:24:32 -0400,
Okash Khawaja wrote:
>
> [1 <text/plain; us-ascii (7bit)>]
> Hi,
>
> On Mon, Aug 21, 2017 at 12:23:46PM -0400, John Covici wrote:
> > He rewrote the whole part of the code, adding some new features as
> > well, so the bug mysteriously went away.
>
> I still think the root cause is correct, i.e. interrupt being triggered
> from its own interrupt handler context. The fix however was too broad.
> First one changed the behaviour in all cases. Second one from last night
> narrowed the change to just the interrupt context.
>
> If I had right serial synth, I would try the attached patch. This
> narrows the fix down even further, so that we avoid calling
> speakup_fake_down_arrow() only when we are in context of
> keyboard_notifier_call() which is always invoked in interrupt context,
> in response to a keyboard event.
>
> Thanks,
> Okash
> [2 speakup-r-fix <text/plain; us-ascii (7bit)>]
> ---
> drivers/staging/speakup/main.c | 15 ++++++++++++---
> 1 file changed, 12 insertions(+), 3 deletions(-)
>
> --- a/drivers/staging/speakup/main.c
> +++ b/drivers/staging/speakup/main.c
> @@ -1376,6 +1376,8 @@ static void reset_highlight_buffers(stru
>
> static int read_all_key;
>
> +static volatile int in_keyboard_notifier = 0;
> +
> static void start_read_all_timer(struct vc_data *vc, int command);
>
> enum {
> @@ -1408,7 +1410,10 @@ static void read_all_doc(struct vc_data
> cursor_track = read_all_mode;
> spk_reset_index_count(0);
> if (get_sentence_buf(vc, 0) == -1) {
> - kbd_fakekey2(vc, RA_DOWN_ARROW);
> + del_timer(&cursor_timer);
> + if (!in_keyboard_notifier)
> + speakup_fake_down_arrow();
> + start_read_all_timer(vc, RA_DOWN_ARROW);
> } else {
> say_sentence_num(0, 0);
> synth_insert_next_index(0);
> @@ -2212,8 +2217,10 @@ static int keyboard_notifier_call(struct
> int ret = NOTIFY_OK;
> static int keycode; /* to hold the current keycode */
>
> + in_keyboard_notifier = 1;
> +
> if (vc->vc_mode == KD_GRAPHICS)
> - return ret;
> + goto out;
>
> /*
> * First, determine whether we are handling a fake keypress on
> @@ -2225,7 +2232,7 @@ static int keyboard_notifier_call(struct
> */
>
> if (speakup_fake_key_pressed())
> - return ret;
> + goto out;
>
> switch (code) {
> case KBD_KEYCODE:
> @@ -2266,6 +2273,8 @@ static int keyboard_notifier_call(struct
> break;
> }
> }
> +out:
> + in_keyboard_notifier = 0;
> return ret;
> }
>
--
Your life is like a penny. You're going to lose it. The question is:
How do
you spend it?
John Covici
covici at ccs.covici.com
More information about the Speakup
mailing list