1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-25 15:00:45 -08:00

[!MAC_OSX] Include keyboard.h and syssignal.h.

[!MAC_OSX] (target_ticks): Remove variable.
[!MAC_OSX] (check_alarm, pause, index): Remove functions.
[!MAC_OSX && __MRC__] (sys_strftime): Likewise.
[!MAC_OSX] (select): If fd 0 is not set in rfds and some input
event occurs before timeout, behave as if the function were
interrupted.
[!MAC_OSX] (sigblock, sigsetmask, alarm): Simulate SIGALRM
handling using Time Manager routines.
[!MAC_OSX] (mac_atimer_task, mac_atimer_qlink, signal_mask): New
variables.
[!MAC_OSX] (mac_atimer_handler, set_mac_atimer, remove_mac_atimer)
(setitimer): New functions.
This commit is contained in:
YAMAMOTO Mitsuharu 2005-05-13 08:44:20 +00:00
parent b78c807ab4
commit 62b00a4687

299
src/mac.c
View file

@ -1672,37 +1672,7 @@ sys_fopen (const char *name, const char *mode)
}
long target_ticks = 0;
#ifdef __MRC__
__sigfun alarm_signal_func = (__sigfun) 0;
#elif __MWERKS__
__signal_func_ptr alarm_signal_func = (__signal_func_ptr) 0;
#else /* not __MRC__ and not __MWERKS__ */
You lose!!!
#endif /* not __MRC__ and not __MWERKS__ */
/* These functions simulate SIG_ALRM. The stub for function signal
stores the signal handler function in alarm_signal_func if a
SIG_ALRM is encountered. check_alarm is called in XTread_socket,
which emacs calls periodically. A pending alarm is represented by
a non-zero target_ticks value. check_alarm calls the handler
function pointed to by alarm_signal_func if one has been set up and
an alarm is pending. */
void
check_alarm ()
{
if (target_ticks && TickCount () > target_ticks)
{
target_ticks = 0;
if (alarm_signal_func)
(*alarm_signal_func)(SIGALRM);
}
}
#include "keyboard.h"
extern Boolean mac_wait_next_event (EventRecord *, UInt32, Boolean);
int
@ -1713,25 +1683,17 @@ select (n, rfds, wfds, efds, timeout)
SELECT_TYPE *efds;
struct timeval *timeout;
{
#if TARGET_API_MAC_CARBON
OSErr err;
#if TARGET_API_MAC_CARBON
EventTimeout timeout_sec =
(timeout
? (EMACS_SECS (*timeout) * kEventDurationSecond
+ EMACS_USECS (*timeout) * kEventDurationMicrosecond)
: kEventDurationForever);
if (FD_ISSET (0, rfds))
{
BLOCK_INPUT;
err = ReceiveNextEvent (0, NULL, timeout_sec, kEventLeaveInQueue, NULL);
UNBLOCK_INPUT;
if (err == noErr)
return 1;
else
FD_ZERO (rfds);
}
return 0;
BLOCK_INPUT;
err = ReceiveNextEvent (0, NULL, timeout_sec, kEventLeaveInQueue, NULL);
UNBLOCK_INPUT;
#else /* not TARGET_API_MAC_CARBON */
EventRecord e;
UInt32 sleep_time = EMACS_SECS (*timeout) * 60 +
@ -1746,47 +1708,62 @@ select (n, rfds, wfds, efds, timeout)
read_avail_input which in turn calls XTread_socket to poll for
these events. Otherwise these never get processed except but a
very slow poll timer. */
if (FD_ISSET (0, rfds) && mac_wait_next_event (&e, sleep_time, false))
return 1;
return 0;
if (mac_wait_next_event (&e, sleep_time, false))
err = noErr;
else
err = -9875; /* eventLoopTimedOutErr */
#endif /* not TARGET_API_MAC_CARBON */
if (FD_ISSET (0, rfds))
if (err == noErr)
return 1;
else
{
FD_ZERO (rfds);
return 0;
}
else
if (err == noErr)
{
if (input_polling_used ())
{
/* It could be confusing if a real alarm arrives while
processing the fake one. Turn it off and let the
handler reset it. */
extern void poll_for_input_1 P_ ((void));
int old_poll_suppress_count = poll_suppress_count;
poll_suppress_count = 1;
poll_for_input_1 ();
poll_suppress_count = old_poll_suppress_count;
}
errno = EINTR;
return -1;
}
else
return 0;
}
/* Called in sys_select to wait for an alarm signal to arrive. */
/* Simulation of SIGALRM. The stub for function signal stores the
signal handler function in alarm_signal_func if a SIGALRM is
encountered. */
int
pause ()
{
EventRecord e;
unsigned long tick;
#include <signal.h>
#include "syssignal.h"
if (!target_ticks) /* no alarm pending */
return -1;
static TMTask mac_atimer_task;
if ((tick = TickCount ()) < target_ticks)
WaitNextEvent (0, &e, target_ticks - tick, NULL); /* Accept no event;
just wait. by T.I. */
static QElemPtr mac_atimer_qlink = (QElemPtr) &mac_atimer_task;
target_ticks = 0;
if (alarm_signal_func)
(*alarm_signal_func)(SIGALRM);
return 0;
}
int
alarm (int seconds)
{
long remaining = target_ticks ? (TickCount () - target_ticks) / 60 : 0;
target_ticks = seconds ? TickCount () + 60 * seconds : 0;
return (remaining < 0) ? 0 : (unsigned int) remaining;
}
static int signal_mask = 0;
#ifdef __MRC__
__sigfun alarm_signal_func = (__sigfun) 0;
#elif __MWERKS__
__signal_func_ptr alarm_signal_func = (__signal_func_ptr) 0;
#else /* not __MRC__ and not __MWERKS__ */
You lose!!!
#endif /* not __MRC__ and not __MWERKS__ */
#undef signal
#ifdef __MRC__
@ -1819,6 +1796,128 @@ sys_signal (int signal_num, __signal_func_ptr signal_func)
}
static pascal void
mac_atimer_handler (qlink)
TMTaskPtr qlink;
{
if (alarm_signal_func)
(alarm_signal_func) (SIGALRM);
}
static void
set_mac_atimer (count)
long count;
{
static TimerUPP mac_atimer_handlerUPP = NULL;
if (mac_atimer_handlerUPP == NULL)
mac_atimer_handlerUPP = NewTimerUPP (mac_atimer_handler);
mac_atimer_task.tmCount = 0;
mac_atimer_task.tmAddr = mac_atimer_handlerUPP;
mac_atimer_qlink = (QElemPtr) &mac_atimer_task;
InsTime (mac_atimer_qlink);
if (count)
PrimeTime (mac_atimer_qlink, count);
}
int
remove_mac_atimer (remaining_count)
long *remaining_count;
{
if (mac_atimer_qlink)
{
RmvTime (mac_atimer_qlink);
if (remaining_count)
*remaining_count = mac_atimer_task.tmCount;
mac_atimer_qlink = NULL;
return 0;
}
else
return -1;
}
int
sigblock (int mask)
{
int old_mask = signal_mask;
signal_mask |= mask;
if ((old_mask ^ signal_mask) & sigmask (SIGALRM))
remove_mac_atimer (NULL);
return old_mask;
}
int
sigsetmask (int mask)
{
int old_mask = signal_mask;
signal_mask = mask;
if ((old_mask ^ signal_mask) & sigmask (SIGALRM))
if (signal_mask & sigmask (SIGALRM))
remove_mac_atimer (NULL);
else
set_mac_atimer (mac_atimer_task.tmCount);
return old_mask;
}
int
alarm (int seconds)
{
long remaining_count;
if (remove_mac_atimer (&remaining_count) == 0)
{
set_mac_atimer (seconds * 1000);
return remaining_count / 1000;
}
else
{
mac_atimer_task.tmCount = seconds * 1000;
return 0;
}
}
int
setitimer (which, value, ovalue)
int which;
const struct itimerval *value;
struct itimerval *ovalue;
{
long remaining_count;
long count = (EMACS_SECS (value->it_value) * 1000
+ (EMACS_USECS (value->it_value) + 999) / 1000);
if (remove_mac_atimer (&remaining_count) == 0)
{
if (ovalue)
{
bzero (ovalue, sizeof (*ovalue));
EMACS_SET_SECS_USECS (ovalue->it_value, remaining_count / 1000,
(remaining_count % 1000) * 1000);
}
set_mac_atimer (count);
}
else
mac_atimer_task.tmCount = count;
return 0;
}
/* gettimeofday should return the amount of time (in a timeval
structure) since midnight today. The toolbox function Microseconds
returns the number of microseconds (in a UnsignedWide value) since
@ -1946,35 +2045,6 @@ sys_time (time_t *timer)
}
/* MPW strftime broken for "%p" format */
#ifdef __MRC__
#undef strftime
#include <time.h>
size_t
sys_strftime (char * s, size_t maxsize, const char * format,
const struct tm * timeptr)
{
if (strcmp (format, "%p") == 0)
{
if (maxsize < 3)
return 0;
if (timeptr->tm_hour < 12)
{
strcpy (s, "AM");
return 2;
}
else
{
strcpy (s, "PM");
return 2;
}
}
else
return strftime (s, maxsize, format, timeptr);
}
#endif /* __MRC__ */
/* no subprocesses, empty wait */
int
@ -1992,13 +2062,6 @@ croak (char *badfunc)
}
char *
index (const char * str, int chr)
{
return strchr (str, chr);
}
char *
mktemp (char *template)
{
@ -2187,20 +2250,6 @@ sys_subshell ()
}
int
sigsetmask (int x)
{
return 0;
}
int
sigblock (int mask)
{
return 0;
}
void
request_sigio (void)
{