blob: d5c3d6001e30c31812be60cac82c09c4d43cdf49 [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.
*/
#ifndef _IGNITE_IMPL_INTEROP_INTEROP_MEMORY
#define _IGNITE_IMPL_INTEROP_INTEROP_MEMORY
#include <stdint.h>
#include <ignite/common/common.h>
namespace ignite
{
namespace impl
{
namespace interop
{
/** Memory header length. */
const int IGNITE_MEM_HDR_LEN = 20;
/** Memory header offset: capacity. */
const int IGNITE_MEM_HDR_OFF_CAP = 8;
/** Memory header offset: length. */
const int IGNITE_MEM_HDR_OFF_LEN = 12;
/** Memory header offset: flags. */
const int IGNITE_MEM_HDR_OFF_FLAGS = 16;
/** Flag: external. */
const int IGNITE_MEM_FLAG_EXT = 0x1;
/** Flag: pooled. */
const int IGNITE_MEM_FLAG_POOLED = 0x2;
/** Flag: acquired. */
const int IGNITE_MEM_FLAG_ACQUIRED = 0x4;
/**
* A helper union to bitwise conversion from int32_t to float and back.
*/
union BinaryFloatInt32
{
float f;
int32_t i;
};
/**
* A helper union to bitwise conversion from int64_t to double and back.
*/
union BinaryDoubleInt64
{
double d;
int64_t i;
};
/**
* Interop memory.
*/
class IGNITE_IMPORT_EXPORT InteropMemory
{
public:
/**
* Get raw data pointer.
*
* @param memPtr Memory pointer.
* @return Raw data pointer.
*/
static int8_t* Data(const int8_t* memPtr);
/**
* Set raw data pointer.
*
* @param memPtr Memory pointer.
* @param ptr Raw data pointer.
*/
static void Data(int8_t* memPtr, void* ptr);
/**
* Get capacity.
*
* @param memPtr Memory pointer.
* @return Capacity.
*/
static int32_t Capacity(const int8_t* memPtr);
/**
* Set capacity.
*
* @param memPtr Memory pointer.
* @param val Value.
*/
static void Capacity(int8_t* memPtr, int32_t val);
/**
* Get length.
*
* @param memPtr Memory pointer.
* @return Length.
*/
static int32_t Length(const int8_t* memPtr);
/**
* Set length.
*
* @param memPtr Memory pointer.
* @param val Value.
*/
static void Length(int8_t* memPtr, int32_t val);
/**
* Get flags.
*
* @param memPtr Memory pointer.
* @return Flags.
*/
static int32_t Flags(const int8_t* memPtr);
/**
* Set flags.
*
* @param memPtr Memory pointer.
* @param val Value.
*/
static void Flags(int8_t* memPtr, int32_t val);
/**
* Get "external" flag state.
*
* @param memPtr Memory pointer.
* @return Flag state.
*/
static bool IsExternal(const int8_t* memPtr);
/**
* Get "external" flag state.
*
* @param flags Flags.
* @return Flag state.
*/
static bool IsExternal(int32_t flags);
/**
* Get "pooled" flag state.
*
* @param memPtr Memory pointer.
* @return Flag state.
*/
static bool IsPooled(const int8_t* memPtr);
/**
* Get "pooled" flag state.
*
* @param flags Flags.
* @return Flag state.
*/
static bool IsPooled(int32_t flags);
/**
* Get "acquired" flag state.
*
* @param memPtr Memory pointer.
* @return Flag state.
*/
static bool IsAcquired(const int8_t* memPtr);
/**
* Get "acquired" flag state.
*
* @param flags Flags.
* @return Flag state.
*/
static bool IsAcquired(int32_t flags);
/**
* Constructor.
*/
InteropMemory() : memPtr(0) { }
/**
* Destructor.
*/
virtual ~InteropMemory() { }
/**
* Get cross-platform memory pointer.
*
* @return Memory pointer.
*/
int8_t* Pointer();
/**
* Get cross-platform pointer in long form.
*/
int64_t PointerLong();
/**
* Get raw data pointer.
*
* @return Data pointer.
*/
int8_t* Data();
/**
* Get raw data pointer.
*
* @return Data pointer.
*/
const int8_t* Data() const;
/**
* Get capacity.
*
* @return Capacity.
*/
int32_t Capacity() const;
/**
* Set capacity.
*
* @param val Capacity.
*/
void Capacity(int32_t val);
/**
* Get length.
*
* @return Length.
*/
int32_t Length() const;
/**
* Set length.
*
* @param val Length.
*/
void Length(int32_t val);
/**
* Reallocate memory.
*
* @param cap Desired capacity.
*/
virtual void Reallocate(int32_t cap) = 0;
protected:
/** Memory pointer. */
int8_t* memPtr;
};
/**
* Interop unpooled memory.
*/
class IGNITE_IMPORT_EXPORT InteropUnpooledMemory : public InteropMemory
{
public:
/**
* Constructor create new unpooled memory object from scratch.
*
* @param cap Capacity.
*/
explicit InteropUnpooledMemory(int32_t cap);
/**
* Constructor creating unpooled memory object from existing memory pointer.
*
* @param memPtr Memory pointer.
*/
explicit InteropUnpooledMemory(int8_t* memPtr = 0);
/**
* Destructor.
*/
~InteropUnpooledMemory();
virtual void Reallocate(int32_t cap);
/**
* Try get owning copy.
*
* @param mem Memory instance to transfer ownership to.
* @return True on success
*/
bool TryGetOwnership(InteropUnpooledMemory& mem);
private:
/**
* Release all resources.
*/
void CleanUp();
/** Whether this instance is owner of memory chunk. */
bool owning;
IGNITE_NO_COPY_ASSIGNMENT(InteropUnpooledMemory);
};
}
}
}
#endif //_IGNITE_IMPL_INTEROP_INTEROP_MEMORY