コード例 #1
0
ファイル: DataFile.cpp プロジェクト: epicsdeb/channelarchiver
DataFile *DataFile::reference(const stdString &req_dirname,
                              const stdString &req_basename, bool for_write)
{
    DataFile *datafile = 0;
    stdString dirname, basename, filename;

    Filename::build(req_dirname, req_basename, filename);
    Filename::getDirname(filename, dirname);
    Filename::getBasename(filename, basename);
#ifdef LOG_DATAFILE
    LOG_MSG("reference('%s', '%s', %s)\n",
            req_dirname.c_str(),
            req_basename.c_str(),
            (for_write ?  "read/write" : "read-only"));
    LOG_MSG("normalized: '%s' + '%s' = '%s')\n",
            dirname.c_str(), basename.c_str(), filename.c_str());
#endif
    stdList<DataFile *>::iterator i = open_data_files.begin();
    for (/**/;  i != open_data_files.end ();  ++i)
    {
        datafile = *i;
        if (datafile->getFilename() == filename  &&
            datafile->for_write == for_write)
        {
#ifdef LOG_DATAFILE
            LOG_MSG("DataFile %s (%c) is cached (%d)\n",
                    filename.c_str(),
                    (for_write?'W':'R'), datafile->ref_count);
#endif
            datafile->reference();
            // When it was put in the cache, it might
            // have been a new file.
            // But now it's one that already existed,
            // so reset is_new_file:
            datafile->is_new_file = false;
            return datafile;
        }
    }
    try
    {
        datafile = new DataFile(dirname, basename, filename, for_write);
        datafile->reopen();
        open_data_files.push_back(datafile);
        return datafile;
    }
    catch (...)
    {
        if (datafile)
            delete datafile;
        throw GenericException(__FILE__, __LINE__, "Cannot reference '%s'",
                               filename.c_str());
    }
}
コード例 #2
0
ファイル: DataFile.cpp プロジェクト: epicsdeb/channelarchiver
DataFile *DataFile::reference (const stdString &filename, bool for_write)
{
    DataFile *file;

    FileMap::iterator i = open_data_files.find (filename);
    if (i == open_data_files.end ())
    {
        file = new DataFile (filename, for_write);
        open_data_files.insert (FileMap::value_type (file->getFilename(), file));
    }
    else
    {
        file = i->second;
        file->reference ();
    }

    return file;
}