The R Project SVN R

Rev

Rev 42642 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 42642 Rev 45070
Line 17... Line 17...
17
#include "psignal.h"
17
#include "psignal.h"
18
extern int UserBreak;
18
extern int UserBreak;
19
 
19
 
20
/* Define stuff ************************************************************ */
20
/* Define stuff ************************************************************ */
21
#ifndef TRUE
21
#ifndef TRUE
22
  #define TRUE 1
22
# define TRUE 1
23
#endif
23
#endif
24
#ifndef FALSE
24
#ifndef FALSE
25
  #define FALSE 0
25
# define FALSE 0
26
#endif
26
#endif
27
 
27
 
28
/* Signal groupings ======================================================== */
28
/* Signal groupings ======================================================== */
29
#define SIGNAL_DEFAULT_EXIT         case SIGABRT:               \
29
#define SIGNAL_DEFAULT_EXIT         case SIGABRT:               \
30
                                    case SIGFPE:                \
30
				    case SIGFPE:                \
31
                                    case SIGILL:                \
31
				    case SIGILL:                \
32
                                    case SIGINT:                \
32
				    case SIGINT:                \
33
                                    case SIGSEGV:               \
33
				    case SIGSEGV:               \
34
                                    case SIGTERM:
34
				    case SIGTERM:
35
 
35
 
36
#define IS_SIGNAL(a)        ( ((a) > 0 ) &&  ((a) < NSIG))
36
#define IS_SIGNAL(a)        ( ((a) > 0 ) &&  ((a) < NSIG))
37
 
37
 
38
 
38
 
39
/* Struct stuff **************************************************************/
39
/* Struct stuff **************************************************************/
40
struct downhill_Signal_Struct
40
struct downhill_Signal_Struct
41
{
41
{
42
	void     (*signal_Handler)(int);
42
    void     (*signal_Handler)(int);
43
	int      signal_Count;
43
    int      signal_Count;
44
	int      signal_Extra;
44
    int      signal_Extra;
45
	sigset_t signal_Mask;
45
    sigset_t signal_Mask;
46
	int      signal_Flags;
46
    int      signal_Flags;
47
};
47
};
48
 
48
 
49
 
49
 
50
/* Static stuff **************************************************************/
50
/* Static stuff **************************************************************/
51
static struct downhill_Signal_Struct* downhill_Signal_Info = NULL;
51
static struct downhill_Signal_Struct* downhill_Signal_Info = NULL;
Line 56... Line 56...
56
 
56
 
57
 
57
 
