Cygwin: console: Make read() thread-safe.
- Currently read() is somehow not thread-safe. This patch fixes the issue.
This commit is contained in:
		
							parent
							
								
									883abd9d7d
								
							
						
					
					
						commit
						0b64cc6812
					
				|  | @ -1905,6 +1905,8 @@ class fhandler_termios: public fhandler_base | |||
|   tty_min *_tc; | ||||
|   tty *get_ttyp () {return (tty *) tc ();} | ||||
|   int eat_readahead (int n); | ||||
|   virtual void acquire_input_mutex_if_necessary (DWORD ms) {}; | ||||
|   virtual void release_input_mutex_if_necessary (void) {}; | ||||
| 
 | ||||
|  public: | ||||
|   tty_min*& tc () {return _tc;} | ||||
|  | @ -2212,6 +2214,14 @@ private: | |||
|   void __release_input_mutex (const char *fn, int ln); | ||||
|   DWORD __acquire_output_mutex (const char *fn, int ln, DWORD ms); | ||||
|   void __release_output_mutex (const char *fn, int ln); | ||||
|   void acquire_input_mutex_if_necessary (DWORD ms) | ||||
|   { | ||||
|     acquire_input_mutex (ms); | ||||
|   } | ||||
|   void release_input_mutex_if_necessary (void) | ||||
|   { | ||||
|     release_input_mutex (); | ||||
|   } | ||||
| 
 | ||||
|   char *&rabuf (); | ||||
|   size_t &ralen (); | ||||
|  |  | |||
|  | @ -571,31 +571,34 @@ wait_retry: | |||
| #define buf ((char *) pv) | ||||
| 
 | ||||
|       int ret; | ||||
|       acquire_attach_mutex (INFINITE); | ||||
|       acquire_input_mutex (INFINITE); | ||||
|       acquire_attach_mutex (INFINITE); | ||||
|       ret = process_input_message (); | ||||
|       release_input_mutex (); | ||||
|       release_attach_mutex (); | ||||
|       switch (ret) | ||||
| 	{ | ||||
| 	case input_error: | ||||
| 	  release_input_mutex (); | ||||
| 	  goto err; | ||||
| 	case input_processing: | ||||
| 	  release_input_mutex (); | ||||
| 	  continue; | ||||
| 	case input_ok: /* input ready */ | ||||
| 	  break; | ||||
| 	case input_signalled: /* signalled */ | ||||
| 	  release_input_mutex (); | ||||
| 	  goto sig_exit; | ||||
| 	case input_winch: | ||||
| 	  release_input_mutex (); | ||||
| 	  continue; | ||||
| 	default: | ||||
| 	  /* Should not come here */ | ||||
| 	  release_input_mutex (); | ||||
| 	  goto err; | ||||
| 	} | ||||
|     } | ||||
| 
 | ||||
|   /* Check console read-ahead buffer filled from terminal requests */ | ||||
|   acquire_input_mutex (INFINITE); | ||||
|   while (con.cons_rapoi && *con.cons_rapoi && buflen) | ||||
|     { | ||||
|       buf[copied_chars++] = *con.cons_rapoi++; | ||||
|  | @ -984,9 +987,7 @@ fhandler_console::process_input_message (void) | |||
|       if (toadd) | ||||
| 	{ | ||||
| 	  ssize_t ret; | ||||
| 	  release_input_mutex (); | ||||
| 	  line_edit_status res = line_edit (toadd, nread, *ti, &ret); | ||||
| 	  acquire_input_mutex (INFINITE); | ||||
| 	  if (res == line_edit_signalled) | ||||
| 	    { | ||||
| 	      stat = input_signalled; | ||||
|  |  | |||
|  | @ -332,7 +332,9 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti, | |||
| 
 | ||||
| 	  termios_printf ("got interrupt %d, sending signal %d", c, sig); | ||||
| 	  eat_readahead (-1); | ||||
| 	  release_input_mutex_if_necessary (); | ||||
| 	  tc ()->kill_pgrp (sig); | ||||
| 	  acquire_input_mutex_if_necessary (INFINITE); | ||||
| 	  ti.c_lflag &= ~FLUSHO; | ||||
| 	  sawsig = true; | ||||
| 	  goto restart_output; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue