Skip to content

Commit

Permalink
Merge pull request #400 from nneonneo/openni2-crash-fix
Browse files Browse the repository at this point in the history
Fix a crash-on-exit in the OpenNI2 driver
  • Loading branch information
piedar committed Jul 3, 2014
2 parents 7a1bc22 + 8dd5185 commit 1692131
Showing 1 changed file with 29 additions and 22 deletions.
51 changes: 29 additions & 22 deletions OpenNI2-FreenectDriver/src/DeviceDriver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,20 @@ namespace FreenectDriver
class Driver : public oni::driver::DriverBase, private Freenect::Freenect
{
private:
std::map<OniDeviceInfo, oni::driver::DeviceBase*> devices;
typedef std::map<OniDeviceInfo, oni::driver::DeviceBase*> OniDeviceMap;
OniDeviceMap devices;

static std::string devid_to_uri(int id) {
return "freenect://" + to_string(id);
}

static int uri_to_devid(const std::string uri) {
int id;
std::istringstream is(uri);
is.seekg(strlen("freenect://"));
is >> id;
return id;
}

public:
Driver(OniDriverServices* pDriverServices) : DriverBase(pDriverServices)
Expand All @@ -230,8 +243,8 @@ namespace FreenectDriver
DriverBase::initialize(connectedCallback, disconnectedCallback, deviceStateChangedCallback, pCookie);
for (int i = 0; i < Freenect::deviceCount(); i++)
{
std::string uri = "freenect://" + to_string(i);
std::string uri = devid_to_uri(i);

WriteMessage("Found device " + uri);

OniDeviceInfo info;
Expand All @@ -247,7 +260,7 @@ namespace FreenectDriver

oni::driver::DeviceBase* deviceOpen(const char* uri, const char* mode = NULL)
{
for (std::map<OniDeviceInfo, oni::driver::DeviceBase*>::iterator iter = devices.begin(); iter != devices.end(); iter++)
for (OniDeviceMap::iterator iter = devices.begin(); iter != devices.end(); iter++)
{
if (strcmp(iter->first.uri, uri) == 0) // found
{
Expand All @@ -258,11 +271,7 @@ namespace FreenectDriver
else
{
WriteMessage("Opening device " + std::string(uri));

unsigned int id;
std::istringstream is(iter->first.uri);
is.seekg(strlen("freenect://"));
is >> id;
int id = uri_to_devid(iter->first.uri);
Device* device = &createDevice<Device>(id);
iter->second = device;
return device;
Expand All @@ -276,24 +285,16 @@ namespace FreenectDriver

void deviceClose(oni::driver::DeviceBase* pDevice)
{
for (std::map<OniDeviceInfo, oni::driver::DeviceBase*>::iterator iter = devices.begin(); iter != devices.end();)
for (OniDeviceMap::iterator iter = devices.begin(); iter != devices.end(); iter++)
{
if (iter->second == pDevice)
{
WriteMessage("Closing device " + std::string(iter->first.uri));

unsigned int id;
std::istringstream is(std::string(iter->first.uri));
is.seekg(strlen("freenect://"));
is >> id;
devices.erase(iter++);
int id = uri_to_devid(iter->first.uri);
devices.erase(iter);
deleteDevice(id);
return;
}
else
{
iter++;
}
}

LogError("Could not close unrecognized device");
Expand All @@ -310,8 +311,14 @@ namespace FreenectDriver

void shutdown()
{
for (std::map<OniDeviceInfo, oni::driver::DeviceBase*>::iterator iter = devices.begin(); iter != devices.end(); iter++)
deviceClose(iter->second);
for (OniDeviceMap::iterator iter = devices.begin(); iter != devices.end(); iter++)
{
WriteMessage("Closing device " + std::string(iter->first.uri));
int id = uri_to_devid(iter->first.uri);
deleteDevice(id);
}

devices.clear();
}


Expand Down

0 comments on commit 1692131

Please sign in to comment.