Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
libbladeRF: Introduced thread-safety to the API
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
Showing
26 changed files
with
1,865 additions
and
1,060 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.