diff -r ad3de8730172 -r fe50ada8020b drivers/win32/drivers_win32.cpp --- a/drivers/win32/drivers_win32.cpp Thu Apr 05 10:06:11 2007 +0200 +++ b/drivers/win32/drivers_win32.cpp Fri Apr 06 16:49:28 2007 +0200 @@ -197,8 +197,12 @@ { if (fd0 != NULL && s_driver_procs.m_canSend != NULL) { + UNS8 res; driver_data* data = (driver_data*)fd0; - if ((*s_driver_procs.m_canSend)(data->inst, m)) + LeaveMutex(); + res = (*s_driver_procs.m_canSend)(data->inst, m); + EnterMutex(); + if (res) return 0; } return 1; @@ -217,6 +221,9 @@ data->inst = inst; data->continue_receive_thread = true; CreateReceiveTask(data, &data->receive_thread, &canReceiveLoop); + EnterMutex(); + d->canHandle = data; + LeaveMutex(); return data; } } @@ -224,11 +231,14 @@ } /***************************************************************************/ -int canClose(CAN_PORT fd0) +int canClose(CO_Data * d) { if (fd0 != NULL && s_driver_procs.m_canClose != NULL) { - driver_data* data = (driver_data*)fd0; + EnterMutex(); + driver_data* data = (driver_data*)d->canHandle; + d->canHandle = NULL; + LeaveMutex(); data->continue_receive_thread = false; WaitReceiveTaskEnd(&data->receive_thread); (*s_driver_procs.m_canClose)(data->inst);