source: trunk/src/winmm/time.cpp@ 10269

Last change on this file since 10269 was 10269, checked in by sandervl, 22 years ago

Make sure the timer object is not deleted inside the timer callback handler

File size: 7.6 KB
Line 
1/* $Id: time.cpp,v 1.18 2003-10-13 09:18:38 sandervl Exp $ */
2
3/*
4 * Timer MM apis
5 *
6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
7 * Copyright 1999 Patrick Haller (phaller@gmx.net)
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12
13
14/****************************************************************************
15 * Includes *
16 ****************************************************************************/
17#include <os2win.h>
18#include <odinwrap.h>
19#include <misc.h>
20#include <handlemanager.h>
21
22#include "os2timer.h"
23#include "time.h"
24
25#define DBG_LOCALLOG DBG_time
26#include "dbglocal.h"
27
28
29/*****************************************************************************
30 * Name : mmsystemGetVersion
31 * Purpose : determine version of MM system
32 * Parameters:
33 * Variables :
34 * Result :
35 * Remark :
36 * Status : UNTESTED STUB
37 *
38 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
39 *****************************************************************************/
40
41
42UINT WINAPI mmsystemGetVersion()
43{
44 //Returned by winmm.dll from NT4, SP6
45 return 0x030A;
46}
47
48/*****************************************************************************
49 * Name :
50 * Purpose :
51 * Parameters:
52 * Variables :
53 * Result :
54 * Remark :
55 * Status : UNTESTED STUB
56 *
57 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
58 *****************************************************************************/
59
60MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc)
61{
62 dprintf(("WINMM:timeGetDevCaps Not really Implemented\n"));
63
64 /* 2001-09-16 PH
65 add dynamic detection of OS/2's minimum timer resolution
66 */
67
68 ptc->wPeriodMin = OS2TIMER_RESOLUTION_MINIMUM;
69 ptc->wPeriodMax = OS2TIMER_RESOLUTION_MAXIMUM;
70
71 return TIMERR_NOERROR;
72}
73
74
75/*****************************************************************************
76 * Name :
77 * Purpose :
78 * Parameters:
79 * Variables :
80 * Result :
81 * Remark :
82 * Status : UNTESTED STUB
83 *
84 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
85 *****************************************************************************/
86
87MMRESULT WINAPI timeBeginPeriod(UINT cMilliseconds)
88{
89 if (cMilliseconds < OS2TIMER_RESOLUTION_MINIMUM || cMilliseconds > OS2TIMER_RESOLUTION_MAXIMUM)
90 return TIMERR_NOCANDO;
91
92 if (TRUE == OS2TimerResolution::enterResolutionScope(cMilliseconds))
93 return TIMERR_NOERROR;
94 else
95 return TIMERR_NOCANDO;
96}
97
98
99/*****************************************************************************
100 * Name :
101 * Purpose :
102 * Parameters:
103 * Variables :
104 * Result :
105 * Remark :
106 * Status : UNTESTED STUB
107 *
108 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
109 *****************************************************************************/
110
111MMRESULT WINAPI timeEndPeriod(UINT cMilliseconds)
112{
113 if (cMilliseconds < OS2TIMER_RESOLUTION_MINIMUM || cMilliseconds > OS2TIMER_RESOLUTION_MAXIMUM)
114 return TIMERR_NOCANDO;
115
116 if (TRUE == OS2TimerResolution::leaveResolutionScope(cMilliseconds))
117 return TIMERR_NOERROR;
118 else
119 {
120 dprintf(("WINMM: timeEndPeriod didn't match timeBeginPeriod.\n"));
121 return TIMERR_NOCANDO;
122 }
123}
124
125
126/*****************************************************************************
127 * Name :
128 * Purpose :
129 * Parameters:
130 * Variables :
131 * Result :
132 * Remark :
133 * Status : UNTESTED STUB
134 *
135 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
136 *****************************************************************************/
137
138MMRESULT WINAPI timeKillEvent(UINT IDEvent)
139{
140 OS2Timer *os2timer = NULL;
141
142 if(HMHandleTranslateToOS2(IDEvent, (PULONG)&os2timer) != NO_ERROR) {
143 dprintf(("invalid timer id"));
144 return TIMERR_NOERROR; //TODO: should we return an error here??
145 }
146 HMHandleFree(IDEvent);
147
148 os2timer->KillTimer();
149 os2timer->release();
150 return TIMERR_NOERROR;
151}
152
153
154/*****************************************************************************
155 * Name :
156 * Purpose :
157 * Parameters:
158 * Variables :
159 * Result :
160 * Remark :
161 * Status : UNTESTED STUB
162 *
163 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
164 *****************************************************************************/
165
166MMRESULT WINAPI timeSetEvent(UINT wDelay, UINT wResolution,
167 LPTIMECALLBACK lptc, DWORD dwUser,
168 UINT fuEvent)
169{
170 OS2Timer *timer;
171 ULONG timerID = 0;
172
173// @@@PH 1999/10/26 hack for RA95
174 if (wDelay < OS2TIMER_RESOLUTION_MINIMUM)
175 {
176 dprintf(("WINMM:Time:timeSetEvent - Warning: requested delay too low (%08xh)\n",
177 wDelay));
178 wDelay = OS2TIMER_RESOLUTION_MINIMUM;
179 }
180
181 if (wResolution < OS2TIMER_RESOLUTION_MINIMUM)
182 {
183 dprintf(("WINMM:Time:timeSetEvent - Warning: requested resolution too low (%08xh)\n",
184 wResolution));
185 wResolution = OS2TIMER_RESOLUTION_MINIMUM;
186 }
187
188
189 // check parameters
190 if ((wDelay < OS2TIMER_RESOLUTION_MINIMUM) ||
191 (wDelay > OS2TIMER_RESOLUTION_MAXIMUM))
192 return NULL;
193
194 if (wResolution == 0)
195 wResolution = OS2TIMER_RESOLUTION_MINIMUM;
196 else
197 if ((wResolution < OS2TIMER_RESOLUTION_MINIMUM) ||
198 (wResolution > OS2TIMER_RESOLUTION_MAXIMUM))
199 return NULL;
200
201 timer = new OS2Timer();
202 if(timer == NULL)
203 return(0);
204
205 if(HMHandleAllocate(&timerID, (ULONG)timer) != NO_ERROR) {
206 dprintf(("HMHandleAllocate failed!!"));
207 timer->release();
208 return 0;
209 }
210
211 timer->setTimerID(timerID);
212 if(timer->StartTimer(wDelay, wResolution, lptc, dwUser, fuEvent) == FALSE)
213 {
214 dprintf(("WINMM:timeSetEvent: couldn't start timer!\n"));
215 timer->release();
216 return(0);
217 }
218 return(MMRESULT)timerID;
219}
220
221
222#if 0
223// Note: 2001-11-22
224// WinGetCurrentTime does not touch the FS: selector.
225// It just returns the content of a variable.
226ULONG OPEN32API WinGetCurrentTime(ULONG hab);
227
228inline ULONG _WinGetCurrentTime(ULONG a)
229{
230 ULONG yyrc;
231 USHORT sel = RestoreOS2FS();
232
233 yyrc = WinGetCurrentTime(a);
234 SetFS(sel);
235
236 return yyrc;
237}
238
239#undef WinGetCurrentTime
240#define WinGetCurrentTime _WinGetCurrentTime
241#else
242ULONG OPEN32API WinGetCurrentTime(ULONG hab);
243#endif
244
245/*****************************************************************************
246 * Name :
247 * Purpose :
248 * Parameters:
249 * Variables :
250 * Result :
251 * Remark :
252 * Status : UNTESTED STUB
253 *
254 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
255 *****************************************************************************/
256
257MMRESULT WINAPI timeGetSystemTime(LPMMTIME pTime, UINT cbTime)
258{
259 dprintf2(("timeGetSystemTime %x %d", pTime, cbTime));
260
261 if(pTime == NULL || cbTime < sizeof(MMTIME)) {
262 SetLastError(ERROR_INVALID_PARAMETER);
263 return 0;
264 }
265 pTime->wType = TIME_MS;
266 pTime->u.ms = WinGetCurrentTime(0);
267
268 SetLastError(ERROR_SUCCESS);
269 return 0;
270}
271
272
273/*****************************************************************************
274 * Name :
275 * Purpose :
276 * Parameters:
277 * Variables :
278 * Result :
279 * Remark :
280 * Status : UNTESTED STUB
281 *
282 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
283 *****************************************************************************/
284
285DWORD WIN32API timeGetTime()
286{
287#if 0
288 //SvL: TODO: Inaccurate
289 DWORD time = WinGetCurrentTime(0);
290 dprintf2(("timeGetTime %x", time));
291 return time;
292#else
293 return WinGetCurrentTime(0);
294#endif
295
296#if 0
297 LARGE_INTEGER lint;
298 static LARGE_INTEGER freq;
299 static BOOL fInit = FALSE;
300
301 if(fInit == FALSE) {
302 QueryPerformanceFrequency(&freq);
303 freq.LowPart /= 1000;
304 fInit = TRUE;
305 }
306 QueryPerformanceCounter(&lint);
307 time = lint.LowPart/freq.LowPart;
308 dprintf2(("timeGetTime %x (%x:%x)", time, lint.LowPart, lint.HighPart));
309#endif
310}
311
Note: See TracBrowser for help on using the repository browser.