Bash and CTRL-C. Problem (almost :-) solved.

Sergey Okhapkin sos@prospect.com.ru
Sun Mar 30 23:21:00 GMT 1997


Hi!

*** /g/cdk/winsup/exceptions.cc	Tue Dec 17 01:03:37 1996
--- exceptions.cc	Sun Mar 30 19:39:05 1997
***************
*** 26,31 ****
--- 26,37 ----
  static BOOL ctrl_c_handler (DWORD);
  static void really_exit (int);
  
+ /* When our process is spawned from other cygwin process, u->self->hTread
+    contains not our thread id, but thread id of parent Win32 process.
+    So, save our thread id here for call_handler()
+ */
+ static HANDLE OurhThread;
+ 
  static const struct
  {
    unsigned int code;
***************
*** 99,104 ****
--- 105,117 ----
  #endif
  
    SetConsoleCtrlHandler (ctrl_c_handler, 1);
+   DuplicateHandle (GetCurrentProcess (),
+ 	     GetCurrentThread (),
+ 	     GetCurrentProcess (),
+ 	     &OurhThread,
+ 	     0,
+ 	     1, /* Want kids to see thread id */
+ 	     DUPLICATE_SAME_ACCESS);
  }
  
  /* Utilities for dumping the stack, etc.  */
***************
*** 308,324 ****
       we have to do that since sometimes they don't return - and if
       this thread doesn't return, you won't ever get another exception. */
  
!   res =   SuspendThread (u->self->hThread);
!   debug_printf ("suspend said %d\n", res);
    orig.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
!   res =   GetThreadContext (u->self->hThread,  &orig);
  
    rethere = orig.Eip;
    orig.Eip =  (unsigned)&&wrap;
!   SetThreadContext (u->self->hThread,  &orig); /* Restart the thread */
    sigfunc = pfunc;
    sigarg = n;
!   ResumeThread (u->self->hThread);
    return;
    /* This code is run in the standard thread space */
   wrap:
--- 321,337 ----
       we have to do that since sometimes they don't return - and if
       this thread doesn't return, you won't ever get another exception. */
  
!   res =   SuspendThread (OurhThread);
!   debug_printf ("suspend said %d error %d\n", res, GetLastError());
    orig.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
!   res =   GetThreadContext (OurhThread,  &orig);
  
    rethere = orig.Eip;
    orig.Eip =  (unsigned)&&wrap;
!   SetThreadContext (OurhThread,  &orig); /* Restart the thread */
    sigfunc = pfunc;
    sigarg = n;
!   ResumeThread (OurhThread);
    return;
    /* This code is run in the standard thread space */
   wrap:
***************
*** 587,593 ****
  	 This is so that ordinary dos progs can look at our
  	 exit value. */
        /* FIXME: exit calls atexit handlers.  */
!       exit ((sig<<8) | 0x10000);
      }
    if ((void *)u->self->sigs[sig].sa_handler == (void *)SIG_IGN)
      {
--- 600,611 ----
  	 This is so that ordinary dos progs can look at our
  	 exit value. */
        /* FIXME: exit calls atexit handlers.  */
!       /*exit ((sig<<8) | 0x10000);*/
! 	 debug_printf ("ctrl_c_handler: type %d, sig %d, about to call exit\n",
! 		type, sig);
! 	 call_handler (exit, (sig<<8) | 0x10000,
! 		(EXCEPTION_RECORD *)0, (CONTEXT *)0);
! 	 return 1;
      }
    if ((void *)u->self->sigs[sig].sa_handler == (void *)SIG_IGN)
      {
***************
*** 595,601 ****
      }
    if ((void *)u->self->sigs[sig].sa_handler == (void *)SIG_ERR)
      {
!       exit (4);
      }
  
    debug_printf ("ctrl_c_handler: type %d, sig %d, about to call %p\n",
--- 613,624 ----
      }
    if ((void *)u->self->sigs[sig].sa_handler == (void *)SIG_ERR)
      {
!       /*exit (4);*/
!       debug_printf ("ctrl_c_handler: type %d, sig %d, about to call exit\n",
! 		type, sig);
!       call_handler (exit, 4,
! 		(EXCEPTION_RECORD *)0, (CONTEXT *)0);
!       return 1;
      }
  
    debug_printf ("ctrl_c_handler: type %d, sig %d, about to call %p\n",
*** /g/cdk/winsup/syscalls.cc	Tue Feb 04 11:51:37 1997
--- syscalls.cc	Sun Mar 30 19:41:26 1997
***************
*** 155,163 ****
  {
    int i;
  
!   for (i = 0; i < getdtablesize(); ++i)
!     if (this_procinfo ()->hmap[i].is_open ()) 
!       _close (i);
  
    process_deletion_queue ();
  }
--- 156,167 ----
  {
    int i;
  
! /* FIXME: This buggy code causes an exception when hmap[i] does not exists.
!    Comment it out for a now
! */
! //  for (i = 0; i < getdtablesize(); ++i)
! //    if (this_procinfo ()->hmap[i].is_open ())
! //      _close (i);
  
    process_deletion_queue ();
  }
*** g:signal.cc Tue Dec 03 13:04:05 1996
--- signal.cc   Sun Mar 30 22:34:46 1997
***************
*** 158,164 ****
        }
        else
        {
!         int res = TerminateProcess (dest->hProcess, sig);
          if (!res)
            {
              __seterrno ();
--- 158,170 ----
        }
        else
        {
!         /* BUG! We cannot use dest->hProcess because this handle is
!            valid only from within childs!
!         */
!         /* int res = TerminateProcess (dest->hProcess, sig);*/
!         HANDLE hP = OpenProcess(PROCESS_TERMINATE, 0, dest->dwProcessId);
!         int res = TerminateProcess (hP, sig);
!         CloseHandle(hP);
          if (!res)
            {
              __seterrno ();

But this patch doesn't help to kill "make" with single ctrl-c... It seems to me, due to missing SIGCLD support in cygwin.dll.

-- 
Sergey Okhapkin
Moscow, Russia
Looking for a job

-
For help on using this list, send a message to
"gnu-win32-request@cygnus.com" with one line of text: "help".



More information about the Cygwin mailing list