58
/* Handle a signal ========================================================= */
58
/* Handle a signal ========================================================= */
59
void raise(int signal_Number)
59
void raise(int signal_Number)
60
{
60
{
61
        if (!IS_SIGNAL(signal_Number)) {
61
    if (!IS_SIGNAL(signal_Number)) {
62
			errno = EINVAL;
62
	errno = EINVAL;
63
			return;
63
	return;
64
        }
64
    }
65
	/* Check to see if we're masking this signal */
65
    /* Check to see if we're masking this signal */
66
	if (sigismember(&downhill_Sigset_Mask,signal_Number))
66
    if (sigismember(&downhill_Sigset_Mask,signal_Number))
67
	{
67
    {
68
		downhill_Signal_Info[signal_Number].signal_Count++;
68
	downhill_Signal_Info[signal_Number].signal_Count++;
-
 
69
    }
-
 
70
    else
-
 
71
    {
-
 
72
	/* Do a signal's action */
-
 
73
	if (downhill_Signal_Info[signal_Number].signal_Handler ==
-
 
74
	    SIG_DFL)
-
 
75
	{
-
 
76
	    switch (signal_Number)
-
 
77
	    {
-
 
78
		SIGNAL_DEFAULT_EXIT
-
 
79
		    exit(3);
-
 
80
	    default:
-
 
81
		break;
-
 
82
	    }
69
	}
83
	}
-
 
84
	else if (
-
 
85
	    (downhill_Signal_Info[signal_Number].signal_Handler ==
-
 
86
	     SIG_IGN)
-
 
87
	    )
-
 
88
	{/* IGNORE */}
70
	else
89
	else
71
        {
-
 
72
	        /* Do a signal's action */
-
 
73
		if (downhill_Signal_Info[signal_Number].signal_Handler ==
-
 
74
		 SIG_DFL)
-
 
75
		{
90
	{
76
			switch (signal_Number)
-
 
77
			{
-
 
78
				SIGNAL_DEFAULT_EXIT
-
 
79
					exit(3);
-
 
80
				default:
-
 
81
                                        break;
-
 
82
			}
-
 
83
		}
-
 
84
		else if (
-
 
85
                 (downhill_Signal_Info[signal_Number].signal_Handler == 
-
 
86
                  SIG_IGN)
-
 
87
                )
-
 
88
		  {/* IGNORE */}
-
 
89
		else
-
 
90
		{
-
 
91
			void (*signal_HandlerOld)(int);
91
	    void (*signal_HandlerOld)(int);
92
			/* Do we reset the handler? */
92
	    /* Do we reset the handler? */
93
			signal_HandlerOld =
93
	    signal_HandlerOld =
94
			 downhill_Signal_Info[signal_Number].signal_Handler;
94
		downhill_Signal_Info[signal_Number].signal_Handler;
95
			if (downhill_Signal_Info[signal_Number].signal_Flags&
95
	    if (downhill_Signal_Info[signal_Number].signal_Flags&
96
			 SA_RESETHAND)
96
		SA_RESETHAND)
97
			{
97
	    {
98
				downhill_Signal_Info[signal_Number].
98
		downhill_Signal_Info[signal_Number].
99
				 signal_Handler = SIG_DFL;
99
		    signal_Handler = SIG_DFL;
100
			}
100
	    }
101
			/* Do the action */
101
	    /* Do the action */
102
			if ((signal_Number == SIGCHLD) &&
102
	    if ((signal_Number == SIGCHLD) &&
103
			 (downhill_Signal_Info[signal_Number].signal_Flags&
103
		(downhill_Signal_Info[signal_Number].signal_Flags&
104
			 SA_NOCLDSTOP))
104
		 SA_NOCLDSTOP))
105
			{
105
	    {
106
				/* Ignore SIGCHLD */
106
		/* Ignore SIGCHLD */
107
			}
107
	    }
108
			else
108
	    else
109
			{
109
	    {
110
				sigset_t sigset_MaskOriginal =
110
		sigset_t sigset_MaskOriginal =
111
				          downhill_Sigset_Mask;
111
		    downhill_Sigset_Mask;
112
				sigset_t sigset_MaskNew = downhill_Signal_Info[
112
		sigset_t sigset_MaskNew = downhill_Signal_Info[
113
				          signal_Number].signal_Mask;
113
		    signal_Number].signal_Mask;
114
 
114
 
115
				/* Set the new signal mask */
115
		/* Set the new signal mask */
116
				sigaddset(&sigset_MaskNew,signal_Number);
116
		sigaddset(&sigset_MaskNew,signal_Number);
117
				sigprocmask(SIG_BLOCK,&sigset_MaskNew,NULL);
117
		sigprocmask(SIG_BLOCK,&sigset_MaskNew,NULL);
118
 
118
 
119
				/* Execute the handler */
119
		/* Execute the handler */
120
				signal_HandlerOld(signal_Number);
120
		signal_HandlerOld(signal_Number);
121
 
121
 
122
				/* Restore the signal mask */
122
		/* Restore the signal mask */
123
				sigprocmask(SIG_SETMASK,&sigset_MaskOriginal,
123
		sigprocmask(SIG_SETMASK,&sigset_MaskOriginal,
124
				 NULL);
124
			    NULL);
125
 
125
 
126
			}
126
	    }
127
		}
-
 
128
                PulseEvent(IGotASignal);
-
 
129
	}
127
	}
-
 
128
	PulseEvent(IGotASignal);
-
 
129
    }
130
}
130
}
131
 
131
 
132
/* Init the signal re-direction ============================================ */
132
/* Init the signal re-direction ============================================ */
133
 
133
 
