Skip to content

Commit 95d3d46

Browse files
author
Hiroshi Inoue
committed
This is a patch for cygipc library provided by Yutaka Tanida. This is necessary to prevent freezing in cygwin port.
1 parent e812458 commit 95d3d46

File tree

2 files changed

+286
-0
lines changed

2 files changed

+286
-0
lines changed

doc/README.NT

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ It can be done by done by typing configure, make and make install.
2121
1. Download the Cygwin32 IPC Package by Ludovic LANGE
2222
http://www.multione.capgemini.fr:80/tools/pack_ipc/current.tar.gz
2323
2. Untar the package and follow the readme instructions.
24+
2a. Apply the patch from src/win32/ipc.patch
2425
3. I tested 1.03.
2526
4. I used the \cygwin-b20\h-i568-cygwin32\i586-cygwin32\lib and
2627
\cygwin-b20\h-i568-cygwin32\i586-cygwin32\include\sys instead of the

src/win32/ipc.patch

Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,285 @@
1+
*** ./ipc-daemon.c.orig Tue Dec 01 00:04:24 1998
2+
--- ./ipc-daemon.c Fri Sep 24 13:34:16 1999
3+
***************
4+
*** 270,285 ****
5+
{
6+
itoa(100*id+Index, LBuff) ;
7+
LHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, LBuff) ;
8+
! while (LAdrSem->current_nb[id].current_nb[Index] > 0 )
9+
! {
10+
! WaitForSingleObject(LHandle, 0) ;
11+
! LAdrSem->current_nb[id].current_nb[Index]-- ;
12+
! }
13+
! CloseHandle(LHandle) ;
14+
}
15+
LAdrSem->semary[id] = IPC_UNUSED ;
16+
LAdrSem->state[id] = 0 ;
17+
}
18+
else
19+
{
20+
for (Index = 0; Index < sma->sem_nsems; Index++)
21+
--- 270,284 ----
22+
{
23+
itoa(100*id+Index, LBuff) ;
24+
LHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, LBuff) ;
25+
! while (WaitForSingleObject(LHandle, 0) == WAIT_OBJECT_0)
26+
! ;
27+
! LAdrSem->current_nb[id].current_nb[Index] = 0;
28+
! CloseHandle(LHandle) ;
29+
}
30+
LAdrSem->semary[id] = IPC_UNUSED ;
31+
LAdrSem->state[id] = 0 ;
32+
}
33+
+ /*
34+
else
35+
{
36+
for (Index = 0; Index < sma->sem_nsems; Index++)
37+
***************
38+
*** 288,293 ****
39+
--- 287,293 ----
40+
LHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, LBuff) ;
41+
}
42+
}
43+
+ */
44+
}
45+
}
46+
47+
*** ./msg.c.orig Tue Dec 01 00:16:09 1998
48+
--- ./msg.c Fri Sep 17 12:50:50 1999
49+
***************
50+
*** 57,62 ****
51+
--- 57,77 ----
52+
static int GFirstMsg = 0; /*PCPC*/
53+
static int GFdMsg ; /*PCPC*/
54+
55+
+ /*****************************************/
56+
+ /* Initialization of static variables */
57+
+ /*****************************************/
58+
+ static pid_t GProcessId = 0;
59+
+ static void init_globals(void)
60+
+ {
61+
+ pid_t pid;
62+
+
63+
+ if (pid=getpid(), pid != GProcessId)
64+
+ {
65+
+ GFirstMsg = 0;
66+
+ msgbytes = msghdrs = msg_seq = used_queues = max_msqid = 0;
67+
+ GProcessId = pid;
68+
+ }
69+
+ }
70+
/************************************************************************/
71+
/* Demande d'acces a la zone partagee de gestion des semaphores */
72+
/************************************************************************/
73+
***************
74+
*** 79,84 ****
75+
--- 94,100 ----
76+
{
77+
int LRet ;
78+
79+
+ init_globals();
80+
if( GFirstMsg == 0 )
81+
{
82+
if( IsGSemMsgExist() )
83+
*** ./sem.c.orig Tue Dec 01 00:16:25 1998
84+
--- ./sem.c Fri Sep 17 12:47:11 1999
85+
***************
86+
*** 58,63 ****
87+
--- 58,78 ----
88+
static int GFirstSem = 0; /*PCPC*/
89+
static int GFdSem ; /*PCPC*/
90+
91+
+ static pid_t GProcessId = 0;
92+
+
93+
+ static void init_globals(void)
94+
+ {
95+
+ pid_t pid;
96+
+
97+
+ if (pid=getpid(), pid != GProcessId)
98+
+ {
99+
+ GFirstSem = 0;
100+
+ used_sems = used_semids = max_semid = 0;
101+
+ sem_seq = 0;
102+
+ GProcessId = pid;
103+
+ }
104+
+ }
105+
+
106+
/************************************************************************/
107+
/* Demande d'acces a la zone partagee de gestion des semaphores */
108+
/************************************************************************/
109+
***************
110+
*** 77,82 ****
111+
--- 92,98 ----
112+
{
113+
int LRet ;
114+
115+
+ init_globals();
116+
if( GFirstSem == 0 )
117+
{
118+
if( IsGSemSemExist() )
119+
***************
120+
*** 187,193 ****
121+
{
122+
CloseHandle ( LHandle ) ;
123+
}
124+
! LHandle = CreateSemaphore(NULL, 0, 0x7FFFFFFF, LBuff) ;
125+
if( LHandle == NULL )
126+
{
127+
printf( "Creation de Semaphore \"Sem\" impossible\n" ) ;
128+
--- 203,209 ----
129+
{
130+
CloseHandle ( LHandle ) ;
131+
}
132+
! LHandle = CreateSemaphore(NULL, 0, 1, LBuff) ;
133+
if( LHandle == NULL )
134+
{
135+
printf( "Creation de Semaphore \"Sem\" impossible\n" ) ;
136+
***************
137+
*** 357,371 ****
138+
debug_printf("do_semop : return -EACCES\n");
139+
CYGWIN32_IPCNT_RETURN (-EACCES) ;
140+
}
141+
! ReleaseSemaphore(LHandle, sop->sem_op, &LVal) ;
142+
! shareadrsem->current_nb[id].current_nb[sop->sem_num] +=
143+
! sop->sem_op ;
144+
sem_deconnect() ;
145+
} else {
146+
if( sop->sem_flg == IPC_NOWAIT )
147+
{
148+
! LRet = WaitForSingleObject(LHandle, 0) ;
149+
! if( LRet == WAIT_TIMEOUT )
150+
{
151+
debug_printf("do_semop : return -EAGAIN\n");
152+
CYGWIN32_IPCNT_RETURN (-EAGAIN) ;
153+
--- 373,386 ----
154+
debug_printf("do_semop : return -EACCES\n");
155+
CYGWIN32_IPCNT_RETURN (-EACCES) ;
156+
}
157+
! shareadrsem->current_nb[id].current_nb[sop->sem_num] +=
158+
! sop->sem_op ;
159+
sem_deconnect() ;
160+
+ ReleaseSemaphore(LHandle, 1 , &LVal) ;
161+
} else {
162+
if( sop->sem_flg == IPC_NOWAIT )
163+
{
164+
! if( sop->sem_op + shareadrsem->current_nb[id].current_nb[sop->sem_num] <0 )
165+
{
166+
debug_printf("do_semop : return -EAGAIN\n");
167+
CYGWIN32_IPCNT_RETURN (-EAGAIN) ;
168+
***************
169+
*** 375,390 ****
170+
debug_printf("do_semop : return -EACCES\n");
171+
CYGWIN32_IPCNT_RETURN (-EACCES) ;
172+
}
173+
! shareadrsem->current_nb[id].current_nb[sop->sem_num] -= 1 ;
174+
sem_deconnect() ;
175+
} else {
176+
! LRet = WaitForSingleObject(LHandle, INFINITE) ;
177+
if (sem_connect() == 0)
178+
{
179+
debug_printf("do_semop : return -EACCES\n");
180+
CYGWIN32_IPCNT_RETURN (-EACCES) ;
181+
}
182+
! shareadrsem->current_nb[id].current_nb[sop->sem_num] -= 1 ;
183+
sem_deconnect() ;
184+
}
185+
}
186+
--- 390,407 ----
187+
debug_printf("do_semop : return -EACCES\n");
188+
CYGWIN32_IPCNT_RETURN (-EACCES) ;
189+
}
190+
! shareadrsem->current_nb[id].current_nb[sop->sem_num] += sop->sem_op;
191+
sem_deconnect() ;
192+
} else {
193+
! while(sop->sem_op + shareadrsem->current_nb[id].current_nb[sop->sem_num] <0)
194+
! LRet = WaitForSingleObject(LHandle, INFINITE) ;
195+
!
196+
if (sem_connect() == 0)
197+
{
198+
debug_printf("do_semop : return -EACCES\n");
199+
CYGWIN32_IPCNT_RETURN (-EACCES) ;
200+
}
201+
! shareadrsem->current_nb[id].current_nb[sop->sem_num] += sop->sem_op ;
202+
sem_deconnect() ;
203+
}
204+
}
205+
***************
206+
*** 435,441 ****
207+
char LBuff[100] ;
208+
HANDLE LHandle ;
209+
long LPrevious ;
210+
- int LIndex;
211+
212+
debug_printf("semctl : semid=%X semnum=%X cmd=0x%02X arg=%p\n",semid,semnum,cmd,arg);
213+
if (semid < 0 || semnum < 0 || cmd < 0)
214+
--- 452,457 ----
215+
***************
216+
*** 568,589 ****
217+
if( LHandle != NULL )
218+
{
219+
if( arg.val > shareadrsem->current_nb[id].current_nb[semnum] )
220+
! {
221+
! ReleaseSemaphore(LHandle,
222+
! arg.val-shareadrsem->current_nb[id].current_nb[semnum],
223+
! &LPrevious) ;
224+
! }
225+
! else if (arg.val <
226+
! shareadrsem->current_nb[id].current_nb[semnum] )
227+
! {
228+
! for( LIndex = arg.val;
229+
! LIndex < shareadrsem->current_nb[id].current_nb[semnum];
230+
! LIndex++ )
231+
! {
232+
! WaitForSingleObject(LHandle, 0) ;
233+
! }
234+
! }
235+
! shareadrsem->current_nb[id].current_nb[semnum] = arg.val ;
236+
}
237+
debug_printf("semctl : SETVAL : return 0\n");
238+
CYGWIN32_IPCNT_RETURN_DECONNECT (0);
239+
--- 584,591 ----
240+
if( LHandle != NULL )
241+
{
242+
if( arg.val > shareadrsem->current_nb[id].current_nb[semnum] )
243+
! ReleaseSemaphore(LHandle,1,&LPrevious) ;
244+
! shareadrsem->current_nb[id].current_nb[semnum] = arg.val ;
245+
}
246+
debug_printf("semctl : SETVAL : return 0\n");
247+
CYGWIN32_IPCNT_RETURN_DECONNECT (0);
248+
*** ./shm.c.orig Fri Sep 17 12:46:24 1999
249+
--- ./shm.c Fri Sep 17 12:47:11 1999
250+
***************
251+
*** 59,64 ****
252+
--- 59,81 ----
253+
static int GFirstShm = 0; /*PCPC*/
254+
static int GFdShm ; /*PCPC*/
255+
256+
+ /*****************************************/
257+
+ /* Initialization of static variables */
258+
+ /*****************************************/
259+
+ static pid_t GProcessId = 0;
260+
+ static void init_globals(void)
261+
+ {
262+
+ pid_t pid;
263+
+
264+
+ if (pid=getpid(), pid != GProcessId)
265+
+ {
266+
+ GFirstShm = 0;
267+
+ shm_rss = shm_swp = max_shmid = 0;
268+
+ shm_seq = 0;
269+
+ GProcessId = pid;
270+
+ }
271+
+ }
272+
+
273+
/************************************************************************/
274+
/* Demande d'acces a la zone partagee de gestion des shm */
275+
/************************************************************************/
276+
***************
277+
*** 82,87 ****
278+
--- 99,105 ----
279+
{
280+
int LRet ;
281+
282+
+ init_globals();
283+
if( GFirstShm == 0 )
284+
{
285+
if( IsGSemShmExist() )

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy