Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions examples/protonect/include/libfreenect2/usb/transfer_pool.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

#include <deque>
#include <libusb.h>
#include <libfreenect2/threading.h>

#include <libfreenect2/data_callback.h>

Expand Down Expand Up @@ -70,6 +71,8 @@ class TransferPool
libusb_device_handle *device_handle_;
unsigned char device_endpoint_;

mutex pending_transfers_lock_;
mutex idle_transfers_lock_;
TransferQueue idle_transfers_, pending_transfers_;
unsigned char *buffer_;
size_t buffer_size_;
Expand Down
13 changes: 13 additions & 0 deletions examples/protonect/src/transfer_pool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,13 @@ void TransferPool::disableSubmission()

void TransferPool::deallocate()
{
idle_transfers_lock_.lock();
for(TransferQueue::iterator it = idle_transfers_.begin(); it != idle_transfers_.end(); ++it)
{
libusb_free_transfer(*it);
}
idle_transfers_lock_.unlock();

idle_transfers_.clear();

if(buffer_ != 0)
Expand All @@ -86,6 +89,7 @@ void TransferPool::submit(size_t num_parallel_transfers)
{
std::cerr << "[TransferPool::submit] too few idle transfers!" << std::endl;
}
pending_transfers_lock_.lock();

for(size_t i = 0; i < num_parallel_transfers; ++i)
{
Expand All @@ -105,10 +109,14 @@ void TransferPool::submit(size_t num_parallel_transfers)
std::cerr << "[TransferPool::submit] failed to submit transfer" << std::endl;
}
}

pending_transfers_lock_.unlock();
}

void TransferPool::cancel()
{
pending_transfers_lock_.lock();

for(TransferQueue::iterator it = pending_transfers_.begin(); it != pending_transfers_.end(); ++it)
{
int r = libusb_cancel_transfer(*it);
Expand All @@ -119,6 +127,8 @@ void TransferPool::cancel()
}
}

pending_transfers_lock_.unlock();

//idle_transfers_.insert(idle_transfers_.end(), pending_transfers_.begin(), pending_transfers_.end());
}

Expand Down Expand Up @@ -160,6 +170,7 @@ void TransferPool::onTransferCompleteStatic(libusb_transfer* transfer)

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

Expand All @@ -170,6 +181,8 @@ void TransferPool::onTransferComplete(libusb_transfer* transfer)

pending_transfers_.erase(it);

pending_transfers_lock_.unlock();

// process data
processTransfer(transfer);

Expand Down