From 95d3d468ce388d3b52cd33e80119d50d167df3c9 Mon Sep 17 00:00:00 2001
From: Hiroshi Inoue <inoue@tpf.co.jp>
Date: Fri, 24 Sep 1999 05:58:48 +0000
Subject: [PATCH] This is a patch for cygipc library provided by Yutaka Tanida.
 This is necessary to prevent freezing in cygwin port.

---
 doc/README.NT       |   1 +
 src/win32/ipc.patch | 285 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 286 insertions(+)
 create mode 100755 src/win32/ipc.patch

diff --git a/doc/README.NT b/doc/README.NT
index 2d3da02ff1..0a69e09ba2 100644
--- a/doc/README.NT
+++ b/doc/README.NT
@@ -21,6 +21,7 @@ It can be done by done by typing configure, make and make install.
 1. Download the Cygwin32 IPC Package by Ludovic LANGE 
    http://www.multione.capgemini.fr:80/tools/pack_ipc/current.tar.gz
 2. Untar the package and follow the readme instructions.
+2a. Apply the patch from src/win32/ipc.patch
 3. I tested 1.03.
 4. I used the \cygwin-b20\h-i568-cygwin32\i586-cygwin32\lib and
 \cygwin-b20\h-i568-cygwin32\i586-cygwin32\include\sys instead of the
