blob: 8bd0d37b791a6284f6ced9573d3429d4f4374023 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "geode_defs.hpp"
#include "begin_native.hpp"
#include "DistributedSystem.hpp"
#include "end_native.hpp"
#include "native_conditional_unique_ptr.hpp"
#include "SystemProperties.hpp"
#include "Properties.hpp"
#include "impl/CliCallbackDelgate.hpp"
using namespace System;
namespace Apache
{
namespace Geode
{
namespace Client
{
namespace native = apache::geode::client;
/// <summary>
/// DistributedSystem encapsulates this applications "connection" into the
/// Geode Java servers.
/// </summary>
/// <remarks>
/// In order to participate as a client in the Geode Java servers
/// distributed system, each application needs to connect to the
/// DistributedSystem.
/// </remarks>
private ref class DistributedSystem sealed
{
public:
/// <summary>
/// Initializes the Native Client system to be able to connect to the Geode Java servers.
/// </summary>
/// <param name="name">the name of the system to connect to</param>
/// <exception cref="IllegalArgumentException">if name is null</exception>
/// <exception cref="NoSystemException">
/// if the connecting target is not running
/// </exception>
/// <exception cref="AlreadyConnectedException">
/// if trying a second connect.
/// An application can have one only one connection to a DistributedSystem.
/// </exception>
/// <exception cref="UnknownException">otherwise</exception>
DistributedSystem^ Connect(String^ name, Cache^ cache);
/// <summary>
/// Initializes the Native Client system to be able to connect to the
/// Geode Java servers.
/// </summary>
/// <param name="name">the name of the system to connect to</param>
/// <param name="config">the set of properties</param>
/// <exception cref="IllegalArgumentException">if name is null</exception>
/// <exception cref="NoSystemException">
/// if the connecting target is not running
/// </exception>
/// <exception cref="AlreadyConnectedException">
/// if trying a second connect.
/// An application can have one only one connection to a DistributedSystem.
/// </exception>
/// <exception cref="UnknownException">otherwise</exception>
static DistributedSystem^ Connect(String^ name, Properties<String^, String^>^ config, Cache^ cache);
/// <summary>
/// Disconnect from the distributed system.
/// </summary>
/// <exception cref="IllegalStateException">if not connected</exception>
void Disconnect(Cache^ cache);
/// <summary>
/// Returns the SystemProperties used to create this instance of a
/// <c>DistributedSystem</c>.
/// </summary>
/// <returns>the SystemProperties</returns>
property Apache::Geode::Client::SystemProperties^ SystemProperties
{
Apache::Geode::Client::SystemProperties^ get();
}
/// <summary>
/// Get the name that identifies this DistributedSystem instance.
/// </summary>
/// <returns>the name of the DistributedSystem instance.</returns>
property String^ Name
{
String^ get();
}
internal:
/// <summary>
/// Internal factory function to wrap a native object pointer inside
/// this managed class with null pointer check.
/// </summary>
/// <param name="nativeptr">The native object pointer</param>
/// <returns>
/// The managed wrapper object; null if the native pointer is null.
/// </returns>
static DistributedSystem^ Create(native::DistributedSystem* nativeptr);
DistributedSystem(std::unique_ptr<native::DistributedSystem> nativeDistributedSystem);
delegate void cliCallback(apache::geode::client::Cache& cache);
static void registerCliCallback();
static void unregisterCliCallback();
static void RegisterDataSerializablePrimitives(Cache^ cache);
static void RegisterDataSerializablePrimitivesOverrideNativeDeserialization(Cache^ cache);
static void RegisterDataSerializableFixedIdsOverrideNativeDeserialization(Cache^ cache);
/// <summary>
/// Stuff that needs to be done for Connect in each AppDomain.
/// </summary>
static void AppDomainInstanceInitialization(Cache^ cache);
/// <summary>
/// Managed registrations and other stuff to be done for the manage
/// layer after the first connect.
/// </summary>
static void ManagedPostConnect(Cache^ cache);
/// <summary>
/// Unregister the builtin managed types like CacheableObject.
/// </summary>
static void UnregisterBuiltinManagedTypes(Cache^ cache);
native::DistributedSystem& GetNative()
{
return *(m_nativeDistributedSystem->get());
}
private:
///// <summary>
///// Stores the task ID of the task that adjusts unmanaged memory
///// pressure in managed GC.
///// </summary>
//static long s_memoryPressureTaskID = -1;
/// <summary>
/// Private constructor to wrap a native object pointer
/// </summary>
/// <param name="nativeptr">The native object pointer</param>
DistributedSystem(native::DistributedSystem* nativeptr);
/// <summary>
/// Finalizer for the singleton instance of this class.
/// </summary>
~DistributedSystem();
native_conditional_unique_ptr<native::DistributedSystem>^ m_nativeDistributedSystem;
/// <summary>
/// Periodically adjust memory pressure of unmanaged heap for GC.
/// </summary>
static void HandleMemoryPressure(System::Object^ state);
/// <summary>
/// Timer task to periodically invoke <c>HandleMemoryPressure</c>.
/// </summary>
System::Threading::Timer^ m_memoryPressureHandler;
static CliCallbackDelegate^ m_cliCallBackObj;
};
} // namespace Client
} // namespace Geode
} // namespace Apache