134
/* Hardware interrupt handler.  */
134
/* Hardware interrupt handler.  */
135
static BOOL CALLBACK hwIntrHandler (DWORD type)
135
static BOOL CALLBACK hwIntrHandler (DWORD type)
136
{
136
{
137
  int ret;
137
    int ret;
138
  switch (type) {
138
    switch (type) {
139
  case CTRL_C_EVENT : 
139
    case CTRL_C_EVENT :
140
  case CTRL_BREAK_EVENT : 
140
    case CTRL_BREAK_EVENT :
141
    /*  
141
	/*
142
	Why SIGBREAK? SIGINT is used internally by R and the signal 
142
	  Why SIGBREAK? SIGINT is used internally by R and the signal
143
	handler for SIGINT ends with a 'longjmp'. But, under Windows,
143
	  handler for SIGINT ends with a 'longjmp'. But, under Windows,
144
	hardware interrupt handler runs in a different thread. So,
144
	  hardware interrupt handler runs in a different thread. So,
145
	longjmp fails (tipically it will crash R). So, we raise a SIGBREAK
145
	  longjmp fails (tipically it will crash R). So, we raise a SIGBREAK
146
	to record that the user want to stop. This is then
146
	  to record that the user want to stop. This is then
147
	processed at due time. Drawback of this approach: if R is lost
147
	  processed at due time. Drawback of this approach: if R is lost
148
	inside a C or Fortran routine we don't break it. I (g.m.) have
148
	  inside a C or Fortran routine we don't break it. I (g.m.) have
149
	tried to raise a signal in the appropriate thread using
149
	  tried to raise a signal in the appropriate thread using
150
	SuspendThread/GetThreadContext/setting Eip to the signal handler/
150
	  SuspendThread/GetThreadContext/setting Eip to the signal handler/
151
	SetThreadContext/ResumeThread but I had success only under NT.
151
	  SetThreadContext/ResumeThread but I had success only under NT.
152
    */    
152
	*/
153
    raise(SIGBREAK);
153
	raise(SIGBREAK);
154
    /* Seems that SIGBREAK is not working under 1,4,0, so do it via
154
	/* Seems that SIGBREAK is not working under 1,4,0, so do it via
155
       a semaphore, as RGui does */
155
	   a semaphore, as RGui does */
156
    UserBreak = 1;
156
	UserBreak = 1;
157
    ret = TRUE;
157
	ret = TRUE;
158
    break;
158
	break;
159
  default:
159
    default:
160
    ret = FALSE;
160
	ret = FALSE;
161
  }
161
    }
162
  return ret ; 
162
    return ret ;
163
}
163
}
164
 
164
 
165
static int downhill_Signal_Init(void)
165
static int downhill_Signal_Init(void)
166
{
166
{
167
	/* Skip this if we've already done it */
167
    /* Skip this if we've already done it */
168
	if (downhill_Signal_Info == NULL)
168
    if (downhill_Signal_Info == NULL)
-
 
169
    {
-
 
170
	if (!(downhill_Signal_Info =
-
 
171
	      calloc(sizeof(struct downhill_Signal_Struct),NSIG)) ||
-
 
172
	    !(IGotASignal=CreateEvent(NULL,FALSE,FALSE,NULL)) ||
-
 
173
	    !SetConsoleCtrlHandler (hwIntrHandler, TRUE))
-
 
174
 
169
	{
175
	{
170
		if (!(downhill_Signal_Info =
-
 
171
		      calloc(sizeof(struct downhill_Signal_Struct),NSIG)) ||
-
 
172
		    !(IGotASignal=CreateEvent(NULL,FALSE,FALSE,NULL)) ||
-
 
173
                    !SetConsoleCtrlHandler (hwIntrHandler, TRUE))
-
 
174
 
-
 
175
		{
-
 
176
                  if (downhill_Signal_Info) free(downhill_Signal_Info);  
176
	    if (downhill_Signal_Info) free(downhill_Signal_Info);
177
                  if (IGotASignal) CloseHandle(IGotASignal);
177
	    if (IGotASignal) CloseHandle(IGotASignal);
178
		  errno = ENOMEM;
178
	    errno = ENOMEM;
179
		  return FALSE;
179
	    return FALSE;
180
		}
-
 
181
	}
180
	}
-
 
181
    }
182
	return TRUE;
182
    return TRUE;
183
}
183
}
184
 
184
 
185
/* Set a signal action ===================================================== */
185
/* Set a signal action ===================================================== */
186
int sigaction(int signal_Number,struct sigaction* sigaction_Info,
186
int sigaction(int signal_Number,struct sigaction* sigaction_Info,
187
     struct sigaction* sigaction_InfoOld)
187
     struct sigaction* sigaction_InfoOld)
