Use boost::shared_array<> instead of raw pointers

This commit is contained in:
Ingo Ruhnke 2009-08-05 14:10:08 +02:00
parent 372409dbb3
commit d2416bbdcb
3 changed files with 33 additions and 33 deletions

1
NEWS
View file

@ -2,6 +2,7 @@ xboxdrv 0.4.9 - (??/Aug/2009)
=============================
* Saitek P2500 support (no rumble, untested)
* changes in the thread handling to reduce latency some more
xboxdrv 0.4.8 - (30/Jul/2009)

View file

@ -35,9 +35,6 @@ USBReadThread::~USBReadThread()
{
if (!m_stop)
stop_thread();
for(std::list<Paket>::iterator i = m_read_buffer.begin(); i != m_read_buffer.end(); ++i)
delete[] i->data;
}
void
@ -57,48 +54,49 @@ USBReadThread::stop_thread()
int
USBReadThread::read(uint8_t* data, int len, int timeout)
{
boost::mutex::scoped_lock lock(m_read_buffer_mutex);
if (!m_read_buffer_cond.timed_wait(lock, boost::posix_time::milliseconds(timeout), buffer_not_empty(m_read_buffer)))
return 0;
assert(len == m_read_length);
Paket& paket = m_read_buffer.front();
boost::mutex::scoped_lock lock(m_read_buffer_mutex);
memcpy(data, paket.data, m_read_length);
delete[] paket.data;
int ret = paket.length;
if (!m_read_buffer_cond.timed_wait(lock, boost::posix_time::milliseconds(timeout),
buffer_not_empty(m_read_buffer)))
{
return 0;
}
else
{
Paket paket = m_read_buffer.front();
m_read_buffer.pop_front();
memcpy(data, paket.data.get(), m_read_length);
m_read_buffer.pop_front();
return ret;
return paket.length;
}
}
void
USBReadThread::run()
{
boost::shared_array<uint8_t> data(new uint8_t[m_read_length]);
while(!m_stop)
{
uint8_t* data = new uint8_t[m_read_length];
int ret = usb_interrupt_read(m_handle, m_read_endpoint, (char*)data.get(), m_read_length, 0 /*timeout*/);
int ret = usb_interrupt_read(m_handle, m_read_endpoint, (char*)data, m_read_length, 0 /*timeout*/);
if (ret == 0)
{
delete[] data;
}
else
if (ret != 0)
{
boost::mutex::scoped_lock lock(m_read_buffer_mutex);
Paket paket;
paket.data = data;
paket.length = ret;
m_read_buffer.push_back(paket);
m_read_buffer_cond.notify_one();
data = boost::shared_array<uint8_t>(new uint8_t[m_read_length]);
}
}
}

View file

@ -23,6 +23,7 @@
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/condition.hpp>
#include <boost/shared_array.hpp>
#include <list>
class USBReadThread
@ -32,9 +33,10 @@ private:
const int m_read_endpoint;
const int m_read_length;
struct Paket {
uint8_t* data;
int length;
struct Paket
{
boost::shared_array<uint8_t> data;
int length;
};
typedef std::list<Paket> Buffer;
@ -47,14 +49,13 @@ private:
{
Buffer& m_buffer;
buffer_not_empty(Buffer& buffer) :
m_buffer(buffer)
{
}
bool operator()() const
{
return !m_buffer.empty();
buffer_not_empty(Buffer& buffer)
: m_buffer(buffer)
{}
bool operator()() const
{
return !m_buffer.empty();
}
};