mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-14 17:47:16 +00:00
Cleaned up CreateSystemTimer interface for use with 32-bit callbacks.
(NOTE: 16-bit callbacks still don't work!)
This commit is contained in:
parent
40097ccfb5
commit
f6c4828c13
|
@ -2,7 +2,7 @@ name system
|
|||
type win16
|
||||
|
||||
1 pascal InquireSystem(word word) InquireSystem
|
||||
2 pascal16 CreateSystemTimer(word segptr) CreateSystemTimer
|
||||
2 pascal16 CreateSystemTimer(word segptr) WIN16_CreateSystemTimer
|
||||
3 pascal16 KillSystemTimer(word) SYSTEM_KillSystemTimer
|
||||
4 pascal16 EnableSystemTimers() EnableSystemTimers
|
||||
5 pascal16 DisableSystemTimers() DisableSystemTimers
|
||||
|
|
|
@ -157,7 +157,6 @@ static const CALLBACKS_TABLE CALLBACK_EmulatorTable =
|
|||
(void *)CallTo16_word_ww, /* CallBootAppProc */
|
||||
(void *)CallTo16_word_www, /* CallLoadAppSegProc */
|
||||
(void *)CallTo16_word_www, /* CallLocalNotifyFunc */
|
||||
(void *)CallTo16_word_, /* CallSystemTimerProc */
|
||||
(void *)CallTo16_word_www, /* CallResourceHandlerProc */
|
||||
(void *)CallTo16_word_wwwl, /* CallPostAppMessageProc */
|
||||
(void *)CallTo16_long_l, /* CallWOWCallbackProc */
|
||||
|
@ -815,6 +814,42 @@ void WINAPI WIN16_keybd_event( CONTEXT *context )
|
|||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* WIN16_CreateSystemTimer (SYSTEM.2)
|
||||
*/
|
||||
static void CALLBACK THUNK_CallSystemTimerProc( FARPROC16 proc, WORD timer )
|
||||
{
|
||||
CONTEXT context;
|
||||
memset( &context, '\0', sizeof(context) );
|
||||
|
||||
CS_reg( &context ) = SELECTOROF( proc );
|
||||
IP_reg( &context ) = OFFSETOF( proc );
|
||||
BP_reg( &context ) = OFFSETOF( THREAD_Current()->cur_stack )
|
||||
+ (WORD)&((STACK16FRAME*)0)->bp;
|
||||
|
||||
AX_reg( &context ) = timer;
|
||||
|
||||
CallTo16_sreg_( &context, 0 );
|
||||
|
||||
/* FIXME: This does not work if the signal occurs while some thread
|
||||
is currently in 16-bit code. With the current structure
|
||||
of the Wine thunking code, this seems to be hard to fix ... */
|
||||
}
|
||||
WORD WINAPI WIN16_CreateSystemTimer( WORD rate, FARPROC16 proc )
|
||||
{
|
||||
THUNK *thunk = THUNK_Alloc( proc, (RELAY)THUNK_CallSystemTimerProc );
|
||||
WORD timer = 0;
|
||||
|
||||
#if 1
|
||||
FIXME(system,"are currently broken, returning 0.\n");
|
||||
#else
|
||||
timer = CreateSystemTimer( rate, (SYSTEMTIMERPROC)thunk );
|
||||
#endif
|
||||
|
||||
if (!timer) THUNK_Free( thunk );
|
||||
return timer;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* 16->32 Flat Thunk routines:
|
||||
|
|
|
@ -37,7 +37,6 @@ typedef struct
|
|||
VOID (CALLBACK *CallBootAppProc)( FARPROC16, HANDLE16, HFILE16 );
|
||||
WORD (CALLBACK *CallLoadAppSegProc)( FARPROC16, HANDLE16, HFILE16, WORD );
|
||||
WORD (CALLBACK *CallLocalNotifyFunc)( FARPROC16, WORD, HLOCAL16, WORD );
|
||||
VOID (CALLBACK *CallSystemTimerProc)( FARPROC16 );
|
||||
HGLOBAL16 (CALLBACK *CallResourceHandlerProc)( FARPROC16, HGLOBAL16, HMODULE16, HRSRC16 );
|
||||
BOOL16 (CALLBACK *CallPostAppMessageProc)( FARPROC16, HTASK16, UINT16, WPARAM16, LPARAM );
|
||||
DWORD (CALLBACK *CallWOWCallbackProc)( FARPROC16, DWORD );
|
||||
|
|
|
@ -6585,6 +6585,8 @@ typedef const DLGITEMTEMPLATE *LPCDLGITEMTEMPLATE;
|
|||
/* Declarations for functions that exist only in Win16 */
|
||||
|
||||
#ifdef __WINE__
|
||||
typedef VOID (*SYSTEMTIMERPROC)(WORD);
|
||||
|
||||
WORD WINAPI AllocCStoDSAlias(WORD);
|
||||
WORD WINAPI AllocDStoCSAlias(WORD);
|
||||
HGLOBAL16 WINAPI AllocResource(HINSTANCE16,HRSRC16,DWORD);
|
||||
|
@ -6595,7 +6597,7 @@ VOID WINAPI CascadeChildWindows(HWND16,WORD);
|
|||
INT16 WINAPI CloseComm(INT16);
|
||||
HGLOBAL16 WINAPI CreateCursorIconIndirect(HINSTANCE16,CURSORICONINFO*,
|
||||
LPCVOID,LPCVOID);
|
||||
WORD WINAPI CreateSystemTimer(WORD,FARPROC16);
|
||||
WORD WINAPI CreateSystemTimer(WORD,SYSTEMTIMERPROC);
|
||||
BOOL16 WINAPI DCHook(HDC16,WORD,DWORD,LPARAM);
|
||||
VOID WINAPI DirectedYield(HTASK16);
|
||||
HGLOBAL16 WINAPI DirectResAlloc(HINSTANCE16,WORD,UINT16);
|
||||
|
|
|
@ -120,14 +120,6 @@ static WORD WINAPI CALLBACK_CallLocalNotifyFunc( FARPROC16 proc,
|
|||
}
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
* CALLBACK_CallSystemTimerProc
|
||||
*/
|
||||
static void WINAPI CALLBACK_CallSystemTimerProc( FARPROC16 proc )
|
||||
{
|
||||
proc();
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* CALLBACK_CallResourceHandlerProc
|
||||
*/
|
||||
|
@ -274,7 +266,6 @@ static const CALLBACKS_TABLE CALLBACK_WinelibTable =
|
|||
CALLBACK_CallBootAppProc, /* CallBootAppProc */
|
||||
CALLBACK_CallLoadAppSegProc, /* CallLoadAppSegProc */
|
||||
CALLBACK_CallLocalNotifyFunc, /* CallLocalNotifyFunc */
|
||||
CALLBACK_CallSystemTimerProc, /* CallSystemTimerProc */
|
||||
CALLBACK_CallResourceHandlerProc, /* CallResourceHandlerProc */
|
||||
NULL, /* CallPostAppMessageProc */
|
||||
CALLBACK_CallWOWCallbackProc, /* CallWOWCallbackProc */
|
||||
|
|
|
@ -12,18 +12,15 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include "callback.h"
|
||||
#include "windows.h"
|
||||
#include "miscemu.h"
|
||||
#include "dosexe.h"
|
||||
#include "vga.h"
|
||||
#include "selectors.h"
|
||||
#include "sig_context.h"
|
||||
#include "miscemu.h"
|
||||
#include "debug.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
FARPROC16 callback; /* NULL if not in use */
|
||||
SYSTEMTIMERPROC callback; /* NULL if not in use */
|
||||
INT32 rate;
|
||||
INT32 ticks;
|
||||
} SYSTEM_TIMER;
|
||||
|
@ -35,14 +32,9 @@ static SYSTEM_TIMER SYS_Timers[NB_SYS_TIMERS];
|
|||
static int SYS_NbTimers = 0;
|
||||
static BOOL32 SYS_TimersDisabled = FALSE;
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* SYSTEM_TimerTick
|
||||
* FIXME: It is a very bad idea to call 16bit code in a signal handler:
|
||||
* If the signal reached us in 16 bit code, we could have a broken
|
||||
* %FS, which is in turned saved into the single global
|
||||
* CALLTO16_Current_fs temporary storage, so a single misplaced
|
||||
* signal crashes the whole WINE process.
|
||||
* This needs more thought. -MM
|
||||
*/
|
||||
static HANDLER_DEF(SYSTEM_TimerTick)
|
||||
{
|
||||
|
@ -55,17 +47,7 @@ static HANDLER_DEF(SYSTEM_TimerTick)
|
|||
if ((SYS_Timers[i].ticks -= SYS_TIMER_RATE) <= 0)
|
||||
{
|
||||
SYS_Timers[i].ticks += SYS_Timers[i].rate;
|
||||
|
||||
if (SYS_Timers[i].callback == (FARPROC16)DOSMEM_Tick) {
|
||||
DOSMEM_Tick();
|
||||
} else
|
||||
if (SYS_Timers[i].callback == (FARPROC16)MZ_Tick) {
|
||||
MZ_Tick(i+1);
|
||||
} else
|
||||
if (SYS_Timers[i].callback == (FARPROC16)VGA_Poll) {
|
||||
VGA_Poll();
|
||||
} else
|
||||
Callbacks->CallSystemTimerProc( SYS_Timers[i].callback );
|
||||
SYS_Timers[i].callback( i+1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -146,20 +128,9 @@ DWORD WINAPI InquireSystem( WORD code, WORD arg )
|
|||
/***********************************************************************
|
||||
* CreateSystemTimer (SYSTEM.2)
|
||||
*/
|
||||
WORD WINAPI CreateSystemTimer( WORD rate, FARPROC16 callback )
|
||||
WORD WINAPI CreateSystemTimer( WORD rate, SYSTEMTIMERPROC callback )
|
||||
{
|
||||
int i;
|
||||
|
||||
/* FIXME: HACK: do not create system timers due to problems mentioned
|
||||
* above, except DOSMEM_Tick(), MZ_Tick(), and VGA_Poll().
|
||||
*/
|
||||
if ((callback!=(FARPROC16)DOSMEM_Tick)&&
|
||||
(callback!=(FARPROC16)MZ_Tick)&&
|
||||
(callback!=(FARPROC16)VGA_Poll)) {
|
||||
FIXME(system,"are currently broken, returning 0.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < NB_SYS_TIMERS; i++)
|
||||
if (!SYS_Timers[i].callback) /* Found one */
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue