15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * libusbx synchronization on Microsoft Windows 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Copyright © 2010 Michael Plante <michael.plante@gmail.com> 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This library is free software; you can redistribute it and/or 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modify it under the terms of the GNU Lesser General Public 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License as published by the Free Software Foundation; either 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * version 2.1 of the License, or (at your option) any later version. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This library is distributed in the hope that it will be useful, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lesser General Public License for more details. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You should have received a copy of the GNU Lesser General Public 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License along with this library; if not, write to the Free Software 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LIBUSB_THREADS_WINDOWS_H 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIBUSB_THREADS_WINDOWS_H 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define usbi_mutex_static_t volatile LONG 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USBI_MUTEX_INITIALIZER 0 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define usbi_mutex_t HANDLE 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct usbi_cond_perthread { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct list_head list; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD tid; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE event; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct usbi_cond_t_ { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Every time a thread touches the CV, it winds up in one of these lists. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It stays there until the CV is destroyed, even if the thread 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // terminates. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct list_head waiters; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct list_head not_waiting; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct usbi_cond_t_ usbi_cond_t; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We *were* getting timespec from pthread.h: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (!defined(HAVE_STRUCT_TIMESPEC) && !defined(_TIMESPEC_DEFINED)) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HAVE_STRUCT_TIMESPEC 1 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _TIMESPEC_DEFINED 1 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct timespec { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long tv_sec; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long tv_nsec; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_STRUCT_TIMESPEC | _TIMESPEC_DEFINED */ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We *were* getting ETIMEDOUT from pthread.h: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ETIMEDOUT 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define usbi_mutexattr_t void 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define usbi_condattr_t void 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// all Windows mutexes are recursive 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define usbi_mutex_init_recursive(mutex, attr) usbi_mutex_init((mutex), (attr)) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_mutex_static_lock(usbi_mutex_static_t *mutex); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_mutex_init(usbi_mutex_t *mutex, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const usbi_mutexattr_t *attr); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_mutex_lock(usbi_mutex_t *mutex); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_mutex_unlock(usbi_mutex_t *mutex); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_mutex_trylock(usbi_mutex_t *mutex); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_mutex_destroy(usbi_mutex_t *mutex); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_cond_init(usbi_cond_t *cond, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const usbi_condattr_t *attr); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_cond_destroy(usbi_cond_t *cond); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_cond_timedwait(usbi_cond_t *cond, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) usbi_mutex_t *mutex, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct timespec *abstime); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_cond_broadcast(usbi_cond_t *cond); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_cond_signal(usbi_cond_t *cond); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint usbi_get_tid(void); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif /* LIBUSB_THREADS_WINDOWS_H */ 88