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