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