threads_posix.c revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * libusb synchronization using POSIX Threads
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2011 Vitali Lovich <vlovich@aliph.com>
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2011 Peter Stuge <peter@stuge.se>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This library is free software; you can redistribute it and/or
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modify it under the terms of the GNU Lesser General Public
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License as published by the Free Software Foundation; either
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * version 2.1 of the License, or (at your option) any later version.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This library is distributed in the hope that it will be useful,
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lesser General Public License for more details.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You should have received a copy of the GNU Lesser General Public
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License along with this library; if not, write to the Free Software
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _XOPEN_SOURCE
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if _XOPEN_SOURCE < 500
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  undef _XOPEN_SOURCE
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define _XOPEN_SOURCE 500
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _XOPEN_SOURCE 500
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* _XOPEN_SOURCE */
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <pthread.h>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int usbi_mutex_init_recursive(pthread_mutex_t *mutex, pthread_mutexattr_t *attr)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int err;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pthread_mutexattr_t stack_attr;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!attr) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr = &stack_attr;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		err = pthread_mutexattr_init(&stack_attr);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (err != 0)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return err;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	err = pthread_mutexattr_settype(attr, PTHREAD_MUTEX_RECURSIVE);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (err != 0)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto finish;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	err = pthread_mutex_init(mutex, attr);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)finish:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (attr == &stack_attr)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		pthread_mutexattr_destroy(&stack_attr);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return err;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56