4 * Copyright 1996 Alexandre Julliard
11 #include <sys/timeb.h>
12 #include <sys/types.h>
16 #include "selectors.h"
17 #include "sig_context.h"
23 SYSTEMTIMERPROC callback
; /* NULL if not in use */
28 #define NB_SYS_TIMERS 8
29 #define SYS_TIMER_RATE 54925
31 static SYSTEM_TIMER SYS_Timers
[NB_SYS_TIMERS
];
32 static int SYS_NbTimers
= 0;
33 static BOOL32 SYS_TimersDisabled
= FALSE
;
36 /***********************************************************************
39 static HANDLER_DEF(SYSTEM_TimerTick
)
44 for (i
= 0; i
< NB_SYS_TIMERS
; i
++)
46 if (!SYS_Timers
[i
].callback
) continue;
47 if ((SYS_Timers
[i
].ticks
-= SYS_TIMER_RATE
) <= 0)
49 SYS_Timers
[i
].ticks
+= SYS_Timers
[i
].rate
;
50 SYS_Timers
[i
].callback( i
+1 );
55 /**********************************************************************
58 * Start the system tick timer.
60 static void SYSTEM_StartTicks(void)
62 static BOOL32 handler_installed
= FALSE
;
64 if (!handler_installed
)
66 handler_installed
= TRUE
;
67 SIGNAL_SetHandler( SIGALRM
, SYSTEM_TimerTick
, 1 );
69 #ifndef __EMX__ /* FIXME: Time don't work... Use BIOS directly instead */
71 struct itimerval vt_timer
;
73 vt_timer
.it_interval
.tv_sec
= 0;
74 vt_timer
.it_interval
.tv_usec
= 54929;
75 vt_timer
.it_value
= vt_timer
.it_interval
;
76 setitimer( ITIMER_REAL
, &vt_timer
, NULL
);
82 /**********************************************************************
85 * Stop the system tick timer.
87 static void SYSTEM_StopTicks(void)
89 #ifndef __EMX__ /* FIXME: Time don't work... Use BIOS directly instead */
90 struct itimerval vt_timer
;
92 vt_timer
.it_interval
.tv_sec
= 0;
93 vt_timer
.it_interval
.tv_usec
= 0;
94 vt_timer
.it_value
= vt_timer
.it_interval
;
95 setitimer( ITIMER_REAL
, &vt_timer
, NULL
);
100 /***********************************************************************
101 * InquireSystem (SYSTEM.1)
103 * Note: the function always takes 2 WORD arguments, contrary to what
104 * "Undocumented Windows" says.
106 DWORD WINAPI
InquireSystem( WORD code
, WORD arg
)
112 case 0: /* Get timer resolution */
113 return SYS_TIMER_RATE
;
115 case 1: /* Get drive type */
116 drivetype
= GetDriveType16( arg
);
117 return MAKELONG( drivetype
, drivetype
);
119 case 2: /* Enable one-drive logic */
120 FIXME(system
, "Case %d: set single-drive %d not supported\n", code
, arg
);
123 WARN(system
, "Unknown code %d\n", code
);
128 /***********************************************************************
129 * CreateSystemTimer (SYSTEM.2)
131 WORD WINAPI
CreateSystemTimer( WORD rate
, SYSTEMTIMERPROC callback
)
134 for (i
= 0; i
< NB_SYS_TIMERS
; i
++)
135 if (!SYS_Timers
[i
].callback
) /* Found one */
137 SYS_Timers
[i
].rate
= (UINT32
)rate
* 1000;
138 if (SYS_Timers
[i
].rate
< SYS_TIMER_RATE
)
139 SYS_Timers
[i
].rate
= SYS_TIMER_RATE
;
140 SYS_Timers
[i
].ticks
= SYS_Timers
[i
].rate
;
141 SYS_Timers
[i
].callback
= callback
;
142 if ((++SYS_NbTimers
== 1) && !SYS_TimersDisabled
)
144 return i
+ 1; /* 0 means error */
150 /***********************************************************************
151 * KillSystemTimer (SYSTEM.3)
153 * Note: do not confuse this function with USER.182
155 WORD WINAPI
SYSTEM_KillSystemTimer( WORD timer
)
157 if (!timer
|| (timer
> NB_SYS_TIMERS
)) return timer
; /* Error */
158 SYS_Timers
[timer
-1].callback
= NULL
;
159 if ((!--SYS_NbTimers
) && !SYS_TimersDisabled
) SYSTEM_StopTicks();
164 /***********************************************************************
165 * EnableSystemTimers (SYSTEM.4)
167 void WINAPI
EnableSystemTimers(void)
169 SYS_TimersDisabled
= FALSE
;
170 if (SYS_NbTimers
) SYSTEM_StartTicks();
174 /***********************************************************************
175 * DisableSystemTimers (SYSTEM.5)
177 void WINAPI
DisableSystemTimers(void)
179 SYS_TimersDisabled
= TRUE
;
180 if (SYS_NbTimers
) SYSTEM_StopTicks();