Skip to content

Commit

Permalink
libbladeRF: Introduced thread-safety to the API
Browse files Browse the repository at this point in the history
Top-level API functions now acquire a per-device "control lock" before
performing control, programming, and low-level access operations.
(Specifically, these are the functions that manipulate the device handle
and utilize the FX3 <-> FPGA UART.)

Synchronous data transfer functions now hold a per-device, per-module
"sync lock" to ensure these operations are carried out atomically. The
control lock is also held during sync configuration, as upcoming changes
to introduce metadata support will require flipping some config bits on
the FPGA during this operation.

Only these top-level functions shall acquire these locks; the core logic
code should be able to assume that locks are already acquired.

To alleviate confusion, functions that are *not* part of the API, and
therefore are safe to call within the core logic, are stripped of the
bladerf_ prefix.

Now that pthreads is a required dependency, use of the sync API is
is no longer marked optional in the libbladeRF build.
ENABLE_LIBBLADERF_SYNC and related items have been removed from the
CMake build.
  • Loading branch information
jynik committed Aug 2, 2014
1 parent bc560bc commit 7b0cc24
Show file tree
Hide file tree
Showing 26 changed files with 1,865 additions and 1,060 deletions.
69 changes: 69 additions & 0 deletions host/common/include/thread.h
@@ -0,0 +1,69 @@
/**
* @file thread.h
*
* @brief Threading portability and debug wrappers
*
* This file is part of the bladeRF project:
* http://www.github.com/nuand/bladeRF
*
* Copyright (c) 2014 Nuand LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef BLADERF_THREAD_H_
#define BLADERF_THREAD_H_

/* Currently, only pthreads is supported. In the future, native windows threads
* may be used; one of the objectives of this file is to ease that transistion.
*/
#include <pthread.h>
#include "rel_assert.h"

#define MUTEX pthread_mutex_t

#ifdef ENABLE_LOCK_CHECKS
# define MUTEX_INIT(m) do { \
int status; \
pthread_mutexattr_t mutex_attr; \
status = pthread_mutexattr_init(&mutex_attr); \
assert(status == 0 && "Mutex attr init failure"); \
status = pthread_mutexattr_settype(&mutex_attr, \
PTHREAD_MUTEX_ERRORCHECK); \
assert(status == 0 && "Mutex attr setype failure"); \
status = pthread_mutex_init(m, &mutex_attr); \
assert(status == 0 && "Mutex init failure"); \
} while (0)

# define MUTEX_LOCK(m) do { \
int status = pthread_mutex_lock(m); \
assert(status == 0 && "Mutex lock failure");\
} while (0)

# define MUTEX_UNLOCK(m) do { \
int status = pthread_mutex_unlock(m); \
assert(status == 0 && "Mutex unlock failure");\
} while (0)

#else
# define MUTEX_INIT(m) pthread_mutex_init(m, NULL)
# define MUTEX_LOCK(m) pthread_mutex_lock(m)
# define MUTEX_UNLOCK(m) pthread_mutex_unlock(m)
#endif

#endif
57 changes: 26 additions & 31 deletions host/libraries/libbladeRF/CMakeLists.txt
Expand Up @@ -17,6 +17,10 @@ else(MSVC)
endif()
endif(MSVC)

if (NOT HAVE_THREADS)
message(FATAL_ERROR "pthreads not found. This is required to build libbladeRF.")
endif()

################################################################################
# Version information
################################################################################
Expand Down Expand Up @@ -69,16 +73,16 @@ if(NOT ${BUILD_DOCUMENTATION})
set(BUILD_LIBBLADERF_DOCUMENTATION OFF)
endif()

option(ENABLE_LIBBLADERF_SYNC
"Enable the libbladeRF synchronous data interface. Requires pthreads."
${HAVE_THREADS}
)

option(ENABLE_LIBBLADERF_SYNC_LOG_VERBOSE
"Enable log_verbose() calls in the sync interface's data path. Note that this may harm performance."
OFF
)

option(ENABLE_LOCK_CHECKS
"Enable checks for lock acquisition failures (e.g., deadlock)"
OFF
)

##############################
# Backend Support
##############################
Expand Down Expand Up @@ -128,6 +132,9 @@ if(ENABLE_LIBBLADERF_LOGGING)
add_definitions(-DLOGGING_ENABLED)
endif()

if(ENABLE_LOCK_CHECKS)
add_definitions(-DENABLE_LOCK_CHECKS)
endif()

if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR
"${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
Expand Down Expand Up @@ -179,18 +186,9 @@ if(ENABLE_BACKEND_LIBUSB)
endif(NOT LIBUSB_FOUND)
endif(ENABLE_BACKEND_LIBUSB)

if(ENABLE_LIBBLADERF_SYNC)
if(MSVC)
set(LIBBLADERF_INCLUDES ${LIBBLADERF_INCLUDES}
${LIBPTHREADSWIN32_INCLUDE_DIRS})
endif()

add_definitions(-DENABLE_LIBBLADERF_SYNC)

if(ENABLE_LIBBLADERF_SYNC_LOG_VERBOSE AND ENABLE_LIBBLADERF_LOGGING)
add_definitions(-DENABLE_LIBBLADERF_SYNC_LOG_VERBOSE)
endif()
endif(ENABLE_LIBBLADERF_SYNC)
if(ENABLE_LIBBLADERF_SYNC_LOG_VERBOSE AND ENABLE_LIBBLADERF_LOGGING)
add_definitions(-DENABLE_LIBBLADERF_SYNC_LOG_VERBOSE)
endif()

include_directories(${LIBBLADERF_INCLUDES})

Expand All @@ -205,14 +203,18 @@ set(LIBBLADERF_SOURCE
src/config.c
src/dc_cal_table.c
src/file_ops.c
src/fpga.c
src/lms.c
src/si5338.c
src/xb.c
src/version.h
src/device_identifier.c
src/devinfo.c
src/flash.c
src/flash_fields.c
src/image.c
src/sync.c
src/sync_worker.c
src/version_compat.c
${BLADERF_HOST_COMMON_SOURCE_DIR}/sha256.c
${BLADERF_HOST_COMMON_SOURCE_DIR}/conversions.c
Expand All @@ -239,23 +241,16 @@ if(ENABLE_BACKEND_LINUX_DRIVER)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE} src/backend/linux.c)
endif()

if(ENABLE_LIBBLADERF_SYNC)
if(BLADERF_OS_OSX)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE}
src/sync.c
src/sync_worker.c
${BLADERF_HOST_COMMON_SOURCE_DIR}/osx/clock_gettime.c
)
endif()

if(BLADERF_OS_OSX)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE}
${BLADERF_HOST_COMMON_SOURCE_DIR}/osx/clock_gettime.c
)
endif()

if(MSVC)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE}
${BLADERF_HOST_COMMON_SOURCE_DIR}/windows/clock_gettime.c
)
endif()
if(MSVC)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE}
${BLADERF_HOST_COMMON_SOURCE_DIR}/windows/clock_gettime.c
)
endif()

add_library(libbladerf_shared SHARED ${LIBBLADERF_SOURCE})
Expand Down

0 comments on commit 7b0cc24

Please sign in to comment.