188
{
188
{
189
	/* Make sure we're init'd */
189
    /* Make sure we're init'd */
190
	if (!downhill_Signal_Init())
190
    if (!downhill_Signal_Init())
191
	{
191
    {
192
		return -1;
192
	return -1;
193
	}
193
    }
194
 
194
 
195
	/* Set the signal */
195
    /* Set the signal */
196
        if (IS_SIGNAL(signal_Number)) {
196
    if (IS_SIGNAL(signal_Number)) {
197
			if (sigaction_InfoOld != NULL)
197
	if (sigaction_InfoOld != NULL)
198
			{
198
	{
199
				sigaction_InfoOld->sa_handler =
199
	    sigaction_InfoOld->sa_handler =
200
				 downhill_Signal_Info[signal_Number].
200
		downhill_Signal_Info[signal_Number].
201
				 signal_Handler;
201
		signal_Handler;
202
				sigaction_InfoOld->sa_mask =
202
	    sigaction_InfoOld->sa_mask =
203
				 downhill_Signal_Info[signal_Number].
203
		downhill_Signal_Info[signal_Number].
204
				 signal_Mask;
204
		signal_Mask;
205
				sigaction_InfoOld->sa_flags =
205
	    sigaction_InfoOld->sa_flags =
206
				 downhill_Signal_Info[signal_Number].
206
		downhill_Signal_Info[signal_Number].
207
				 signal_Flags;
207
		signal_Flags;
208
			}
208
	}
209
			if (sigaction_Info != NULL)
209
	if (sigaction_Info != NULL)
210
			{
210
	{
211
				downhill_Signal_Info[signal_Number].
211
	    downhill_Signal_Info[signal_Number].
212
				 signal_Handler = sigaction_Info->sa_handler;
212
		signal_Handler = sigaction_Info->sa_handler;
213
				downhill_Signal_Info[signal_Number].
213
	    downhill_Signal_Info[signal_Number].
214
				 signal_Count = 0;
214
		signal_Count = 0;
215
				downhill_Signal_Info[signal_Number].
215
	    downhill_Signal_Info[signal_Number].
216
				 signal_Extra = 0;
216
		signal_Extra = 0;
217
				downhill_Signal_Info[signal_Number].
217
	    downhill_Signal_Info[signal_Number].
218
				 signal_Mask = sigaction_Info->sa_mask;
218
		signal_Mask = sigaction_Info->sa_mask;
219
				downhill_Signal_Info[signal_Number].
219
	    downhill_Signal_Info[signal_Number].
220
				 signal_Flags = sigaction_Info->sa_flags;
220
		signal_Flags = sigaction_Info->sa_flags;
221
			}
-
 
222
        }
-
 
223
        else  {
-
 
224
			errno = EINVAL;
-
 
225
			return -1;
-
 
226
	}
221
	}
-
 
222
    }
-
 
223
    else  {
-
 
224
	errno = EINVAL;
-
 
225
	return -1;
-
 
226
    }
227
 
227
 
228
	return 0;
228
    return 0;
229
}
229
}
230
 
230
 
231
/* Set the action of a signal ============================================== */
231
/* Set the action of a signal ============================================== */
232
sighandler_t signal(int signal_Number, sighandler_t signal_Handler)
232
sighandler_t signal(int signal_Number, sighandler_t signal_Handler)
233
{
233
{
234
	sighandler_t signal_HandlerOld;
234
    sighandler_t signal_HandlerOld;
235
 
235
 
236
	/* Make sure we're init'd */
236
    /* Make sure we're init'd */
237
	if (!IS_SIGNAL(signal_Number) || !downhill_Signal_Init() )
237
    if (!IS_SIGNAL(signal_Number) || !downhill_Signal_Init() )
238
	{
238
    {
239
		return SIG_ERR;
239
	return SIG_ERR;
240
	}
240
    }
241
	signal_HandlerOld =
241
    signal_HandlerOld =
242
		downhill_Signal_Info[signal_Number].signal_Handler;
242
	downhill_Signal_Info[signal_Number].signal_Handler;
243
	downhill_Signal_Info[signal_Number].signal_Handler =
243
    downhill_Signal_Info[signal_Number].signal_Handler =
244
		signal_Handler;
244
	signal_Handler;
245
	downhill_Signal_Info[signal_Number].signal_Count = 0;
245
    downhill_Signal_Info[signal_Number].signal_Count = 0;
246
	downhill_Signal_Info[signal_Number].signal_Extra = 0;
246
    downhill_Signal_Info[signal_Number].signal_Extra = 0;
247
	downhill_Signal_Info[signal_Number].signal_Mask = 0;
247
    downhill_Signal_Info[signal_Number].signal_Mask = 0;
248
	downhill_Signal_Info[signal_Number].signal_Flags = 0;
248
    downhill_Signal_Info[signal_Number].signal_Flags = 0;
249
	return signal_HandlerOld;
249
    return signal_HandlerOld;
250
}
250
}
251
 
