diff options
author | Andre Heider | 2009-01-16 19:32:19 +0000 |
---|---|---|
committer | Andre Heider | 2009-01-16 19:32:19 +0000 |
commit | 9f1ac87466717d2095539ea9a2a37c77698605fc (patch) | |
tree | 33a84f3b9d871a927a73e71268eae04060fb76dd /backends | |
parent | e9f0fc21e84b78d5b7f48bcdfca4e083b7026cc5 (diff) | |
download | scummvm-rg350-9f1ac87466717d2095539ea9a2a37c77698605fc.tar.gz scummvm-rg350-9f1ac87466717d2095539ea9a2a37c77698605fc.tar.bz2 scummvm-rg350-9f1ac87466717d2095539ea9a2a37c77698605fc.zip |
Reuse given stat flags when possible to avoid fstat() calls
svn-id: r35872
Diffstat (limited to 'backends')
-rw-r--r-- | backends/fs/wii/wii-fs-factory.cpp | 4 | ||||
-rw-r--r-- | backends/fs/wii/wii-fs.cpp | 69 |
2 files changed, 50 insertions, 23 deletions
diff --git a/backends/fs/wii/wii-fs-factory.cpp b/backends/fs/wii/wii-fs-factory.cpp index 0112ffa150..6bc07dd161 100644 --- a/backends/fs/wii/wii-fs-factory.cpp +++ b/backends/fs/wii/wii-fs-factory.cpp @@ -37,13 +37,13 @@ AbstractFSNode *WiiFilesystemFactory::makeCurrentDirectoryFileNode() const { char buf[MAXPATHLEN]; if (getcwd(buf, MAXPATHLEN)) - return new WiiFilesystemNode(buf, true); + return new WiiFilesystemNode(buf); else return new WiiFilesystemNode(); } AbstractFSNode *WiiFilesystemFactory::makeFileNodePath(const Common::String &path) const { - return new WiiFilesystemNode(path, true); + return new WiiFilesystemNode(path); } #endif diff --git a/backends/fs/wii/wii-fs.cpp b/backends/fs/wii/wii-fs.cpp index cbecce2d05..4064e271db 100644 --- a/backends/fs/wii/wii-fs.cpp +++ b/backends/fs/wii/wii-fs.cpp @@ -42,10 +42,12 @@ class WiiFilesystemNode : public AbstractFSNode { protected: Common::String _displayName; Common::String _path; - bool _isDirectory, _isReadable, _isWritable; + bool _exists, _isDirectory, _isReadable, _isWritable; virtual void initRootNode(); virtual bool getDevopChildren(AbstractFSList &list, ListMode mode, bool hidden) const; + virtual void setFlags(const struct stat st); + virtual void clearFlags(); public: /** @@ -57,9 +59,9 @@ public: * Creates a WiiFilesystemNode for a given path. * * @param path Common::String with the path the new node should point to. - * @param verify true if the isValid and isDirectory flags should be verified during the construction. */ - WiiFilesystemNode(const Common::String &path, bool verify); + WiiFilesystemNode(const Common::String &path); + WiiFilesystemNode(const Common::String &p, const struct stat st); virtual bool exists() const; virtual Common::String getDisplayName() const { return _displayName; } @@ -92,7 +94,7 @@ bool WiiFilesystemNode::getDevopChildren(AbstractFSList &list, ListMode mode, bo if (!dt || !dt->name || !dt->open_r || !dt->diropen_r) continue; - list.push_back(new WiiFilesystemNode(Common::String(dt->name) + ":/", true)); + list.push_back(new WiiFilesystemNode(Common::String(dt->name) + ":/")); } return true; @@ -102,16 +104,31 @@ void WiiFilesystemNode::initRootNode() { _path.clear(); _displayName = "<devices>"; + _exists = true; _isDirectory = true; _isReadable = false; _isWritable = false; } +void WiiFilesystemNode::clearFlags() { + _exists = false; + _isDirectory = false; + _isReadable = false; + _isWritable = false; +} + +void WiiFilesystemNode::setFlags(const struct stat st) { + _exists = true; + _isDirectory = S_ISDIR(st.st_mode); + _isReadable = (st.st_mode & S_IRUSR) > 0; + _isWritable = (st.st_mode & S_IWUSR) > 0; +} + WiiFilesystemNode::WiiFilesystemNode() { initRootNode(); } -WiiFilesystemNode::WiiFilesystemNode(const Common::String &p, bool verify) { +WiiFilesystemNode::WiiFilesystemNode(const Common::String &p) { if (p.empty()) { initRootNode(); return; @@ -124,34 +141,44 @@ WiiFilesystemNode::WiiFilesystemNode(const Common::String &p, bool verify) { else _displayName = lastPathComponent(_path, '/'); - if (verify) { - _isDirectory = false; - _isReadable = false; - _isWritable = false; - - struct stat st; - if (!stat(_path.c_str(), &st)) { - _isDirectory = S_ISDIR(st.st_mode); - _isReadable = (st.st_mode & S_IRUSR) > 0; - _isWritable = (st.st_mode & S_IWUSR) > 0; - } + struct stat st; + if (!stat(_path.c_str(), &st)) + setFlags(st); + else + clearFlags(); +} + +WiiFilesystemNode::WiiFilesystemNode(const Common::String &p, const struct stat st) { + if (p.empty()) { + initRootNode(); + return; } + + _path = p; + + if (_path.hasSuffix(":/")) + _displayName = _path; + else + _displayName = lastPathComponent(_path, '/'); + + setFlags(st); } bool WiiFilesystemNode::exists() const { - struct stat st; - return stat(_path.c_str (), &st) == 0; + return _exists; } AbstractFSNode *WiiFilesystemNode::getChild(const Common::String &n) const { assert(_isDirectory); + assert(!n.contains('/')); + Common::String newPath(_path); if (newPath.lastChar() != '/') newPath += '/'; newPath += n; - return new WiiFilesystemNode(newPath, true); + return new WiiFilesystemNode(newPath); } bool WiiFilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hidden) const { @@ -186,7 +213,7 @@ bool WiiFilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi if (isDir) newPath += '/'; - list.push_back(new WiiFilesystemNode(newPath, true)); + list.push_back(new WiiFilesystemNode(newPath, st)); } dirclose(dp); @@ -201,7 +228,7 @@ AbstractFSNode *WiiFilesystemNode::getParent() const { const char *start = _path.c_str(); const char *end = lastPathComponent(_path, '/'); - return new WiiFilesystemNode(Common::String(start, end - start), true); + return new WiiFilesystemNode(Common::String(start, end - start)); } Common::SeekableReadStream *WiiFilesystemNode::openForReading() { |