/** * @file o3000_portable.h * @brief O-3000 definitions to make portable platform-independent code * @author Patrick Roth - roth@stettbacher.ch * @author Christian Jaeggi - jaeggi@stettbacher.ch * @version 1.0 * @date 2016-03-01 * @copyright 2012-2016 Stettbacher Signal Processing AG * * @remarks * *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* 
* */ #ifndef _O3000_PORTABLE_H #define _O3000_PORTABLE_H /* stdint.h is not available on older MSVC */ #if defined(_MSC_VER) && (_MSC_VER < 1600) && (!defined(_STDINT)) && (!defined(_STDINT_H)) typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else #include #endif // defined(_MSC_VER) && (_MSC_VER < 1600) && (!defined(_STDINT)) && (!defined(_STDINT_H)) /* * Calling conventions * The System V ABI is one of the major ABIs in use today and is virtually universal among Unix * systems. It is the calling convention used by toolchains such as i686-elf-gcc and x86_64-elf-gcc. * * Windows builds often use "project files" and are less transparent and more ad hoc than Makefiles. * As an example, the driver crashes by calling a callback previously register via .NET. Therfore * on MSVC, the calling ABI is defined. On other system (UNIX), the macros below are left * empty. * * _WIN32 is always defined for Win32 or Win64 applications. */ #ifndef _WIN32 #define __cdecl /* nothing */ #define __stdcall /* nothing */ #define __fastcall /* nothing */ #else #include #endif // _WIN32 /* * aligned malloc functiions */ #ifndef _WIN32 #define ALIGNED_ALLOC(align, size) aligned_alloc(align, size) #define ALIGNED_FREE(buf) free(buf) #else #include #define ALIGNED_ALLOC(align, size) _aligned_malloc(size, align) #define ALIGNED_FREE(buf) _aligned_free(buf) #endif // _WIN32 /* * structure packing macros */ #if defined(_MSC_VER) #define __func__ __FUNCTION__ #define __o3000_packed__ __packed #elif defined(__APPLE__) #define __o3000_packed__ __attribute__ ((__packed__)) #else /* define nothing for __func__ because it's used as default macro at source code */ #define __o3000_packed__ __attribute__ ((packed)) #endif // defined(_MSC_VER) /* * mutexes * * copied from libusb project see files os/threads_windows.* and os/threads_poxix.* */ #if defined(_MSC_VER) #define O3000_MUTEX_INITIALIZER 0L typedef LONG o3000_mutex_static_t; static inline void o3000_mutex_static_lock(o3000_mutex_static_t *mutex) { while (InterlockedExchange(mutex, 1L) == 1L) SleepEx(0, TRUE); } static inline void o3000_mutex_static_unlock(o3000_mutex_static_t *mutex) { InterlockedExchange(mutex, 0L); } #else #include #define O3000_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER typedef pthread_mutex_t o3000_mutex_static_t; static inline void o3000_mutex_static_lock(o3000_mutex_static_t *mutex) { (void)pthread_mutex_lock(mutex); } static inline void o3000_mutex_static_unlock(o3000_mutex_static_t *mutex) { (void)pthread_mutex_unlock(mutex); } #endif // defined(_MSC_VER) #endif // _O3000_PORTABLE_H