From: Pierre Muller Date: Mon, 21 Feb 2011 11:47:12 +0000 (+0000) Subject: Allow use of mingw native on Windows 95 OS. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4af53f973a65f675b7b084b174e9cdfa1c5265e1;p=binutils-gdb.git Allow use of mingw native on Windows 95 OS. * src/gdb/ser-mingw.c (CancelIo): New macro for dynamically loaded DLL entry. (ser_windows_close): Only call CancelIo if function exists. (_initialize_ser_windows): Use LoadLirary/GetProcAddress to check for existence of CancelIo function in kernel32 DLL. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 84256b98d78..6ccae2a23c1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2011-02-21 Pierre Muller + + Allow use of mingw native on Windows 95 OS. + * src/gdb/ser-mingw.c (CancelIo): New macro for dynamically loaded + DLL entry. + (ser_windows_close): Only call CancelIo if function exists. + (_initialize_ser_windows): Use LoadLirary/GetProcAddress + to check for existence of CancelIo function in kernel32 DLL. + 2011-02-21 Hui Zhu * Makefile.in (HFILES_NO_SRCDIR): Add printcmd.h. diff --git a/gdb/ser-mingw.c b/gdb/ser-mingw.c index 6d8edcc7980..2c1f0ca6830 100644 --- a/gdb/ser-mingw.c +++ b/gdb/ser-mingw.c @@ -45,6 +45,11 @@ struct ser_windows_state HANDLE except_event; }; +/* CancelIo is not available for Windows 95 OS, so we need to use + LoadLibrary/GetProcAddress to avoid a startup failure. */ +#define CancelIo dyn_CancelIo +static BOOL WINAPI (*CancelIo) (HANDLE); + /* Open up a real live device for serial I/O. */ static int @@ -216,8 +221,12 @@ ser_windows_close (struct serial *scb) { struct ser_windows_state *state; - /* Stop any pending selects. */ - CancelIo ((HANDLE) _get_osfhandle (scb->fd)); + /* Stop any pending selects. On Windows 95 OS, CancelIo function does not + exist. In that case, it can be replaced by a call to CloseHandle, but + this is not necessary here as we do close the Windows handle by calling + close (scb->fd) below. */ + if (CancelIo) + CancelIo ((HANDLE) _get_osfhandle (scb->fd)); state = scb->state; CloseHandle (state->ov.hEvent); CloseHandle (state->except_event); @@ -1208,8 +1217,19 @@ _initialize_ser_windows (void) WSADATA wsa_data; struct serial_ops *ops; - /* First register the serial port driver. */ + HMODULE hm = NULL; + + /* First find out if kernel32 exports CancelIo function. */ + hm = LoadLibrary ("kernel32.dll"); + if (hm) + { + CancelIo = (void *) GetProcAddress (hm, "CancelIo"); + FreeLibrary (hm); + } + else + CancelIo = NULL; + /* Now register the serial port driver. */ ops = XMALLOC (struct serial_ops); memset (ops, 0, sizeof (struct serial_ops)); ops->name = "hardwire";