[PATCH 1/2] [WineMM]: get rid of WINE_TIMER_IS32 internal flag
Eric Pouech
eric.pouech at orange.fr
Sat Oct 17 05:10:05 CDT 2009
A+
---
dlls/winmm/mmsystem.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++---
dlls/winmm/time.c | 22 ++-----------
dlls/winmm/winemm.h | 4 --
3 files changed, 85 insertions(+), 27 deletions(-)
diff --git a/dlls/winmm/mmsystem.c b/dlls/winmm/mmsystem.c
index 9710d3b..d560773 100644
--- a/dlls/winmm/mmsystem.c
+++ b/dlls/winmm/mmsystem.c
@@ -38,6 +38,7 @@
#include "wownt32.h"
#include "winnls.h"
+#include "wine/list.h"
#include "wine/winuser16.h"
#include "winemm.h"
#include "winemm16.h"
@@ -51,6 +52,15 @@ static LPWINE_DRIVER DRIVER_OpenDriver16(LPCWSTR, LPCWSTR, LPARAM);
static LRESULT DRIVER_CloseDriver16(HDRVR16, LPARAM, LPARAM);
static LRESULT DRIVER_SendMessage16(HDRVR16, UINT, LPARAM, LPARAM);
+static CRITICAL_SECTION mmdrv_cs;
+static CRITICAL_SECTION_DEBUG mmdrv_critsect_debug =
+{
+ 0, 0, &mmdrv_cs,
+ { &mmdrv_critsect_debug.ProcessLocksList, &mmdrv_critsect_debug.ProcessLocksList },
+ 0, 0, { (DWORD_PTR)(__FILE__ ": mmsystem_mmdrv_cs") }
+};
+static CRITICAL_SECTION mmdrv_cs = { &mmdrv_critsect_debug, -1, 0, 0, 0, 0 };
+
/* ###################################################
* # LIBRARY #
* ###################################################
@@ -2371,17 +2381,66 @@ MMRESULT16 WINAPI timeGetSystemTime16(LPMMTIME16 lpTime, UINT16 wSize)
return 0;
}
+struct timer_entry {
+ struct list entry;
+ UINT id;
+ LPTIMECALLBACK16 func16;
+ DWORD user;
+};
+
+static struct list timer_list = LIST_INIT(timer_list);
+
+static void CALLBACK timeCB3216(UINT id, UINT uMsg, DWORD_PTR user, DWORD_PTR dw1, DWORD_PTR dw2)
+{
+ struct timer_entry* te = (void*)user;
+ WORD args[8];
+ DWORD ret;
+
+ args[7] = LOWORD(id);
+ args[6] = LOWORD(uMsg);
+ args[5] = HIWORD(te->user);
+ args[4] = LOWORD(te->user);
+ args[3] = HIWORD(dw1);
+ args[2] = LOWORD(dw2);
+ args[1] = HIWORD(dw2);
+ args[0] = LOWORD(dw2);
+ WOWCallback16Ex((DWORD)te->func16, WCB16_PASCAL, sizeof(args), args, &ret);
+}
+
/**************************************************************************
* timeSetEvent [MMSYSTEM.602]
*/
MMRESULT16 WINAPI timeSetEvent16(UINT16 wDelay, UINT16 wResol, LPTIMECALLBACK16 lpFunc,
DWORD dwUser, UINT16 wFlags)
{
- if (wFlags & WINE_TIMER_IS32)
- WARN("Unknown windows flag... wine internally used.. ooch\n");
+ MMRESULT16 id;
+ struct timer_entry* te;
- return TIME_SetEventInternal(wDelay, wResol, (LPTIMECALLBACK)lpFunc,
- dwUser, wFlags & ~WINE_TIMER_IS32);
+ switch (wFlags & (TIME_CALLBACK_EVENT_SET|TIME_CALLBACK_EVENT_PULSE))
+ {
+ case TIME_CALLBACK_EVENT_SET:
+ case TIME_CALLBACK_EVENT_PULSE:
+ id = timeSetEvent(wDelay, wResol, (LPTIMECALLBACK)lpFunc, dwUser, wFlags);
+ break;
+ case TIME_CALLBACK_FUNCTION:
+ te = HeapAlloc(GetProcessHeap(), 0, sizeof(*te));
+ if (!te) return 0;
+ te->func16 = lpFunc;
+ te->user = dwUser;
+ id = te->id = timeSetEvent(wDelay, wResol, timeCB3216, (DWORD_PTR)te, wFlags);
+ if (id)
+ {
+ EnterCriticalSection(&mmdrv_cs);
+ list_add_tail(&timer_list, &te->entry);
+ LeaveCriticalSection(&mmdrv_cs);
+ }
+ else HeapFree(GetProcessHeap(), 0, te);
+ break;
+ default:
+ id = 0;
+ break;
+ }
+ return id;
}
/**************************************************************************
@@ -2389,7 +2448,24 @@ MMRESULT16 WINAPI timeSetEvent16(UINT16 wDelay, UINT16 wResol, LPTIMECALLBACK16
*/
MMRESULT16 WINAPI timeKillEvent16(UINT16 wID)
{
- return timeKillEvent(wID);
+ MMRESULT16 ret = timeKillEvent(wID);
+ struct timer_entry* te;
+
+ if (ret == TIMERR_NOERROR)
+ {
+ EnterCriticalSection(&mmdrv_cs);
+ LIST_FOR_EACH_ENTRY(te, &timer_list, struct timer_entry, entry)
+ {
+ if (wID == te->id)
+ {
+ list_remove(&te->entry);
+ HeapFree(GetProcessHeap(), 0, te);
+ break;
+ }
+ }
+ LeaveCriticalSection(&mmdrv_cs);
+ }
+ return ret;
}
/**************************************************************************
diff --git a/dlls/winmm/time.c b/dlls/winmm/time.c
index 8c64ac8..fcf31f0 100644
--- a/dlls/winmm/time.c
+++ b/dlls/winmm/time.c
@@ -179,8 +179,7 @@ static int TIME_MMSysTimeCallback(void)
if (flags & TIME_KILL_SYNCHRONOUS) EnterCriticalSection(&TIME_cbcrst);
LeaveCriticalSection(&WINMM_cs);
- if (flags & WINE_TIMER_IS32) func(id, 0, user, 0, 0);
- else if (pFnCallMMDrvFunc16) pFnCallMMDrvFunc16((DWORD_PTR)func, id, 0, user, 0, 0);
+ func(id, 0, user, 0, 0);
EnterCriticalSection(&WINMM_cs);
if (flags & TIME_KILL_SYNCHRONOUS) LeaveCriticalSection(&TIME_cbcrst);
@@ -301,10 +300,10 @@ MMRESULT WINAPI timeGetSystemTime(LPMMTIME lpTime, UINT wSize)
}
/**************************************************************************
- * TIME_SetEventInternal [internal]
+ * timeSetEvent [WINMM.@]
*/
-WORD TIME_SetEventInternal(UINT wDelay, UINT wResol,
- LPTIMECALLBACK lpFunc, DWORD_PTR dwUser, UINT wFlags)
+MMRESULT WINAPI timeSetEvent(UINT wDelay, UINT wResol, LPTIMECALLBACK lpFunc,
+ DWORD_PTR dwUser, UINT wFlags)
{
WORD wNewID = 0;
LPWINE_TIMERENTRY lpNewTimer;
@@ -351,19 +350,6 @@ WORD TIME_SetEventInternal(UINT wDelay, UINT wResol,
}
/**************************************************************************
- * timeSetEvent [WINMM.@]
- */
-MMRESULT WINAPI timeSetEvent(UINT wDelay, UINT wResol, LPTIMECALLBACK lpFunc,
- DWORD_PTR dwUser, UINT wFlags)
-{
- if (wFlags & WINE_TIMER_IS32)
- WARN("Unknown windows flag... wine internally used.. ooch\n");
-
- return TIME_SetEventInternal(wDelay, wResol, lpFunc,
- dwUser, wFlags|WINE_TIMER_IS32);
-}
-
-/**************************************************************************
* timeKillEvent [WINMM.@]
*/
MMRESULT WINAPI timeKillEvent(UINT wID)
diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h
index 4e7b298..6af5f01 100644
--- a/dlls/winmm/winemm.h
+++ b/dlls/winmm/winemm.h
@@ -151,8 +151,6 @@ typedef struct tagWINE_MCIDRIVER {
struct tagWINE_MCIDRIVER*lpNext;
} WINE_MCIDRIVER, *LPWINE_MCIDRIVER;
-#define WINE_TIMER_IS32 0x80
-
struct IOProcList
{
struct IOProcList*pNext; /* Next item in linked list */
@@ -218,8 +216,6 @@ UINT WAVE_Open(HANDLE* lphndl, UINT uDeviceID, UINT uType,
LPCWAVEFORMATEX lpFormat, DWORD_PTR dwCallback,
DWORD_PTR dwInstance, DWORD dwFlags, BOOL bFrom32);
-WORD TIME_SetEventInternal(UINT wDelay, UINT wResol, LPTIMECALLBACK lpFunc,
- DWORD_PTR dwUser, UINT wFlags);
void TIME_MMTimeStop(void);
/* Global variables */
More information about the wine-patches
mailing list