251
 
252
/* Add a signal to a set =================================================== */
252
/* Add a signal to a set =================================================== */
253
int sigaddset(sigset_t* sigset_Info,int signal_Number)
253
int sigaddset(sigset_t* sigset_Info,int signal_Number)
254
{
254
{
255
    if (IS_SIGNAL(signal_Number)) {
255
    if (IS_SIGNAL(signal_Number)) {
256
	    (*sigset_Info) |= (1 << (signal_Number - 1));
256
	(*sigset_Info) |= (1 << (signal_Number - 1));
257
            return 0;
257
	return 0;
258
    }
258
    }
259
    else {
259
    else {
260
	     errno = EINVAL;
260
	errno = EINVAL;
261
	     return -1;
261
	return -1;
262
    }
262
    }
263
    return 0;
263
    return 0;
264
}
264
}
265
 
265
 
266
/* Remove a signal from a set ============================================== */
266
/* Remove a signal from a set ============================================== */
267
int sigdelset(sigset_t* sigset_Info,int signal_Number)
267
int sigdelset(sigset_t* sigset_Info,int signal_Number)
268
{
268
{
269
    if (IS_SIGNAL(signal_Number)) {
269
    if (IS_SIGNAL(signal_Number)) {
270
	    *sigset_Info &= ~(1<< (signal_Number - 1));
270
	*sigset_Info &= ~(1<< (signal_Number - 1));
271
            return 0;
271
	return 0;
272
    }
272
    }
273
    else {
273
    else {
274
	     errno = EINVAL;
274
	errno = EINVAL;
275
	     return -1;
275
	return -1;
276
    }
276
    }
277
    return 0;
277
    return 0;
278
}
278
}
279
 
279
 
280
/* Empty a set ============================================================= */
280
/* Empty a set ============================================================= */
281
int sigemptyset(sigset_t* sigset_Info)
281
int sigemptyset(sigset_t* sigset_Info)
282
{
282
{
283
	*sigset_Info = 0;
283
    *sigset_Info = 0;
284
	return 0;
284
    return 0;
285
}
285
}
286
 
286
 
287
/* Fill a set ============================================================== */
287
/* Fill a set ============================================================== */
288
int sigfillset(sigset_t* sigset_Info)
288
int sigfillset(sigset_t* sigset_Info)
289
{
289
{
290
	*sigset_Info = (sigset_t)-1;
290
    *sigset_Info = (sigset_t)-1;
291
	return 0;
291
    return 0;
292
}
292
}
293
 
293
 
294
/* Checks if a signal is in a set ========================================== */
294
/* Checks if a signal is in a set ========================================== */
295
int sigismember(sigset_t* sigset_Info,int signal_Number)
295
int sigismember(sigset_t* sigset_Info,int signal_Number)
296
{
296
{
297
      if (IS_SIGNAL(signal_Number)) {
297
    if (IS_SIGNAL(signal_Number)) {
298
			if ( *sigset_Info & (1 << (signal_Number-1)))
298
	if ( *sigset_Info & (1 << (signal_Number-1)))
299
				return 1;
299
	    return 1;
300
                        else
300
	else
301
                                return 0;
301
	    return 0;
302
      }
302
    }
303
      errno = EINVAL;
303
    errno = EINVAL;
304
      return -1;
304
    return -1;
305
}
305
}
306
 
306
 
307
/* Returns the signals pending ============================================= */
307
/* Returns the signals pending ============================================= */
308
int sigpending(sigset_t* sigset_Info)
308
int sigpending(sigset_t* sigset_Info)
309
{
309
{
310
	int signal_Index;
310
    int signal_Index;
311
	/* Make sure we're init'd */
311
    /* Make sure we're init'd */
312
	if (!downhill_Signal_Init())
312
    if (!downhill_Signal_Init())
313
	{
313
    {
314
		return -1;
314
	return -1;
315
	}
315
    }
316
	/* Check all the pending signals */
316
    /* Check all the pending signals */
317
        sigemptyset(sigset_Info);
317
    sigemptyset(sigset_Info);
318
	for (signal_Index = 1;signal_Index < NSIG;signal_Index++)
318
    for (signal_Index = 1;signal_Index < NSIG;signal_Index++)
-
 
319
    {
-
 
320
	if (downhill_Signal_Info[signal_Index].signal_Count > 0)
319
	{
321
	{
320
		if (downhill_Signal_Info[signal_Index].signal_Count > 0)
-
 
321
		{
-
 
322
			sigaddset(sigset_Info,signal_Index);
322
	    sigaddset(sigset_Info,signal_Index);
323
		}
-
 
324
	}
323
	}
-
 
324
    }
325
 
325
 
326
	return 0;
326
    return 0;
327
}
327
}
328
 
