Blame HTTPCacheInterruptHandler.h

Packit a4aae4
Packit a4aae4
// -*- mode: c++; c-basic-offset:4 -*-
Packit a4aae4
Packit a4aae4
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
Packit a4aae4
// Access Protocol.
Packit a4aae4
Packit a4aae4
// Copyright (c) 2002,2003 OPeNDAP, Inc.
Packit a4aae4
// Author: James Gallagher <jgallagher@opendap.org>
Packit a4aae4
//
Packit a4aae4
// This library is free software; you can redistribute it and/or
Packit a4aae4
// modify it under the terms of the GNU Lesser General Public
Packit a4aae4
// License as published by the Free Software Foundation; either
Packit a4aae4
// version 2.1 of the License, or (at your option) any later version.
Packit a4aae4
//
Packit a4aae4
// This library is distributed in the hope that it will be useful,
Packit a4aae4
// but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a4aae4
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a4aae4
// Lesser General Public License for more details.
Packit a4aae4
//
Packit a4aae4
// You should have received a copy of the GNU Lesser General Public
Packit a4aae4
// License along with this library; if not, write to the Free Software
Packit a4aae4
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit a4aae4
//
Packit a4aae4
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
Packit a4aae4
Packit a4aae4
#ifndef http_cache_interrupt_handler_h
Packit a4aae4
#define http_cache_interrupt_handler_h
Packit a4aae4
Packit a4aae4
#include <signal.h>
Packit a4aae4
Packit a4aae4
#include <cassert>
Packit a4aae4
#include <iostream>
Packit a4aae4
#include <algorithm>
Packit a4aae4
Packit a4aae4
#include "HTTPCache.h"
Packit a4aae4
#include "EventHandler.h"
Packit a4aae4
#include "debug.h"
Packit a4aae4
Packit a4aae4
namespace libdap
Packit a4aae4
{
Packit a4aae4
Packit a4aae4
static void
Packit a4aae4
unlink_file(const string &f)
Packit a4aae4
{
Packit a4aae4
    unlink(f.c_str());
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
/** Handle SIGINT for HTTPCache. When the cache is in use and the process is
Packit a4aae4
    sent SIGINT, we must make sure that the cache is left in a consistent
Packit a4aae4
    state. This includes removing the lock file, updating the index file and
Packit a4aae4
    making sure no partially written data or meta data files exist.
Packit a4aae4
Packit a4aae4
    @see EventHandler
Packit a4aae4
    @see SignalHandler
Packit a4aae4
    @see HTTPCache
Packit a4aae4
    @author James Gallagher <jgallagher@opendap.org> */
Packit a4aae4
class HTTPCacheInterruptHandler : public EventHandler
Packit a4aae4
{
Packit a4aae4
private:
Packit a4aae4
Packit a4aae4
public:
Packit a4aae4
    ///
Packit a4aae4
    HTTPCacheInterruptHandler()
Packit a4aae4
    {}
Packit a4aae4
Packit a4aae4
    ///
Packit a4aae4
    virtual ~HTTPCacheInterruptHandler()
Packit a4aae4
    {}
Packit a4aae4
Packit a4aae4
    /** Handle SIGINT. This handler first deletes any files opened but not
Packit a4aae4
    added to the cache index files and then calls
Packit a4aae4
    HTTPCache::delete_instance().
Packit a4aae4
Packit a4aae4
    @param signum We know it is SIGINT; included here as a check and only
Packit a4aae4
    when NDEBUG is not defined.
Packit a4aae4
    @return Never returns. */
Packit a4aae4
    virtual void handle_signal(int signum)
Packit a4aae4
    {
Packit a4aae4
        assert(signum == SIGINT);
Packit a4aae4
        DBG(cerr << "Inside the HTTPCacheInterruptHandler." << endl);
Packit a4aae4
Packit a4aae4
        vector<string> *of = &HTTPCache::_instance->d_open_files;
Packit a4aae4
Packit a4aae4
        DBG(copy(of->begin(), of->end(),
Packit a4aae4
                 ostream_iterator<string>(cerr, "\n")));
Packit a4aae4
Packit a4aae4
        for_each(of->begin(), of->end(), unlink_file);
Packit a4aae4
Packit a4aae4
        HTTPCache::delete_instance();
Packit a4aae4
    }
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
} // namespace libdap
Packit a4aae4
Packit a4aae4
#endif // http_cache_interrupt_handler_h