Skip to content

Commit 8c37f2f

Browse files
committed
Handling race condition for pending_transfers_ and its iterators.
1 parent 14d701b commit 8c37f2f

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

examples/protonect/include/libfreenect2/usb/transfer_pool.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
#include <deque>
3131
#include <libusb.h>
32+
#include <mutex>
3233

3334
#include <libfreenect2/data_callback.h>
3435

@@ -70,6 +71,7 @@ class TransferPool
7071
libusb_device_handle *device_handle_;
7172
unsigned char device_endpoint_;
7273

74+
std::mutex pending_transfers_lock_;
7375
TransferQueue idle_transfers_, pending_transfers_;
7476
unsigned char *buffer_;
7577
size_t buffer_size_;

examples/protonect/src/transfer_pool.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ void TransferPool::submit(size_t num_parallel_transfers)
8686
{
8787
std::cerr << "[TransferPool::submit] too few idle transfers!" << std::endl;
8888
}
89+
pending_transfers_lock_.lock();
8990

9091
for(size_t i = 0; i < num_parallel_transfers; ++i)
9192
{
@@ -105,6 +106,8 @@ void TransferPool::submit(size_t num_parallel_transfers)
105106
std::cerr << "[TransferPool::submit] failed to submit transfer" << std::endl;
106107
}
107108
}
109+
110+
pending_transfers_lock_.unlock();
108111
}
109112

110113
void TransferPool::cancel()
@@ -160,6 +163,7 @@ void TransferPool::onTransferCompleteStatic(libusb_transfer* transfer)
160163

161164
void TransferPool::onTransferComplete(libusb_transfer* transfer)
162165
{
166+
pending_transfers_lock_.lock();
163167
// remove transfer from pending queue - should be fast as it is somewhere at the front
164168
TransferQueue::iterator it = std::find(pending_transfers_.begin(), pending_transfers_.end(), transfer);
165169

@@ -170,6 +174,8 @@ void TransferPool::onTransferComplete(libusb_transfer* transfer)
170174

171175
pending_transfers_.erase(it);
172176

177+
pending_transfers_lock_.unlock();
178+
173179
// process data
174180
processTransfer(transfer);
175181

0 commit comments

Comments
 (0)