328
 
329
/* Change the blocked signals ============================================== */
329
/* Change the blocked signals ============================================== */
330
int sigprocmask(int mask_Function,sigset_t* sigset_Info,
330
int sigprocmask(int mask_Function,sigset_t* sigset_Info,
331
     sigset_t* sigset_InfoOld)
331
     sigset_t* sigset_InfoOld)
332
{
332
{
333
	int      signal_Index;
333
    int      signal_Index;
334
	sigset_t sigset_MaskOld = downhill_Sigset_Mask;
334
    sigset_t sigset_MaskOld = downhill_Sigset_Mask;
335
 
335
 
336
	/* Make sure we're init'd */
336
    /* Make sure we're init'd */
337
	if (!downhill_Signal_Init())
337
    if (!downhill_Signal_Init())
338
	{
338
    {
339
		return -1;
339
	return -1;
340
	}
340
    }
341
 
341
 
342
	/* Return the current value */
342
    /* Return the current value */
343
	if (sigset_InfoOld != NULL)
343
    if (sigset_InfoOld != NULL)
344
	{
344
    {
345
		*sigset_InfoOld = sigset_MaskOld;
345
	*sigset_InfoOld = sigset_MaskOld;
346
	}
346
    }
347
 
347
 
348
	/* Set the new mask */
348
    /* Set the new mask */
349
        if (sigset_Info) {
349
    if (sigset_Info) {
350
	   switch (mask_Function)
350
	switch (mask_Function)
351
	   {
351
	{
352
		case SIG_BLOCK:
352
	case SIG_BLOCK:
353
			downhill_Sigset_Mask |= (*sigset_Info);
353
	    downhill_Sigset_Mask |= (*sigset_Info);
354
			break;
354
	    break;
355
		case SIG_UNBLOCK:
355
	case SIG_UNBLOCK:
356
			downhill_Sigset_Mask &= ~(*sigset_Info);
356
	    downhill_Sigset_Mask &= ~(*sigset_Info);
357
			break;
357
	    break;
358
		case SIG_SETMASK:
358
	case SIG_SETMASK:
359
			downhill_Sigset_Mask = *sigset_Info;
359
	    downhill_Sigset_Mask = *sigset_Info;
360
			break;
360
	    break;
361
		default:
361
	default:
362
			errno = EINVAL;
362
	    errno = EINVAL;
363
			return -1;
363
	    return -1;
364
          }
-
 
365
	}
364
	}
-
 
365
    }
366
 
366
 
367
	/* And release any signals that were pending */
367
    /* And release any signals that were pending */
368
	for (signal_Index = 1;signal_Index < NSIG;signal_Index++)
368
    for (signal_Index = 1;signal_Index < NSIG;signal_Index++)
-
 
369
    {
-
 
370
	if ((!sigismember(&downhill_Sigset_Mask,signal_Index)) &&
-
 
371
	    (sigismember(&sigset_MaskOld,signal_Index)) &&
-
 
372
	    (downhill_Signal_Info[signal_Index].signal_Count > 0))
369
	{
373
	{
370
		if ((!sigismember(&downhill_Sigset_Mask,signal_Index)) &&
-
 
371
		 (sigismember(&sigset_MaskOld,signal_Index)) &&
-
 
372
		 (downhill_Signal_Info[signal_Index].signal_Count > 0))
374
	    downhill_Signal_Info[signal_Index].signal_Count = 0;
373
		{
-
 
374
	            downhill_Signal_Info[signal_Index].signal_Count = 0;
-
 
375
		    raise(signal_Index);
375
	    raise(signal_Index);
376
		}
-
 
377
	}
376
	}
-
 
377
    }
378
 
378
 
379
	return 0;
379
    return 0;
380
}
380
}
381
 
