X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Ffile_manager.cc;h=2cfa63ae39c19aa387b12e79fbbfb550fcad7a61;hb=62ba8d23e33d009e202968408924d00441fe587a;hp=50f0f2b22d63407a5798fedb07fe2cb71f0d371c;hpb=0b8cc0b5cca73139cfbbb49f201a47718a3f955f;p=ardour.git diff --git a/libs/pbd/file_manager.cc b/libs/pbd/file_manager.cc index 50f0f2b22d..2cfa63ae39 100644 --- a/libs/pbd/file_manager.cc +++ b/libs/pbd/file_manager.cc @@ -18,20 +18,22 @@ */ #include -#include #include #include #include #include -#include #include +#include +#include + #ifdef __APPLE__ #include #endif #include "pbd/compose.h" #include "pbd/file_manager.h" +#include "pbd/resource.h" #include "pbd/debug.h" using namespace std; @@ -42,12 +44,11 @@ FileManager* FileDescriptor::_manager; FileManager::FileManager () : _open (0) { - struct rlimit rl; - int const r = getrlimit (RLIMIT_NOFILE, &rl); + struct ResourceLimit rl; /* XXX: this is a bit arbitrary */ - if (r == 0) { - _max_open = rl.rlim_cur - 64; + if (get_resource_limit (OpenFiles, rl)) { + _max_open = rl.current_limit - 64; } else { _max_open = 256; } @@ -58,7 +59,7 @@ FileManager::FileManager () void FileManager::add (FileDescriptor* d) { - Glib::Mutex::Lock lm (_mutex); + Glib::Threads::Mutex::Lock lm (_mutex); _files.push_back (d); } @@ -66,7 +67,7 @@ FileManager::add (FileDescriptor* d) bool FileManager::allocate (FileDescriptor* d) { - Glib::Mutex::Lock lm (_mutex); + Glib::Threads::Mutex::Lock lm (_mutex); if (!d->is_open()) { @@ -117,10 +118,14 @@ FileManager::allocate (FileDescriptor* d) #ifdef __APPLE__ d->_last_used = mach_absolute_time(); -#else +#elif defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK) struct timespec t; clock_gettime (CLOCK_MONOTONIC, &t); d->_last_used = t.tv_sec + (double) t.tv_nsec / 10e9; +#else + struct timeval now; + gettimeofday (&now, NULL); + d->_last_used = now.tv_sec + (double) now.tv_usec / 10e6; #endif d->_refcount++; @@ -132,7 +137,7 @@ FileManager::allocate (FileDescriptor* d) void FileManager::release (FileDescriptor* d) { - Glib::Mutex::Lock lm (_mutex); + Glib::Threads::Mutex::Lock lm (_mutex); d->_refcount--; assert (d->_refcount >= 0); @@ -142,7 +147,7 @@ FileManager::release (FileDescriptor* d) void FileManager::remove (FileDescriptor* d) { - Glib::Mutex::Lock lm (_mutex); + Glib::Threads::Mutex::Lock lm (_mutex); if (d->is_open ()) { close (d); @@ -193,15 +198,15 @@ FileDescriptor::release () -/** @param n Filename. - * @param w true to open writeable, otherwise false. - * @param m Open mode for the file. +/** @param file_name Filename. + * @param writeable true to open writeable, otherwise false. + * @param mode Open mode for the file. */ -FdFileDescriptor::FdFileDescriptor (string const & n, bool w, mode_t m) - : FileDescriptor (n, w) +FdFileDescriptor::FdFileDescriptor (string const & file_name, bool writeable, mode_t mode) + : FileDescriptor (file_name, writeable) , _fd (-1) - , _mode (m) + , _mode (mode) { manager()->add (this); } @@ -223,8 +228,19 @@ bool FdFileDescriptor::open () { /* we must have a lock on the FileManager's mutex */ - - _fd = ::open (_path.c_str(), _writeable ? (O_RDWR | O_CREAT) : O_RDONLY, _mode); + + /* files must be opened with O_BINARY flag on windows + * or it treats the file as a text stream and puts in + * line endings in etc + */ +#ifdef WIN32 +#define WRITE_FLAGS O_RDWR | O_CREAT | O_BINARY +#define READ_FLAGS O_RDONLY | O_BINARY +#else +#define WRITE_FLAGS O_RDWR | O_CREAT +#define READ_FLAGS O_RDONLY +#endif + _fd = ::g_open (_path.c_str(), _writeable ? WRITE_FLAGS : READ_FLAGS, _mode); return (_fd == -1); } @@ -259,14 +275,14 @@ FileDescriptor::set_path (const string& p) _path = p; } -/** @param n Filename. - * @param w true to open writeable, otherwise false. +/** @param file_name Filename. + * @param mode Mode to pass to fopen. */ -StdioFileDescriptor::StdioFileDescriptor (string const & n, std::string const & m) - : FileDescriptor (n, false) +StdioFileDescriptor::StdioFileDescriptor (string const & file_name, std::string const & mode) + : FileDescriptor (file_name, false) , _file (0) - , _mode (m) + , _mode (mode) { manager()->add (this); }