From dc73bc3b23f21fcc5314fd1a6e3f612a41fe9d9c Mon Sep 17 00:00:00 2001 From: codestation Date: Tue, 20 Aug 2013 22:08:50 -0430 Subject: [PATCH] Fix sync issues with CmaClient and commented out some logging. --- cmaclient.cpp | 40 +++++++++++++++++++++++++++++++--------- cmaclient.h | 5 +++++ cmarootobject.cpp | 2 +- database.cpp | 4 ++-- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/cmaclient.cpp b/cmaclient.cpp index f8b1ef9..22c3a63 100644 --- a/cmaclient.cpp +++ b/cmaclient.cpp @@ -32,8 +32,10 @@ QMutex CmaClient::mutex; QMutex CmaClient::runner; +QMutex CmaClient::eloop; Database CmaClient::db; bool CmaClient::is_running = true; +bool CmaClient::event_loop_enabled = true; metadata_t CmaClient::g_thumbmeta = {0, 0, 0, NULL, NULL, 0, 0, 0, Thumbnail, {{18, 144, 80, 0, 1, 1.0f, 2}}, NULL}; CmaClient *CmaClient::this_object = NULL; @@ -57,21 +59,37 @@ void CmaClient::setRunning(bool state) is_running = state; } +bool CmaClient::isEventLoopEnabled() +{ + QMutexLocker locker(&eloop); + return event_loop_enabled; +} + +void CmaClient::setEventLoop(bool state) +{ + QMutexLocker locker(&eloop); + event_loop_enabled = state; +} + void CmaClient::connectUsb() { vita_device_t *vita; - int num_tries = 0; + //int num_tries = 0; qDebug() << "Starting usb_thread:" << QThread::currentThreadId(); while(isRunning()) { if((vita = VitaMTP_Get_First_USB_Vita()) !=NULL) { + cancel_wireless = 1; processNewConnection(vita); } else { - qDebug("No Vita detected via USB, attempt %i", ++num_tries); + //qDebug("No Vita detected via USB, attempt %i", +num_tries++); if(mutex.tryLock()) { mutex.unlock(); Sleeper::msleep(2000); + } else { + mutex.lock(); + mutex.unlock(); } } } @@ -86,16 +104,18 @@ void CmaClient::connectWireless() wireless_host_info_t host; host.port = QCMA_REQUEST_PORT; typedef CmaClient CC; + cancel_wireless = 0; qDebug() << "Starting wireless_thread:" << QThread::currentThreadId(); while(isRunning()) { - if((vita = VitaMTP_Get_First_Wireless_Vita(&host, 0, 2, CC::deviceRegistered, CC::generatePin)) != NULL) { + if((vita = VitaMTP_Get_First_Wireless_Vita(&host, 0, &cancel_wireless, CC::deviceRegistered, CC::generatePin)) != NULL) { processNewConnection(vita); } else { - qDebug("Wireless listener was cancelled"); - mutex.lock(); + qDebug("Wireless listener was cancelled"); // wait until the event loop of the usb thread is finished + mutex.lock(); + cancel_wireless = 0; mutex.unlock(); } } @@ -145,10 +165,11 @@ void CmaClient::enterEventLoop() qDebug("Starting event loop"); - while(isRunning()) { + setEventLoop(true); + while(isEventLoopEnabled()) { if(VitaMTP_Read_Event(device, &event) < 0) { qWarning("Error reading event from Vita."); - setRunning(false); + setEventLoop(false); break; } @@ -397,7 +418,7 @@ void CmaClient::vitaEventRequestTerminate(vita_event_t *event, int eventId) { qDebug("Event recieved in %s, code: 0x%x, id: %d", Q_FUNC_INFO, event->Code, eventId); //qWarning("Event 0x%x unimplemented!", event->Code); - setRunning(false); + setEventLoop(false); } void CmaClient::vitaEventUnimplementated(vita_event_t *event, int eventId) @@ -530,7 +551,7 @@ void CmaClient::vitaEventCancelTask(vita_event_t *event, int eventId) int eventIdToCancel = event->Param2; VitaMTP_CancelTask(device, eventIdToCancel); qWarning("Event CancelTask (0x%x) unimplemented!", event->Code); - setRunning(false); + setEventLoop(false); } void CmaClient::vitaEventSendHttpObjectFromURL(vita_event_t *event, int eventId) @@ -986,6 +1007,7 @@ void CmaClient::close() void CmaClient::stop() { CmaClient::setRunning(false); + CmaClient::setEventLoop(false); } CmaClient::~CmaClient() diff --git a/cmaclient.h b/cmaclient.h index 12a1247..d9229b1 100644 --- a/cmaclient.h +++ b/cmaclient.h @@ -47,6 +47,8 @@ public: private: static bool isRunning(); static void setRunning(bool state); + static bool isEventLoopEnabled(); + static void setEventLoop(bool state); void enterEventLoop(); void processNewConnection(vita_device_t *device); @@ -77,13 +79,16 @@ private: static int deviceRegistered(const char *deviceid); static int generatePin(wireless_vita_info_t *info, int *p_err); + int cancel_wireless; CmaBroadcast broadcast; vita_device_t *device; + static bool event_loop_enabled; static bool is_running; static metadata_t g_thumbmeta; static CmaClient *this_object; static QMutex mutex; static QMutex runner; + static QMutex eloop; signals: void receivedPin(int); diff --git a/cmarootobject.cpp b/cmarootobject.cpp index 0d5ce93..8d88e57 100644 --- a/cmarootobject.cpp +++ b/cmarootobject.cpp @@ -122,7 +122,7 @@ void CMARootObject::createFilter(metadata_t *filter, const char *name, int type) filter->size = 0; filter->dataType = static_cast(Folder | Special); filter->next_metadata = NULL; - qDebug("Added filter %s to database with OHFI %d (%s)", name, filter->ohfi, metadata.name); + //qDebug("Added filter %s to database with OHFI %d (%s)", name, filter->ohfi, metadata.name); } int CMARootObject::getFilters(metadata_t **p_head) diff --git a/database.cpp b/database.cpp index e17e9a9..e492898 100644 --- a/database.cpp +++ b/database.cpp @@ -121,7 +121,7 @@ int Database::scanRootDirectory(root_list &list, int ohfi_type) CMAObject *obj = new CMAObject(getParent(last_dir, info.path())); obj->initObject(info); - qDebug("Added %s to database with OHFI %d", obj->metadata.name, obj->metadata.ohfi); + //qDebug("Added %s to database with OHFI %d", obj->metadata.name, obj->metadata.ohfi); list << obj; if(obj->metadata.dataType & Folder) { @@ -147,7 +147,7 @@ int Database::recursiveScanRootDirectory(root_list &list, CMAObject *parent, int } else { CMAObject *obj = new CMAObject(parent); obj->initObject(info); - qDebug("Added %s to database with OHFI %d", obj->metadata.name, obj->metadata.ohfi); + //qDebug("Added %s to database with OHFI %d", obj->metadata.name, obj->metadata.ohfi); list << obj; if(info.isDir()) { total_objects += recursiveScanRootDirectory(list, obj, ohfi_type);