@@ -60,10 +60,13 @@ void TransferPool::disableSubmission()
60
60
61
61
void TransferPool::deallocate ()
62
62
{
63
+ idle_transfers_lock_.lock ();
63
64
for (TransferQueue::iterator it = idle_transfers_.begin (); it != idle_transfers_.end (); ++it)
64
65
{
65
66
libusb_free_transfer (*it);
66
67
}
68
+ idle_transfers_lock_.unlock ();
69
+
67
70
idle_transfers_.clear ();
68
71
69
72
if (buffer_ != 0 )
@@ -86,6 +89,7 @@ void TransferPool::submit(size_t num_parallel_transfers)
86
89
{
87
90
std::cerr << " [TransferPool::submit] too few idle transfers!" << std::endl;
88
91
}
92
+ pending_transfers_lock_.lock ();
89
93
90
94
for (size_t i = 0 ; i < num_parallel_transfers; ++i)
91
95
{
@@ -105,6 +109,8 @@ void TransferPool::submit(size_t num_parallel_transfers)
105
109
std::cerr << " [TransferPool::submit] failed to submit transfer" << std::endl;
106
110
}
107
111
}
112
+
113
+ pending_transfers_lock_.unlock ();
108
114
}
109
115
110
116
void TransferPool::cancel ()
@@ -160,6 +166,7 @@ void TransferPool::onTransferCompleteStatic(libusb_transfer* transfer)
160
166
161
167
void TransferPool::onTransferComplete (libusb_transfer* transfer)
162
168
{
169
+ pending_transfers_lock_.lock ();
163
170
// remove transfer from pending queue - should be fast as it is somewhere at the front
164
171
TransferQueue::iterator it = std::find (pending_transfers_.begin (), pending_transfers_.end (), transfer);
165
172
@@ -170,6 +177,8 @@ void TransferPool::onTransferComplete(libusb_transfer* transfer)
170
177
171
178
pending_transfers_.erase (it);
172
179
180
+ pending_transfers_lock_.unlock ();
181
+
173
182
// process data
174
183
processTransfer (transfer);
175
184
0 commit comments