Home | History | Annotate | Download | only in os
      1 /*
      2  * libusb synchronization using POSIX Threads
      3  *
      4  * Copyright  2011 Vitali Lovich <vlovich (at) aliph.com>
      5  * Copyright  2011 Peter Stuge <peter (at) stuge.se>
      6  *
      7  * This library is free software; you can redistribute it and/or
      8  * modify it under the terms of the GNU Lesser General Public
      9  * License as published by the Free Software Foundation; either
     10  * version 2.1 of the License, or (at your option) any later version.
     11  *
     12  * This library is distributed in the hope that it will be useful,
     13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15  * Lesser General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU Lesser General Public
     18  * License along with this library; if not, write to the Free Software
     19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     20  */
     21 
     22 #include <config.h>
     23 
     24 #include <time.h>
     25 #if defined(__linux__) || defined(__OpenBSD__)
     26 # if defined(__OpenBSD__)
     27 #  define _BSD_SOURCE
     28 # endif
     29 # include <unistd.h>
     30 # include <sys/syscall.h>
     31 #elif defined(__APPLE__)
     32 # include <mach/mach.h>
     33 #elif defined(__CYGWIN__)
     34 # include <windows.h>
     35 #endif
     36 
     37 #include "threads_posix.h"
     38 #include "libusbi.h"
     39 
     40 int usbi_cond_timedwait(pthread_cond_t *cond,
     41 	pthread_mutex_t *mutex, const struct timeval *tv)
     42 {
     43 	struct timespec timeout;
     44 	int r;
     45 
     46 	r = usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &timeout);
     47 	if (r < 0)
     48 		return r;
     49 
     50 	timeout.tv_sec += tv->tv_sec;
     51 	timeout.tv_nsec += tv->tv_usec * 1000;
     52 	while (timeout.tv_nsec >= 1000000000L) {
     53 		timeout.tv_nsec -= 1000000000L;
     54 		timeout.tv_sec++;
     55 	}
     56 
     57 	return pthread_cond_timedwait(cond, mutex, &timeout);
     58 }
     59 
     60 int usbi_get_tid(void)
     61 {
     62 	int ret = -1;
     63 #if defined(__ANDROID__)
     64 	ret = gettid();
     65 #elif defined(__linux__)
     66 	ret = syscall(SYS_gettid);
     67 #elif defined(__OpenBSD__)
     68 	/* The following only works with OpenBSD > 5.1 as it requires
     69 	   real thread support. For 5.1 and earlier, -1 is returned. */
     70 	ret = syscall(SYS_getthrid);
     71 #elif defined(__APPLE__)
     72 	ret = mach_thread_self();
     73 	mach_port_deallocate(mach_task_self(), ret);
     74 #elif defined(__CYGWIN__)
     75 	ret = GetCurrentThreadId();
     76 #endif
     77 /* TODO: NetBSD thread ID support */
     78 	return ret;
     79 }
     80