summaryrefslogtreecommitdiff
path: root/libaltos
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-05-17 03:34:50 -0700
committerKeith Packard <keithp@keithp.com>2013-05-17 03:49:42 -0700
commit6735a391c2a1e3be01ac9e68b44ec0974592c11c (patch)
tree0e90c3ee2aa31273ce38fb9173e6c80fe85fa6bf /libaltos
parentbd8d061d0f63158b5b03814d77cb76fdf5a0abad (diff)
libaltos: use PurgeComm in Windows altos_close to abort in-progress ops
Instead of manually signalling the related events, use PurgeComm which can then abort the operations itself. Also make sure all of the relevant handles are set to INVALID before closing them to avoid race conditions. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'libaltos')
-rw-r--r--libaltos/libaltos.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/libaltos/libaltos.c b/libaltos/libaltos.c
index fc949c70..4a6363ed 100644
--- a/libaltos/libaltos.c
+++ b/libaltos/libaltos.c
@@ -994,6 +994,11 @@ log_message(char *fmt, ...)
if (!log)
log = fopen("\\temp\\altos.txt", "w");
if (log) {
+ SYSTEMTIME time;
+ GetLocalTime(&time);
+ fprintf (log, "%4d-%02d-%02d %2d:%02d:%02d. ",
+ time.wYear, time.wMonth, time.wDay,
+ time.wHour, time.wMinute, time.wSecond);
va_start(a, fmt);
vfprintf(log, fmt, a);
va_end(a);
@@ -1339,6 +1344,7 @@ altos_open(struct altos_device *device)
file->handle = open_serial(full_name);
if (file->handle != INVALID_HANDLE_VALUE)
break;
+ altos_set_last_windows_error();
Sleep(100);
}
@@ -1373,13 +1379,19 @@ altos_open(struct altos_device *device)
PUBLIC void
altos_close(struct altos_file *file)
{
- if (file->handle != INVALID_HANDLE_VALUE) {
- CloseHandle(file->handle);
+ HANDLE handle = file->handle;
+ if (handle != INVALID_HANDLE_VALUE) {
+ HANDLE ov_read = file->ov_read.hEvent;
+ HANDLE ov_write = file->ov_write.hEvent;
+ file->handle = INVALID_HANDLE_VALUE;
+ file->ov_read.hEvent = INVALID_HANDLE_VALUE;
+ file->ov_write.hEvent = INVALID_HANDLE_VALUE;
+ PurgeComm(handle, PURGE_RXABORT|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_TXCLEAR);
+ Sleep(100);
+ CloseHandle(handle);
file->handle = INVALID_HANDLE_VALUE;
- SetEvent(file->ov_read.hEvent);
- SetEvent(file->ov_write.hEvent);
- CloseHandle(file->ov_read.hEvent);
- CloseHandle(file->ov_write.hEvent);
+ CloseHandle(ov_read);
+ CloseHandle(ov_write);
}
}