summaryrefslogtreecommitdiff
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
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>
-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);
}
}