diff --git a/src/win32/ipc.patch b/src/win32/ipc.patch
new file mode 100755
index 0000000000..6abf265570
--- /dev/null
+++ b/src/win32/ipc.patch
@@ -0,0 +1,285 @@
+*** ./ipc-daemon.c.orig	Tue Dec 01 00:04:24 1998
+--- ./ipc-daemon.c	Fri Sep 24 13:34:16 1999
+***************
+*** 270,285 ****
+         {
+          itoa(100*id+Index, LBuff) ;
+          LHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, LBuff) ;
+! 	while (LAdrSem->current_nb[id].current_nb[Index] > 0 )
+! 	{
+!     	 WaitForSingleObject(LHandle, 0) ;
+! 	 LAdrSem->current_nb[id].current_nb[Index]-- ;
+! 	}
+! 	CloseHandle(LHandle) ;
+         }
+         LAdrSem->semary[id] = IPC_UNUSED ;
+         LAdrSem->state[id]  = 0 ;
+        }
+        else
+        {
+         for (Index = 0; Index < sma->sem_nsems; Index++)
+--- 270,284 ----
+         {
+          itoa(100*id+Index, LBuff) ;
+          LHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, LBuff) ;
+!         while (WaitForSingleObject(LHandle, 0) == WAIT_OBJECT_0)
+!           ;
+!         LAdrSem->current_nb[id].current_nb[Index] = 0;
+!         CloseHandle(LHandle) ;
+         }
+         LAdrSem->semary[id] = IPC_UNUSED ;
+         LAdrSem->state[id]  = 0 ;
+        }
++ /*
+        else
+        {
+         for (Index = 0; Index < sma->sem_nsems; Index++)
+***************
+*** 288,293 ****
+--- 287,293 ----
+          LHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, LBuff) ;
+         }
+        }
++ */
+       }
+      }
+  
+*** ./msg.c.orig	Tue Dec 01 00:16:09 1998
+--- ./msg.c	Fri Sep 17 12:50:50 1999
+***************
+*** 57,62 ****
+--- 57,77 ----
+  static int		  GFirstMsg	 = 0;		/*PCPC*/
+  static int		  GFdMsg	    ;		/*PCPC*/
+  
++ /*****************************************/
++ /*	Initialization of static variables   */
++ /*****************************************/
++ static pid_t GProcessId = 0;
++ static void init_globals(void)
++ {
++ 	pid_t pid;
++ 
++ 	if (pid=getpid(), pid != GProcessId)
++ 	{
++ 		GFirstMsg = 0;
++ 		msgbytes = msghdrs = msg_seq = used_queues = max_msqid = 0;
++ 		GProcessId = pid;
++ 	}
++ }
+  /************************************************************************/
+  /* Demande d'acces a la zone partagee de gestion des semaphores		*/
+  /************************************************************************/
+***************
+*** 79,84 ****
+--- 94,100 ----
+  {
+   int LRet ;
+  
++  init_globals();
+   if( GFirstMsg == 0 )
+   {
+    if( IsGSemMsgExist() )
+*** ./sem.c.orig	Tue Dec 01 00:16:25 1998
+--- ./sem.c	Fri Sep 17 12:47:11 1999
+***************
+*** 58,63 ****
+--- 58,78 ----
+  static int		  GFirstSem	 = 0;		/*PCPC*/
+  static int		  GFdSem	    ;		/*PCPC*/
+  
++ static pid_t	GProcessId = 0;
++ 
++ static void	init_globals(void)
++ {
++ 	pid_t pid;
++ 
++ 	if (pid=getpid(), pid != GProcessId)
++ 	{
++ 		GFirstSem = 0;
++ 		used_sems = used_semids = max_semid = 0;
++ 		sem_seq = 0;
++ 		GProcessId = pid;
++ 	}
++ }
++ 
+  /************************************************************************/
+  /* Demande d'acces a la zone partagee de gestion des semaphores		*/
+  /************************************************************************/
+***************
+*** 77,82 ****
+--- 92,98 ----
+  {
+      int LRet ;
+  
++ 	init_globals();
+      if( GFirstSem == 0 )
+      {
+  	if( IsGSemSemExist() )
+***************
+*** 187,193 ****
+      {
+  	CloseHandle ( LHandle ) ;
+      }
+!     LHandle = CreateSemaphore(NULL, 0, 0x7FFFFFFF, LBuff) ;
+      if( LHandle == NULL )
+      {
+  	printf( "Creation de Semaphore \"Sem\" impossible\n" ) ;
+--- 203,209 ----
+      {
+  	CloseHandle ( LHandle ) ;
+      }
+!     LHandle = CreateSemaphore(NULL, 0, 1, LBuff) ;
+      if( LHandle == NULL )
+      {
+  	printf( "Creation de Semaphore \"Sem\" impossible\n" ) ;
+***************
+*** 357,371 ****
+  debug_printf("do_semop : return -EACCES\n");
+  			CYGWIN32_IPCNT_RETURN (-EACCES) ;
+  		    }
+! 		    ReleaseSemaphore(LHandle, sop->sem_op, &LVal) ;
+! 	    	    shareadrsem->current_nb[id].current_nb[sop->sem_num] +=
+! 					sop->sem_op ;
+  		    sem_deconnect() ;
+  		} else {
+  		    if( sop->sem_flg == IPC_NOWAIT )
+  		    {
+! 			LRet = WaitForSingleObject(LHandle, 0) ;
+! 			if( LRet == WAIT_TIMEOUT )
+  			{
+  debug_printf("do_semop : return -EAGAIN\n");
+  			    CYGWIN32_IPCNT_RETURN (-EAGAIN) ;
+--- 373,386 ----
+  debug_printf("do_semop : return -EACCES\n");
+  			CYGWIN32_IPCNT_RETURN (-EACCES) ;
+  		    }
+!     	    shareadrsem->current_nb[id].current_nb[sop->sem_num] +=
+! 				sop->sem_op ;
+  		    sem_deconnect() ;
++ 		    ReleaseSemaphore(LHandle, 1 , &LVal) ;
+  		} else {
+  		    if( sop->sem_flg == IPC_NOWAIT )
+  		    {
+! 			if( sop->sem_op + shareadrsem->current_nb[id].current_nb[sop->sem_num] <0 )
+  			{
+  debug_printf("do_semop : return -EAGAIN\n");
+  			    CYGWIN32_IPCNT_RETURN (-EAGAIN) ;
+***************
+*** 375,390 ****
+  debug_printf("do_semop : return -EACCES\n");
+  			    CYGWIN32_IPCNT_RETURN (-EACCES) ;
+  			}
+! 	    		shareadrsem->current_nb[id].current_nb[sop->sem_num] -= 1 ;
+  			sem_deconnect() ;
+  		    } else {
+! 			LRet = WaitForSingleObject(LHandle, INFINITE) ;
+  			if (sem_connect() == 0)
+  			{
+  debug_printf("do_semop : return -EACCES\n");
+  			    CYGWIN32_IPCNT_RETURN (-EACCES) ;
+  			}
+! 			    shareadrsem->current_nb[id].current_nb[sop->sem_num] -= 1 ;
+  			    sem_deconnect() ;
+  		    }
+  		}
+--- 390,407 ----
+  debug_printf("do_semop : return -EACCES\n");
+  			    CYGWIN32_IPCNT_RETURN (-EACCES) ;
+  			}
+! 	    		shareadrsem->current_nb[id].current_nb[sop->sem_num] += sop->sem_op;
+  			sem_deconnect() ;
+  		    } else {
+! 		    while(sop->sem_op + shareadrsem->current_nb[id].current_nb[sop->sem_num] <0)
+! 				LRet = WaitForSingleObject(LHandle, INFINITE) ;
+! 		    
+  			if (sem_connect() == 0)
+  			{
+  debug_printf("do_semop : return -EACCES\n");
+  			    CYGWIN32_IPCNT_RETURN (-EACCES) ;
+  			}
+! 			    shareadrsem->current_nb[id].current_nb[sop->sem_num] += sop->sem_op ;
+  			    sem_deconnect() ;
+  		    }
+  		}
+***************
+*** 435,441 ****
+  	char LBuff[100] ;
+  	HANDLE LHandle ;
+  	long LPrevious ;
+- 	int LIndex;
+  
+  debug_printf("semctl : semid=%X semnum=%X cmd=0x%02X arg=%p\n",semid,semnum,cmd,arg);
+  	if (semid < 0 || semnum < 0 || cmd < 0)
+--- 452,457 ----
+***************
+*** 568,589 ****
+  		if( LHandle != NULL )
+  		{
+  		    if( arg.val > shareadrsem->current_nb[id].current_nb[semnum] )
+! 		    {
+! 			ReleaseSemaphore(LHandle,
+! 			arg.val-shareadrsem->current_nb[id].current_nb[semnum],
+! 			&LPrevious) ;
+! 		    }
+! 		    else if (arg.val <
+! 		             shareadrsem->current_nb[id].current_nb[semnum] )
+! 		    {
+! 			for( LIndex = arg.val;
+! 			LIndex < shareadrsem->current_nb[id].current_nb[semnum];
+! 			LIndex++ )
+! 			{
+! 			    WaitForSingleObject(LHandle, 0) ;
+! 			}
+! 		    }
+!             	    shareadrsem->current_nb[id].current_nb[semnum] = arg.val ;
+  		}
+  debug_printf("semctl : SETVAL : return 0\n");
+  		CYGWIN32_IPCNT_RETURN_DECONNECT (0);
+--- 584,591 ----
+  		if( LHandle != NULL )
+  		{
+  		    if( arg.val > shareadrsem->current_nb[id].current_nb[semnum] )
+! 				ReleaseSemaphore(LHandle,1,&LPrevious) ;
+!             shareadrsem->current_nb[id].current_nb[semnum] = arg.val ;
+  		}
+  debug_printf("semctl : SETVAL : return 0\n");
+  		CYGWIN32_IPCNT_RETURN_DECONNECT (0);
+*** ./shm.c.orig	Fri Sep 17 12:46:24 1999
+--- ./shm.c	Fri Sep 17 12:47:11 1999
+***************
+*** 59,64 ****
+--- 59,81 ----
+  static int		  GFirstShm	 = 0;		/*PCPC*/
+  static int		  GFdShm	    ;		/*PCPC*/
+  
++ /*****************************************/
++ /*	Initialization of static variables   */
++ /*****************************************/
++ static pid_t GProcessId = 0;
++ static void init_globals(void)
++ {
++ 	pid_t pid;
++ 
++ 	if (pid=getpid(), pid != GProcessId)
++ 	{
++ 		GFirstShm = 0;
++ 		shm_rss = shm_swp = max_shmid = 0;
++ 		shm_seq = 0;
++ 		GProcessId = pid;
++ 	}
++ }
++ 
+  /************************************************************************/
+  /* Demande d'acces a la zone partagee de gestion des shm		*/
+  /************************************************************************/
+***************
+*** 82,87 ****
+--- 99,105 ----
+  {
+   int LRet ;
+  
++  init_globals();
+   if( GFirstShm == 0 )
+   {
+    if( IsGSemShmExist() )
-- 
2.24.1