diff options
Diffstat (limited to 'backends')
-rw-r--r-- | backends/fs/psp/psp-stream.cpp | 230 | ||||
-rw-r--r-- | backends/fs/psp/psp-stream.h | 70 | ||||
-rw-r--r-- | backends/platform/psp/powerman.cpp | 297 | ||||
-rw-r--r-- | backends/platform/psp/powerman.h | 87 |
4 files changed, 0 insertions, 684 deletions
diff --git a/backends/fs/psp/psp-stream.cpp b/backends/fs/psp/psp-stream.cpp deleted file mode 100644 index fac4067f46..0000000000 --- a/backends/fs/psp/psp-stream.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ -#ifdef __PSP__ - -#include "backends/fs/psp/psp-stream.h" -#include "backends/platform/psp/trace.h" -#include <errno.h> - -PSPIoStream::PSPIoStream(const Common::String &path, bool writeMode) -: StdioStream((void *)1), _path(path), _writeMode(writeMode) { - - assert(!path.empty()); - - _handle = (void *)0; // Need to do this since base class asserts not 0. - - PowerMan.registerSuspend(this); // Register with the powermanager to be suspended - -} - -PSPIoStream::~PSPIoStream() { - PowerMan.unregisterSuspend(this); // Unregister with powermanager to be suspended - // Must do this before fclose() or resume() will reopen. - - fclose((FILE *)_handle); -} - -// Function to open the file pointed to by the path. -// -// -void * PSPIoStream::open() { - if (PowerMan.beginCriticalSection()==PowerManager::Blocked) { - // No need to open. Just return the _handle resume() already opened. - PSPDebugTrace("Suspended in PSPIoStream::open\n"); - } else { - _handle = fopen(_path.c_str(), _writeMode ? "wb" : "rb"); // open - } - - PowerMan.endCriticalSection(); - - return _handle; -} - -bool PSPIoStream::err() const { - bool ret; - - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) - PSPDebugTrace("Suspended in PSPIoStream::err()\n"); - - ret = ferror((FILE *)_handle) != 0; - - PowerMan.endCriticalSection(); - - return ret; -} - -void PSPIoStream::clearErr() { - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) - PSPDebugTrace("Suspended in PSPIoStream::clearErr()\n"); - - clearerr((FILE *)_handle); - - PowerMan.endCriticalSection(); -} - -bool PSPIoStream::eos() const { - bool ret; - - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) - PSPDebugTrace("Suspended in PSPIoStream::eos()\n"); - - ret = feof((FILE *)_handle) != 0; - - PowerMan.endCriticalSection(); - - return ret; -} - -int32 PSPIoStream::pos() const { - int32 ret; - - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) - PSPDebugTrace("Suspended in PSPIoStream::pos()\n"); - - ret = ftell((FILE *)_handle); - - PowerMan.endCriticalSection(); - - return ret; -} - - -int32 PSPIoStream::size() const { - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) - PSPDebugTrace("Suspended in PSPIoStream::size()\n"); - - int32 oldPos = ftell((FILE *)_handle); - fseek((FILE *)_handle, 0, SEEK_END); - int32 length = ftell((FILE *)_handle); - fseek((FILE *)_handle, oldPos, SEEK_SET); - - PowerMan.endCriticalSection(); - - return length; -} - -bool PSPIoStream::seek(int32 offs, int whence) { - int ret = 0; - - // Check if we can access the file - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) - PSPDebugTrace("Suspended in PSPIoStream::seek()\n"); - - ret = fseek((FILE *)_handle, offs, whence); - - PowerMan.endCriticalSection(); - - return ret == 0; -} - -uint32 PSPIoStream::read(void *ptr, uint32 len) { - int ret = 0; - - // Check if we can access the file - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) - PSPDebugTrace("Suspended in PSPIoStream::read()\n"); - - ret = fread((byte *)ptr, 1, len, (FILE *)_handle); - - PowerMan.endCriticalSection(); - - return ret; -} - -uint32 PSPIoStream::write(const void *ptr, uint32 len) { - int ret = 0; - - // Check if we can access the file - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) - PSPDebugTrace("Suspended in PSPIoStream::read()\n"); - - ret = fwrite(ptr, 1, len, (FILE *)_handle); - - PowerMan.endCriticalSection(); - - return ret; -} - -bool PSPIoStream::flush() { - int ret = 0; - - // Check if we can access the file - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) - PSPDebugTrace("Suspended in PSPIoStream::read()\n"); - - ret = fflush((FILE *)_handle); - - PowerMan.endCriticalSection(); - - return ret == 0; -} - -// For the PSP, since we're building in suspend support, we moved opening -// the actual file to an open function since we need an actual PSPIoStream object to suspend. -// -PSPIoStream *PSPIoStream::makeFromPath(const Common::String &path, bool writeMode) { - PSPIoStream *stream = new PSPIoStream(path, writeMode); - - if (stream->open() > 0) { - return stream; - } else { - delete stream; - return 0; - } -} - -/* - * Function to suspend the IO stream (called by PowerManager) - */ -int PSPIoStream::suspend() { - if (_handle > 0) { - _pos = ftell((FILE *)_handle); // Save our position - fclose((FILE *)_handle); // close our file descriptor - _handle = 0; // Set handle to null - } - - return 0; -} - -/* - * Function to resume the IO stream (called by Power Manager) - */ -int PSPIoStream::resume() { - int ret = 0; - - // We reopen our file descriptor - _handle = fopen(_path.c_str(), _writeMode ? "wb" : "rb"); - if (_handle <= 0) { - PSPDebugTrace("PSPIoStream::resume(): Couldn't reopen file %s\n", _path.c_str()); - ret = -1;; - } - - // Resume our previous position - if(_handle > 0) fseek((FILE *)_handle, _pos, SEEK_SET); - - return ret; -} - -#endif /* __PSP__ */ diff --git a/backends/fs/psp/psp-stream.h b/backends/fs/psp/psp-stream.h deleted file mode 100644 index 0363c92416..0000000000 --- a/backends/fs/psp/psp-stream.h +++ /dev/null @@ -1,70 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef PSPSTREAM_H_ -#define PSPSTREAM_H_ - -#include "backends/fs/stdiostream.h" -#include "backends/platform/psp/powerman.h" -#include "common/list.h" - -/* - * Class to handle special suspend/resume needs of PSP IO Streams - */ -class PSPIoStream : public StdioStream, public Suspendable { -protected: - Common::String _path; /* Need to maintain for reopening after suspend */ - bool _writeMode; /* "" */ - unsigned int _pos; /* "" */ - -public: - /** - * Given a path, invoke fopen on that path and wrap the result in a - * PSPIoStream instance. - */ - static PSPIoStream *makeFromPath(const Common::String &path, bool writeMode); - - PSPIoStream(const Common::String &path, bool writeMode); - virtual ~PSPIoStream(); - - void * open(); // open the file pointed to by the file path - - bool err() const; - void clearErr(); - bool eos() const; - - virtual uint32 write(const void *dataPtr, uint32 dataSize); - virtual bool flush(); - - virtual int32 pos() const; - virtual int32 size() const; - virtual bool seek(int32 offs, int whence = SEEK_SET); - virtual uint32 read(void *dataPtr, uint32 dataSize); - - int suspend(); /* Suspendable interface (power manager) */ - int resume(); /* " " */ -}; - -#endif /* PSPSTREAM_H_ */ diff --git a/backends/platform/psp/powerman.cpp b/backends/platform/psp/powerman.cpp deleted file mode 100644 index c553669fc3..0000000000 --- a/backends/platform/psp/powerman.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "./powerman.h" -#include "./trace.h" - -DECLARE_SINGLETON(PowerManager); - - /******************************************* -* -* Constructor -* -********************************************/ -PowerManager::PowerManager() { - _flagMutex = NULL; /* Init mutex handle */ - _listMutex = NULL; /* Init mutex handle */ - _condSuspendable = NULL; /* Init condition variable */ - _condPM = NULL; - - _condSuspendable = SDL_CreateCond(); - if (_condSuspendable <= 0) { - PSPDebugTrace("PowerManager::PowerManager(): Couldn't create condSuspendable\n"); - } - - _condPM = SDL_CreateCond(); - if (_condPM <= 0) { - PSPDebugTrace("PowerManager::PowerManager(): Couldn't create condPM\n"); - } - - _flagMutex = SDL_CreateMutex(); - if (_flagMutex <= 0) { - PSPDebugTrace("PowerManager::PowerManager(): Couldn't create flagMutex\n"); - } - - _listMutex = SDL_CreateMutex(); - if (_listMutex <= 0) { - PSPDebugTrace("PowerManager::PowerManager(): Couldn't create listMutex\n"); - } - - _suspendFlag = false; - _criticalCounter = 0; - } - -/******************************************* -* -* Function to register to be notified when suspend/resume time comes -* -********************************************/ -int PowerManager::registerSuspend(Suspendable *item) { - // Register in list - PSPDebugTrace("In registerSuspend\n"); - - if (SDL_mutexP(_listMutex) != 0) { - PSPDebugTrace("PowerManager::registerSuspend(): Couldn't lock _listMutex %d\n", _listMutex); - } - - _suspendList.push_front(item); - - if (SDL_mutexV(_listMutex) != 0) { - PSPDebugTrace("PowerManager::registerSuspend(): Couldn't unlock _listMutex %d\n", _listMutex); - } - - PSPDebugTrace("Out of registerSuspend\n"); - - return 0; -} - -/******************************************* -* -* Function to unregister to be notified when suspend/resume time comes -* -********************************************/ -int PowerManager::unregisterSuspend(Suspendable *item) { - - PSPDebugTrace("In unregisterSuspend\n"); - - // Unregister from stream list - if (SDL_mutexP(_listMutex) != 0) { - PSPDebugTrace("PowerManager::unregisterSuspend(): Couldn't unlock _listMutex %d\n", _listMutex); - } - - _suspendList.remove(item); - - if (SDL_mutexV(_listMutex) != 0) { - PSPDebugTrace("PowerManager::unregisterSuspend(): Couldn't unlock _listMutex %d\n", _listMutex); - } - - PSPDebugTrace("Out of unregisterSuspend\n"); - - return 0; - } - - /******************************************* -* -* Destructor -* -********************************************/ - PowerManager::~PowerManager() { - SDL_DestroyCond(_condSuspendable); - _condSuspendable = 0; - - SDL_DestroyCond(_condPM); - _condPM = 0; - - SDL_DestroyMutex(_flagMutex); - _flagMutex = 0; - - SDL_DestroyMutex(_listMutex); - _listMutex = 0; - } - - - /******************************************* -* -* Function to be called by threads wanting to block on the PSP entering suspend -* -********************************************/ - int PowerManager::blockOnSuspend() { - return beginCriticalSection(true); -} - - /* - * Function to block on a suspend, then start a non-suspendable critical section - */ -int PowerManager::beginCriticalSection(bool justBlock) { - int ret = PowerManager::NotBlocked; - - if (SDL_mutexP(_flagMutex) != 0) { - PSPDebugTrace("PowerManager::blockOnSuspend(): Couldn't lock flagMutex %d\n", _flagMutex); - ret = PowerManager::Error; - } - - // Check the access flag - if (_suspendFlag == true) { - PSPDebugTrace("Blocking!!\n"); - ret = PowerManager::Blocked; - - // If it's true, we wait for a signal to continue - if( SDL_CondWait(_condSuspendable, _flagMutex) != 0) { - PSPDebugTrace("PowerManager::blockOnSuspend(): Couldn't wait on cond %d\n", _condSuspendable); - } - - PSPDebugTrace("We got blocked!!\n"); - } - - // Now put the pm to sleep - if (justBlock == false) - _criticalCounter++; - - if (SDL_mutexV(_flagMutex) != 0) { - PSPDebugTrace("PowerManager::blockOnSuspend(): Couldn't unlock flagMutex %d\n", _flagMutex); - ret = PowerManager::Error; - } - - return ret; -} - -int PowerManager::endCriticalSection() { - int ret = 0; - - if (SDL_mutexP(_flagMutex) != 0) { - PSPDebugTrace("PowerManager::endCriticalSection(): Couldn't lock flagMutex %d\n", _flagMutex); - ret = PowerManager::Error; - } - - // We're done with our critical section - _criticalCounter--; - - if (_criticalCounter <= 0) { - if(_suspendFlag == true) PSPDebugTrace("Waking up the PM and suspendFlag is true\n"); - - SDL_CondBroadcast(_condPM); - - if (_criticalCounter < 0) { - PSPDebugTrace("PowerManager::endCriticalSection(): Error! Critical counter is %d\n", _criticalCounter); - } - } - - if (SDL_mutexV(_flagMutex) != 0) { - PSPDebugTrace("PowerManager::endCriticalSection(): Couldn't unlock flagMutex %d\n", _flagMutex); - ret = PowerManager::Error; - } - - return ret; -} - - /******************************************* -* -* Callback function to be called to put every Suspendable to suspend -* -********************************************/ -int PowerManager::suspend() { - int ret = 0; - - // First we set the suspend flag to true - if (SDL_mutexP(_flagMutex) != 0) { - PSPDebugTrace("PowerManager::suspend(): Couldn't lock flagMutex %d\n", _flagMutex); - ret = -1; - } - - _suspendFlag = true; - - if (_criticalCounter > 0) - SDL_CondWait(_condPM, _flagMutex); - - if (SDL_mutexV(_flagMutex) != 0) { - PSPDebugTrace("PowerManager::suspend(): Couldn't unlock flagMutex %d\n", _flagMutex); - ret = -1; - } - - // Loop over list, calling suspend() - if (SDL_mutexP(_listMutex) != 0) { - PSPDebugTrace("PowerManager::suspend(): Couldn't lock listMutex %d\n", _listMutex); - ret = -1; - } - - Common::List<Suspendable *>::iterator i = _suspendList.begin(); - - for (; i != _suspendList.end(); i++) { - (*i)->suspend(); - } - - if (SDL_mutexV(_listMutex) != 0) { - PSPDebugTrace("PowerManager::suspend(): Couldn't unlock listMutex %d\n", _listMutex); - ret = -1; - } - - return ret; -} - -/******************************************* -* -* Callback function to resume every Suspendable -* -********************************************/ -int PowerManager::resume() { - int ret = 0; - - // First we notify our Suspendables. Loop over list, calling resume() - if (SDL_mutexP(_listMutex) != 0) { - PSPDebugTrace("PowerManager::resume(): Couldn't lock listMutex %d\n", _listMutex); - ret = -1; - } - - Common::List<Suspendable *>::iterator i = _suspendList.begin(); - - for (; i != _suspendList.end(); i++) { - (*i)->resume(); - } - - if (SDL_mutexV(_listMutex) != 0) { - PSPDebugTrace("PowerManager::resume(): Couldn't unlock listMutex %d\n", _listMutex); - ret = -1; - } - - // Now we set the suspend flag to false - if (SDL_mutexP(_flagMutex) != 0) { - PSPDebugTrace("PowerManager::resume(): Couldn't lock flagMutex %d\n", _flagMutex); - ret = -1; - } - _suspendFlag = false; - - // Signal the other threads to wake up - if (SDL_CondBroadcast(_condSuspendable) != 0) { - PSPDebugTrace("PowerManager::resume(): Couldn't broadcast condition %d\n", _condSuspendable); - ret = -1; - } - - if (SDL_mutexV(_flagMutex) != 0) { - PSPDebugTrace("PowerManager::resume(): Couldn't unlock flagMutex %d\n", _flagMutex); - ret = -1; - } - - return ret; -} diff --git a/backends/platform/psp/powerman.h b/backends/platform/psp/powerman.h deleted file mode 100644 index 0a5f7a2361..0000000000 --- a/backends/platform/psp/powerman.h +++ /dev/null @@ -1,87 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef POWERMAN_H -#define POWERMAN_H - -#include <SDL/SDL_thread.h> -#include <SDL/SDL_mutex.h> -#include "common/singleton.h" -#include "common/list.h" - - /* - * Implement this class (interface) if you want to use PowerManager's suspend callback functionality - * - */ - class Suspendable { - public: - virtual ~Suspendable() {} - virtual int suspend() = 0; - virtual int resume() = 0; - }; - - /****************************************************************************************************** - * - * This class will call a Suspendable when the PSP goes to suspend/resumes. It also provides the ability to block - * a thread when the PSP is going to suspend/suspending, and to wake it up when the PSP is resumed. - * This ability is very useful for managing the PSPIoStream class, but may be found useful by other classes as well. - * - *******************************************************************************************************/ - class PowerManager: public Common::Singleton<PowerManager> { -private: - friend class Common::Singleton<PowerManager>; - PowerManager(); - ~PowerManager(); - - Common::List<Suspendable *> _suspendList; /* list to register in */ - - bool _suspendFlag; /* protected variable */ - SDL_mutex *_flagMutex; /* mutex to access access flag */ - SDL_mutex *_listMutex; /* mutex to access Suspendable list */ - SDL_cond *_condSuspendable; /* signal to synchronize accessing threads */ - SDL_cond *_condPM; /* signal to wake up the PM from a critical section */ - int _criticalCounter; /* Counter of how many threads are in a critical section */ - -public: - int blockOnSuspend(); /* block if suspending */ - int beginCriticalSection(bool justBlock = false); /* Use a critical section to block (if suspend was already pressed) */ - int endCriticalSection(); /* and to prevent the PSP from suspending in a particular section */ - int registerSuspend(Suspendable *item); /* register to be called to suspend/resume */ - int unregisterSuspend(Suspendable *item); /* remove from suspend/resume list */ - int suspend(); /* callback to have all items in list suspend */ - int resume(); /* callback to have all items in list resume */ - - enum { - Error = -1, - NotBlocked = 0, - Blocked = 1 - }; - - }; - - // For easy access -#define PowerMan PowerManager::instance() - - #endif /* POWERMAN_H */ |