(file) Return to ShutdownService.h CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Server

File: [Pegasus] / pegasus / src / Pegasus / Server / ShutdownService.h (download)
Revision: 1.23.12.1, Wed Dec 10 22:22:39 2008 UTC (15 years, 6 months ago) by kumpf
Branch: RELEASE_2_8-branch
CVS Tags: RELEASE_2_8_2-RC1, RELEASE_2_8_2, RELEASE_2_8_1-RC1, RELEASE_2_8_1
Changes since 1.23: +1 -9 lines
BUG#: 8253
TITLE: cimserver may hang on start-up exception
DESCRIPTION: Make sure providers are stopped when cimserver start-up fails.

//%2006////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
// IBM Corp.; EMC Corporation, The Open Group.
// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
// EMC Corporation; VERITAS Software Corporation; The Open Group.
// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
// EMC Corporation; Symantec Corporation; The Open Group.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// 
// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//==============================================================================
//
//%////////////////////////////////////////////////////////////////////////////

#ifndef Pegasus_ShutdownService_h
#define Pegasus_ShutdownService_h

#include <cctype>
#include <Pegasus/Common/Config.h>
#include <Pegasus/Config/ConfigManager.h>
#include <Pegasus/Common/String.h>
#include <Pegasus/Common/ArrayInternal.h>
#include <Pegasus/Common/System.h>
#include <Pegasus/Common/ModuleController.h>
#include <Pegasus/Common/AutoPtr.h>
#include <Pegasus/Server/CIMServer.h>
#include <Pegasus/Server/Linkage.h>

PEGASUS_NAMESPACE_BEGIN

/**
    This class defines the ShutdownService necessary to process the shutdown
    request to gracefully shutdown the CIMServer.
   
    In order to shutdown the CIMServer gracefully, the CIMServer state
    information must be maintained.
   
    The state of the CIMServer is kept in the CIMServerState object.  After
    CIMServer starts up, the CIMServer state is set to RUNNING.  When a
    shutdown request is received by the ShutdownService, the CIMServer state
    will be set to TERMINATING.
   
    Whenever a request comes through a client connection, before the request
    is being routed off to the appropriate message queue, the CIMServer state
    is checked.  If the state is set to TERMINATING, this means CIMServer is
    in the process of being shutdown, an error response will be sent back
    to the client to indicate that the request cannot be processed due to
    CIMServer shutting down.
   
    In order to determine if the CIMServer is servicing any CIM requests at
    the time of a shutdown, CIMServer keeps track of the number of CIM requests
    that are outstanding.  This request count is kept in the HTTPConnection
    object.  The request count is incremented everytime a request comes through
    a client connection, and is decremented everytime a response is sent back
    to the client.
   
    Before the ShutdownService shuts down the CIMServer, the request count is
    checked to determine if there are any outstanding CIM requests being
    processed.  If there are no requests outstanding, the CIMServer will be
    shutdown.  If there are requests outstanding, the ShutdownService will
    wait periodically until the requests are all processed or until the
    timeout expires before shutting down CIMServer.
*/

class PEGASUS_SERVER_LINKAGE ShutdownService
{
public:

    /**
        Terminate the ShutdownService
    */
    static void destroy();

    /**
        Construct the singleton instance of the ShutdownService and return a
        pointer to that instance.
        @param cimserver A pointer to a CIMServer for which to construct the
            ShutdownService object.
        @return A pointer to the singleton ShutdownService instance.
    */
    static ShutdownService* getInstance(CIMServer* cimserver);

    /**
        Shutdown CIMOM.
        @param force A Boolean indicating whether the shutdown should be
            performed unconditionally.
        @param timeout An integer value specifying the number of seconds to
            wait for a clean shutdown.
        @param requestPending Boolean indicating whether the shutdown was
            initiated through a synchronous CIM request (true) or not (false).
    */
    void shutdown(Boolean force, Uint32 timeout, Boolean requestPending);

    void shutdownProviders();
    void shutdownCimomServices();
    Boolean waitUntilNoMoreRequests(Boolean requestPending);

protected:

    static ModuleController* _controller;

private:

    static ShutdownService* _instance;
    static CIMServer* _cimserver;
    static Uint32 _shutdownTimeout;

    //
    // This is meant to be a singleton, so the constructor and the
    // destructor are made private.
    //

    /** Constructor. */
    ShutdownService(CIMServer* cimserver);

    /** Destructor. */
    ~ShutdownService();

    void _sendShutdownRequestToService(const char* serviceName);
};

PEGASUS_NAMESPACE_END

#endif /* Pegasus_ShutdownService_h */

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2