381
 
382
/* Set signal mask ========================================================= */
382
/* Set signal mask ========================================================= */
383
int sigsetmask(int signal_MaskNew)
383
int sigsetmask(int signal_MaskNew)
384
{
384
{
385
	int signal_MaskOld = downhill_Sigset_Mask;
385
    int signal_MaskOld = downhill_Sigset_Mask;
386
 
386
 
387
	if (sigprocmask(SIG_SETMASK, &signal_MaskNew, NULL) == -1)
387
    if (sigprocmask(SIG_SETMASK, &signal_MaskNew, NULL) == -1)
388
		return (int)-1;
388
	return (int)-1;
389
 
389
 
390
	return signal_MaskOld;
390
    return signal_MaskOld;
391
}
391
}
392
 
392
 
393
/* Add signals to mask ===================================================== */
393
/* Add signals to mask ===================================================== */
394
int sigblock(int signal_MaskNew)
394
int sigblock(int signal_MaskNew)
395
{
395
{
396
	/* Block a specific group of signals */
396
    /* Block a specific group of signals */
397
	return sigsetmask(downhill_Sigset_Mask|signal_MaskNew);
397
    return sigsetmask(downhill_Sigset_Mask|signal_MaskNew);
398
}
398
}
399
 
399
 
400
 
400
 
401
/* Hold a signal =========================================================== */
401
/* Hold a signal =========================================================== */
402
int sighold(int signal_Number)
402
int sighold(int signal_Number)
403
{
403
{
404
	/* Block a specific signal */
404
    /* Block a specific signal */
405
	if (sigblock(sigmask(signal_Number)) == -1)
405
    if (sigblock(sigmask(signal_Number)) == -1)
406
	{
406
    {
407
		return -1;
407
	return -1;
408
	}
408
    }
409
 
409
 
410
	return 0;
410
    return 0;
411
}
411
}
412
 
412
 
413
/* Release a signal ======================================================== */
413
/* Release a signal ======================================================== */
414
int sigrelse(int signal_Number)
414
int sigrelse(int signal_Number)
415
{
415
{
416
	/* Release a specific signal */
416
    /* Release a specific signal */
417
	if (sigsetmask(downhill_Sigset_Mask&(~sigmask(signal_Number))) == -1)
417
    if (sigsetmask(downhill_Sigset_Mask&(~sigmask(signal_Number))) == -1)
418
	{
418
    {
419
		return -1;
419
	return -1;
420
	}
420
    }
421
 
421
 
422
	return 0;
422
    return 0;
423
}
423
}
424
 
424
 
425
 
425
 
426
 
426
 
427
/* Pause until a signal ==================================================== */
427
/* Pause until a signal ==================================================== */
428
int pause(void)
428
int pause(void)
429
{
429
{
430
	/* Wait for a signal */
430
    /* Wait for a signal */
431
        WaitForSingleObject(IGotASignal,INFINITE);
431
    WaitForSingleObject(IGotASignal,INFINITE);
432
	/* And return if we were interrupted */
432
    /* And return if we were interrupted */
433
	errno = EINTR;
433
    errno = EINTR;
434
	return -1;
434
    return -1;
435
}
435
}
436
 
436
 
437
 
437
 
438
/* Suspend the process until a signal ====================================== */
438
/* Suspend the process until a signal ====================================== */
439
int sigsuspend(sigset_t* sigset_Info)
439
int sigsuspend(sigset_t* sigset_Info)
440
{
440
{
441
	sigset_t sigset_MaskOriginal = downhill_Sigset_Mask;
441
    sigset_t sigset_MaskOriginal = downhill_Sigset_Mask;
442
 
442
 
443
	/* Set the new mask */
443
    /* Set the new mask */
444
	sigprocmask(SIG_SETMASK,sigset_Info,NULL);
444
    sigprocmask(SIG_SETMASK,sigset_Info,NULL);
445
 
445
 
446
	/* Wait for the signal */
446
    /* Wait for the signal */
447
	pause();
447
    pause();
448
 
448
 
449
	/* Reset the old mask */
449
    /* Reset the old mask */
450
	sigprocmask(SIG_SETMASK,&sigset_MaskOriginal,NULL);
450
    sigprocmask(SIG_SETMASK,&sigset_MaskOriginal,NULL);
451
 
451
 
452
	return -1;
452
    return -1;
453
}
453
}
454
 
-