You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2015/09/02 04:00:37 UTC

[09/29] ignite git commit: IGNITE-1337: Moved "common" CPP project to Ignite.

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/os/win/include/ignite/common/common.h
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/os/win/include/ignite/common/common.h b/modules/platform/src/main/cpp/common/os/win/include/ignite/common/common.h
new file mode 100644
index 0000000..9e57bde
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/os/win/include/ignite/common/common.h
@@ -0,0 +1,56 @@
+/*
+ * 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_COMMON_COMMON
+#define _IGNITE_COMMON_COMMON
+
+#define IGNITE_EXPORT __declspec(dllexport)
+#define IGNITE_IMPORT __declspec(dllimport)
+#define IGNITE_CALL __stdcall
+
+#define IGNITE_IMPORT_EXPORT IGNITE_EXPORT
+
+#include <iostream>
+
+#define IGNITE_TRACE_ALLOC(addr) \
+    std::cout << "ALLOC " << __FILE__ << "(" << __LINE__ << "): 0x" << (void*)addr << std::endl;
+
+/**
+ * Common construction to disable copy constructor and assignment for class.
+ */
+#define IGNITE_NO_COPY_ASSIGNMENT(cls) \
+    cls(const cls& src); \
+    cls& operator= (const cls& other); 
+
+namespace ignite
+{
+    namespace common
+    {
+        /**
+         * Helper class to manage attached threads.
+         */
+        class AttachHelper 
+        {
+        public:                       
+            /**
+             * Callback invoked on successful thread attach ot JVM.
+             */
+            static void OnThreadAttach();
+        };   
+    }
+}
+
+#endif
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/os/win/include/ignite/common/concurrent_os.h
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/os/win/include/ignite/common/concurrent_os.h b/modules/platform/src/main/cpp/common/os/win/include/ignite/common/concurrent_os.h
new file mode 100644
index 0000000..0a47beb
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/os/win/include/ignite/common/concurrent_os.h
@@ -0,0 +1,406 @@
+/*
+ * 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_COMMON_CONCURRENT_OS
+#define _IGNITE_COMMON_CONCURRENT_OS
+
+#include <map>
+#include <stdint.h>
+#include <windows.h>
+
+#include "ignite/common/common.h"
+
+namespace ignite
+{
+    namespace common 
+    {
+        namespace concurrent 
+        {
+            /**
+             * Static class to manage memory visibility semantics. 
+             */
+            class IGNITE_IMPORT_EXPORT Memory {
+            public:
+                /**
+                 * Full fence. 
+                 */
+                static void Fence();
+            };
+
+            /**
+             * Critical section.
+             */
+            class IGNITE_IMPORT_EXPORT CriticalSection {
+            public:
+                /**
+                 * Constructor.
+                 */
+                CriticalSection();
+
+                /**
+                 * Destructor. 
+                 */
+                ~CriticalSection();
+
+                /**
+                 * Enter critical section.
+                 */
+                void Enter();
+
+                /**
+                 * Leave critical section.
+                 */
+                void Leave();
+            private:
+                /** Handle. */
+                CRITICAL_SECTION* hnd;
+
+                IGNITE_NO_COPY_ASSIGNMENT(CriticalSection)
+            };
+
+            /**
+             * Special latch with count = 1.
+             */
+            class IGNITE_IMPORT_EXPORT SingleLatch
+            {                
+            public:
+                /**
+                 * Constructor.
+                 */
+                SingleLatch();
+
+                /**
+                 * Destructor.
+                 */
+                ~SingleLatch();
+
+                /**
+                 * Perform the countdown.
+                 */
+                void CountDown();
+
+                /**
+                 * Await the countdown.
+                 */
+                void Await();
+            private:
+                /** Handle. */
+                void* hnd;
+
+                IGNITE_NO_COPY_ASSIGNMENT(SingleLatch)
+            };
+
+            /**
+             * Primitives for atomic access.
+             */
+            class IGNITE_IMPORT_EXPORT Atomics
+            {
+            public:
+                /**
+                 * Update the 32-bit integer value if it is equal to expected value.
+                 *
+                 * @param ptr Pointer.
+                 * @param expVal Expected value.
+                 * @param newVal New value.
+                 * @return True if update occurred as a result of this call, false otherwise.
+                 */
+                static bool CompareAndSet32(int32_t* ptr, int32_t expVal, int32_t newVal);
+
+                /**
+                 * Update the 32-bit integer value if it is equal to expected value.
+                 *
+                 * @param ptr Pointer.
+                 * @param expVal Expected value.
+                 * @param newVal New value.
+                 * @return Value which were observed during CAS attempt.
+                 */
+                static int32_t CompareAndSet32Val(int32_t* ptr, int32_t expVal, int32_t newVal);
+                
+                /**
+                 * Increment 32-bit integer and return new value.
+                 *
+                 * @param ptr Pointer.
+                 * @return Value after increment.
+                 */
+                static int32_t IncrementAndGet32(int32_t* ptr);
+
+                /**
+                 * Decrement 32-bit integer and return new value.
+                 *
+                 * @param ptr Pointer.
+                 * @return Value after decrement.
+                 */
+                static int32_t DecrementAndGet32(int32_t* ptr);
+
+                /**
+                 * Update the 64-bit integer value if it is equal to expected value.
+                 *
+                 * @param ptr Pointer.
+                 * @param expVal Expected value.
+                 * @param newVal New value.
+                 * @return True if update occurred as a result of this call, false otherwise.
+                 */
+                static bool CompareAndSet64(int64_t* ptr, int64_t expVal, int64_t newVal);
+
+                /**
+                 * Update the 64-bit integer value if it is equal to expected value.
+                 *
+                 * @param ptr Pointer.
+                 * @param expVal Expected value.
+                 * @param newVal New value.
+                 * @return Value which were observed during CAS attempt.
+                 */
+                static int64_t CompareAndSet64Val(int64_t* ptr, int64_t expVal, int64_t newVal);
+                
+                /**
+                 * Increment 64-bit integer and return new value.
+                 *
+                 * @param ptr Pointer.
+                 * @return Value after increment.
+                 */
+                static int64_t IncrementAndGet64(int64_t* ptr);
+
+                /**
+                 * Decrement 64-bit integer and return new value.
+                 *
+                 * @param ptr Pointer.
+                 * @return Value after decrement.
+                 */
+                static int64_t DecrementAndGet64(int64_t* ptr);
+            };
+
+            /**
+             * Thread-local entry.
+             */
+            class IGNITE_IMPORT_EXPORT ThreadLocalEntry
+            {
+            public:
+                /**
+                 * Virtual destructor to allow for correct typed entries cleanup.
+                 */
+                virtual ~ThreadLocalEntry()
+                {
+                    // No-op.
+                }
+            };
+
+            /**
+             * Typed thread-local entry.
+             */
+            template<typename T>
+            class IGNITE_IMPORT_EXPORT ThreadLocalTypedEntry : public ThreadLocalEntry
+            {
+            public:
+                /**
+                 * Constructor.
+                 *
+                 * @param val Value.
+                 */
+                ThreadLocalTypedEntry(T val) : val(val)
+                {
+                    // No-op.
+                }
+                
+                ~ThreadLocalTypedEntry()
+                {
+                    // No-op.
+                }
+
+                /**
+                 * Get value.
+                 *
+                 * @return Value.
+                 */
+                T Get()
+                {
+                    return val;
+                }
+            private:
+                /** Value. */
+                T val; 
+            };
+
+            /**
+             * Thread-local abstraction.
+             */
+            class IGNITE_IMPORT_EXPORT ThreadLocal
+            {
+            public:
+                /**
+                 * Allocate thread-local index. Invoked once on DLL process attach.
+                 *
+                 * @return True if allocation was successful.
+                 */
+                static bool OnProcessAttach();
+
+                /**
+                 * Release thread-local entry. Invoked on DLL thread detach.
+                 */
+                static void OnThreadDetach();
+
+                /**
+                 * Release thread-local index. Invoked once on DLL process detach.
+                 */
+                static void OnProcessDetach();
+
+                /**
+                 * Get next available index to be used in thread-local storage.
+                 *
+                 * @return Index.
+                 */
+                static int32_t NextIndex();
+
+                /**
+                 * Get value by index.
+                 *
+                 * @param idx Index.
+                 * @return Value associated with the index or NULL.
+                 */
+                template<typename T>
+                static T Get(int32_t idx)
+                {
+                    void* winVal = Get0();
+
+                    if (winVal)
+                    {
+                        std::map<int32_t, ThreadLocalEntry*>* map = 
+                            static_cast<std::map<int32_t, ThreadLocalEntry*>*>(winVal);
+
+                        ThreadLocalTypedEntry<T>* entry = static_cast<ThreadLocalTypedEntry<T>*>((*map)[idx]);
+                        
+                        if (entry)
+                            return entry->Get();
+                    }
+
+                    return T();
+                }
+
+                /**
+                 * Set value at the given index.
+                 *
+                 * @param idx Index.
+                 * @param val Value to be associated with the index.
+                 */
+                template<typename T>
+                static void Set(int32_t idx, const T& val)
+                {
+                    void* winVal = Get0();
+
+                    if (winVal)
+                    {
+                        std::map<int32_t, ThreadLocalEntry*>* map = 
+                            static_cast<std::map<int32_t, ThreadLocalEntry*>*>(winVal);
+
+                        ThreadLocalEntry* appVal = (*map)[idx];
+
+                        if (appVal)
+                            delete appVal;
+
+                        (*map)[idx] = new ThreadLocalTypedEntry<T>(val);
+                    }
+                    else
+                    {
+                        std::map<int32_t, ThreadLocalEntry*>* map = new std::map<int32_t, ThreadLocalEntry*>();
+
+                        Set0(map);
+
+                        (*map)[idx] = new ThreadLocalTypedEntry<T>(val);
+                    }
+                }
+
+                /**
+                 * Remove value at the given index.
+                 *
+                 * @param idx Index.
+                 */
+                static void Remove(int32_t idx);
+
+            private:
+                /**
+                 * Internal get routine.
+                 *
+                 * @param Associated value.
+                 */
+                static void* Get0();
+
+                /**
+                 * Internal set routine.
+                 *
+                 * @param ptr Pointer.
+                 */
+                static void Set0(void* ptr);
+
+                /**
+                 * Internal thread-local map clear routine.
+                 *
+                 * @param mapPtr Pointer to map.
+                 */
+                static void Clear0(void* mapPtr);
+            };
+
+            /**
+             * Thread-local instance. Simplifies API avoiding direct index allocations.
+             */
+            template<typename T>
+            class IGNITE_IMPORT_EXPORT ThreadLocalInstance
+            {
+            public:
+                /**
+                 * Constructor.
+                 */
+                ThreadLocalInstance() : idx(ThreadLocal::NextIndex())
+                {
+                    // No-op.
+                }
+
+                /**
+                 * Get value.
+                 *
+                 * @return Value.
+                 */
+                T Get()
+                {
+                    return ThreadLocal::Get<T>(idx);
+                }
+
+                /**
+                 * Set instance.
+                 *
+                 * @param val Value.
+                 */
+                void Set(const T& val)
+                {
+                    ThreadLocal::Set<T>(idx, val);
+                }
+
+                /**
+                 * Remove instance.
+                 */
+                void Remove()
+                {
+                    ThreadLocal::Remove(idx);
+                }
+
+            private:
+                /** Index. */
+                int32_t idx; 
+            };
+        }
+    }
+}
+
+#endif
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/os/win/src/common.cpp
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/os/win/src/common.cpp b/modules/platform/src/main/cpp/common/os/win/src/common.cpp
new file mode 100644
index 0000000..e83e736
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/os/win/src/common.cpp
@@ -0,0 +1,65 @@
+/*
+ * 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.
+ */
+
+#include <windows.h>
+
+#include "ignite/common/common.h"
+#include "ignite/common/concurrent.h"
+#include "ignite/common/java.h"
+
+using namespace ignite::common::concurrent;
+using namespace ignite::common::java;
+
+namespace ignite
+{
+    namespace common
+    {
+        void AttachHelper::OnThreadAttach()
+        {
+            // No-op.
+        }
+    }
+}
+
+BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ LPVOID lpvReserved)
+{
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            if (!ThreadLocal::OnProcessAttach())
+                return FALSE;
+
+            break;
+
+        case DLL_THREAD_DETACH:
+            ThreadLocal::OnThreadDetach();
+
+            JniContext::Detach();
+
+            break;
+
+        case DLL_PROCESS_DETACH:
+            ThreadLocal::OnProcessDetach();
+
+            break;
+
+        default:
+            break;
+    }
+
+    return TRUE;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/os/win/src/concurrent_os.cpp
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/os/win/src/concurrent_os.cpp b/modules/platform/src/main/cpp/common/os/win/src/concurrent_os.cpp
new file mode 100644
index 0000000..a21f7ec
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/os/win/src/concurrent_os.cpp
@@ -0,0 +1,151 @@
+/*
+ * 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.
+ */
+
+#include "ignite/common/concurrent_os.h"
+
+namespace ignite
+{
+    namespace common
+    {
+        namespace concurrent
+        {
+            /** Thread-local index for Windows. */
+            DWORD winTlsIdx;
+
+            void Memory::Fence() {
+                MemoryBarrier();
+            }
+
+            CriticalSection::CriticalSection() : hnd(new CRITICAL_SECTION) {
+                InitializeCriticalSection(hnd);
+
+                Memory::Fence();
+            }
+
+            CriticalSection::~CriticalSection() {
+                Memory::Fence();
+
+                delete hnd;
+            }
+
+            void CriticalSection::Enter() {
+                Memory::Fence();
+
+                EnterCriticalSection(hnd);
+            }
+
+            void CriticalSection::Leave() {
+                Memory::Fence();
+
+                LeaveCriticalSection(hnd);
+            }
+
+            SingleLatch::SingleLatch() : hnd(CreateEvent(NULL, TRUE, FALSE, NULL))
+            {
+                Memory::Fence();
+            }
+
+            SingleLatch::~SingleLatch()
+            {
+                Memory::Fence();
+
+                CloseHandle(hnd);
+            }
+
+            void SingleLatch::CountDown()
+            {
+                SetEvent(hnd);
+            }
+
+            void SingleLatch::Await()
+            {
+                WaitForSingleObject(hnd, INFINITE);
+            }
+
+            bool Atomics::CompareAndSet32(int32_t* ptr, int32_t expVal, int32_t newVal)
+            {
+                return CompareAndSet32Val(ptr, expVal, newVal) == expVal;
+            }
+
+            int32_t Atomics::CompareAndSet32Val(int32_t* ptr, int32_t expVal, int32_t newVal)
+            {
+                return InterlockedCompareExchange(reinterpret_cast<LONG*>(ptr), newVal, expVal);
+            }
+
+            int32_t Atomics::IncrementAndGet32(int32_t* ptr)
+            {
+                return InterlockedIncrement(reinterpret_cast<LONG*>(ptr));
+            }
+
+            int32_t Atomics::DecrementAndGet32(int32_t* ptr)
+            {
+                return InterlockedDecrement(reinterpret_cast<LONG*>(ptr));
+            }
+
+            bool Atomics::CompareAndSet64(int64_t* ptr, int64_t expVal, int64_t newVal)
+            {
+                return CompareAndSet64Val(ptr, expVal, newVal) == expVal;
+            }
+
+            int64_t Atomics::CompareAndSet64Val(int64_t* ptr, int64_t expVal, int64_t newVal)
+            {
+                return InterlockedCompareExchange64(reinterpret_cast<LONG64*>(ptr), newVal, expVal);
+            }
+
+            int64_t Atomics::IncrementAndGet64(int64_t* ptr)
+            {
+                return InterlockedIncrement64(reinterpret_cast<LONG64*>(ptr));
+            }
+
+            int64_t Atomics::DecrementAndGet64(int64_t* ptr)
+            {
+                return InterlockedDecrement64(reinterpret_cast<LONG64*>(ptr));
+            }
+            
+            bool ThreadLocal::OnProcessAttach()
+            {
+                return (winTlsIdx = TlsAlloc()) != TLS_OUT_OF_INDEXES;
+            }
+
+            void ThreadLocal::OnThreadDetach()
+            {
+                if (winTlsIdx != TLS_OUT_OF_INDEXES)
+                {
+                    void* mapPtr = Get0();
+
+                    Clear0(mapPtr);
+                }
+            }
+
+            void ThreadLocal::OnProcessDetach()
+            {
+                if (winTlsIdx != TLS_OUT_OF_INDEXES)
+                    TlsFree(winTlsIdx);
+            }
+
+            void* ThreadLocal::Get0()
+            {
+                return TlsGetValue(winTlsIdx);
+            }
+
+            void ThreadLocal::Set0(void* ptr)
+            {
+                TlsSetValue(winTlsIdx, ptr);
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/project/README.TXT
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/project/README.TXT b/modules/platform/src/main/cpp/common/project/README.TXT
new file mode 100644
index 0000000..97f4c64
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/project/README.TXT
@@ -0,0 +1 @@
+Contains IDE projects artifacts.

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/project/vs/README.TXT
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/project/vs/README.TXT b/modules/platform/src/main/cpp/common/project/vs/README.TXT
new file mode 100644
index 0000000..f4fb456
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/project/vs/README.TXT
@@ -0,0 +1 @@
+Contains Visual Studio project artifacts.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/project/vs/common.vcxproj
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/project/vs/common.vcxproj b/modules/platform/src/main/cpp/common/project/vs/common.vcxproj
new file mode 100644
index 0000000..478932f
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/project/vs/common.vcxproj
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{4F7E4917-4612-4B96-9838-025711ADE391}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>common</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v100</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v100</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v100</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v100</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <TargetName>ignite.common</TargetName>
+    <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <TargetName>ignite.common</TargetName>
+    <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\</IntDir>
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <TargetName>ignite.common</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <TargetName>ignite.common</TargetName>
+    <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\</IntDir>
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;IGNITEJVM_EXPORTS;_CRT_SECURE_NO_WARNINGS;IGNITE_IMPL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(ProjectDir)\..\..\include;$(ProjectDir)\..\..\os\win\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>$(JAVA_HOME)\lib\jvm.lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <DelayLoadDLLs>jvm.dll</DelayLoadDLLs>
+      <ModuleDefinitionFile>module.def</ModuleDefinitionFile>
+      <OptimizeReferences>false</OptimizeReferences>
+      <EnableCOMDATFolding>false</EnableCOMDATFolding>
+      <LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <SDLCheck>false</SDLCheck>
+      <AdditionalIncludeDirectories>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(ProjectDir)\..\..\include;$(ProjectDir)\..\..\os\win\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;IGNITEJVM_EXPORTS;_CRT_SECURE_NO_WARNINGS;IGNITE_IMPL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalLibraryDirectories>$(JAVA_HOME)\lib\jvm.lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <DelayLoadDLLs>jvm.dll</DelayLoadDLLs>
+      <LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
+      <ModuleDefinitionFile>module.def</ModuleDefinitionFile>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;IGNITEJVM_EXPORTS;_CRT_SECURE_NO_WARNINGS;IGNITE_IMPL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(ProjectDir)\..\..\include;$(ProjectDir)\..\..\os\win\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+      <OmitFramePointers>true</OmitFramePointers>
+      <BufferSecurityCheck>false</BufferSecurityCheck>
+      <StringPooling>true</StringPooling>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>$(JAVA_HOME)\lib\jvm.lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <DelayLoadDLLs>jvm.dll</DelayLoadDLLs>
+      <ModuleDefinitionFile>module.def</ModuleDefinitionFile>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Full</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>false</SDLCheck>
+      <AdditionalIncludeDirectories>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(ProjectDir)\..\..\include;$(ProjectDir)\..\..\os\win\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+      <OmitFramePointers>true</OmitFramePointers>
+      <StringPooling>true</StringPooling>
+      <BufferSecurityCheck>false</BufferSecurityCheck>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;IGNITE_IMPL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalLibraryDirectories>$(JAVA_HOME)\lib\jvm.lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>$(JAVA_HOME)\lib\jvm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <DelayLoadDLLs>jvm.dll</DelayLoadDLLs>
+      <ModuleDefinitionFile>module.def</ModuleDefinitionFile>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="..\..\include\ignite\common\concurrent.h" />
+    <ClInclude Include="..\..\include\ignite\common\exports.h" />
+    <ClInclude Include="..\..\include\ignite\common\java.h" />
+    <ClInclude Include="..\..\os\win\include\ignite\common\common.h" />
+    <ClInclude Include="..\..\os\win\include\ignite\common\concurrent_os.h" />
+    <ClInclude Include="targetver.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\..\os\win\src\common.cpp" />
+    <ClCompile Include="..\..\os\win\src\concurrent_os.cpp" />
+    <ClCompile Include="..\..\src\concurrent.cpp" />
+    <ClCompile Include="..\..\src\exports.cpp" />
+    <ClCompile Include="..\..\src\java.cpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+  <ItemGroup>
+    <None Include="module.def" />
+  </ItemGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/project/vs/common.vcxproj.filters
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/project/vs/common.vcxproj.filters b/modules/platform/src/main/cpp/common/project/vs/common.vcxproj.filters
new file mode 100644
index 0000000..3d4ae54
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/project/vs/common.vcxproj.filters
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Misc">
+      <UniqueIdentifier>{1dbec2be-5cb4-4f70-aef6-b4627d39b99b}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Code">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\..\os\win\include\ignite\common\common.h">
+      <Filter>Code</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\os\win\include\ignite\common\concurrent_os.h">
+      <Filter>Code</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\include\ignite\common\exports.h">
+      <Filter>Code</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\include\ignite\common\java.h">
+      <Filter>Code</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\include\ignite\common\concurrent.h">
+      <Filter>Code</Filter>
+    </ClInclude>
+    <ClInclude Include="targetver.h">
+      <Filter>Misc</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\..\os\win\src\common.cpp">
+      <Filter>Code</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\src\concurrent.cpp">
+      <Filter>Code</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\os\win\src\concurrent_os.cpp">
+      <Filter>Code</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\src\exports.cpp">
+      <Filter>Code</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\src\java.cpp">
+      <Filter>Code</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="module.def">
+      <Filter>Misc</Filter>
+    </None>
+  </ItemGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/project/vs/module.def
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/project/vs/module.def b/modules/platform/src/main/cpp/common/project/vs/module.def
new file mode 100644
index 0000000..d9e8d2b
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/project/vs/module.def
@@ -0,0 +1,99 @@
+LIBRARY ignite.common.dll
+EXPORTS
+IgniteReallocate @1 
+IgniteIgnitionStart @2 
+IgniteIgnitionInstance @3 
+IgniteIgnitionEnvironmentPointer @4 
+IgniteIgnitionStop @5 
+IgniteIgnitionStopAll @6 
+IgniteTargetOutLong @7
+IgniteProcessorReleaseStart @8 
+IgniteProcessorProjection @9 
+IgniteProcessorCache @10 
+IgniteProcessorCreateCache @11 
+IgniteProcessorGetOrCreateCache @12 
+IgniteProcessorAffinity @13 
+IgniteProcessorDataStreamer @14 
+IgniteProcessorTransactions @15 
+IgniteProcessorServices @16
+IgniteTargetInStreamOutObject @17 
+IgniteTargetInStreamOutLong @18 
+IgniteTargetOutStream @19 
+IgniteTargetInStreamOutStream @20 
+IgniteTargetInObjectStreamOutStream @21 
+IgniteTargetListenFuture @22 
+IgniteTargetListenFutureForOperation @23 
+IgniteAffinityPartitions @24 
+IgniteCacheWithSkipStore @25 
+IgniteCacheWithNoRetries @26 
+IgniteCacheWithExpiryPolicy @27 
+IgniteCacheWithAsync @28 
+IgniteCacheWithKeepPortable @29 
+IgniteCacheClear @30 
+IgniteCacheRemoveAll @31 
+IgniteCacheOutOpQueryCursor @32 
+IgniteCacheOutOpContinuousQuery @33 
+IgniteCacheIterator @34 
+IgniteCacheLocalIterator @35 
+IgniteCacheEnterLock @36 
+IgniteCacheExitLock @37 
+IgniteCacheTryEnterLock @38 
+IgniteCacheCloseLock @39 
+IgniteCacheRebalance @40 
+IgniteCacheSize @41 
+IgniteCacheStoreCallbackInvoke @42 
+IgniteComputeWithNoFailover @43 
+IgniteComputeWithTimeout @44 
+IgniteComputeExecuteNative @45 
+IgniteContinuousQueryClose @46 
+IgniteContinuousQueryGetInitialQueryCursor @47 
+IgniteDataStreamerListenTopology @48 
+IgniteDataStreamerAllowOverwriteGet @49 
+IgniteDataStreamerAllowOverwriteSet @50 
+IgniteDataStreamerSkipStoreGet @51 
+IgniteDataStreamerSkipStoreSet @52 
+IgniteDataStreamerPerNodeBufferSizeGet @53 
+IgniteDataStreamerPerNodeBufferSizeSet @54 
+IgniteDataStreamerPerNodeParallelOperationsGet @55 
+IgniteDataStreamerPerNodeParallelOperationsSet @56 
+IgniteMessagingWithAsync @57 
+IgniteProjectionForOthers @58 
+IgniteProjectionForRemotes @59 
+IgniteProjectionForDaemons @60 
+IgniteProjectionForRandom @61 
+IgniteProjectionForOldest @62 
+IgniteProjectionForYoungest @63 
+IgniteProcessorCompute @64 
+IgniteProcessorMessage @65 
+IgniteProcessorEvents @66 
+IgniteProjectionResetMetrics @67 
+IgniteProjectionOutOpRet @68 
+IgniteQueryCursorIterator @69 
+IgniteQueryCursorClose @70 
+IgniteTransactionsStart @71 
+IgniteTransactionsCommit @72 
+IgniteTransactionsCommitAsync @73 
+IgniteTransactionsRollback @74 
+IgniteTransactionsRollbackAsync @75 
+IgniteTransactionsClose @76 
+IgniteTransactionsState @77 
+IgniteTransactionsSetRollbackOnly @78 
+IgniteTransactionsResetMetrics @79 
+IgniteAcquire @80 
+IgniteRelease @81 
+IgniteThrowToJava @82 
+IgniteHandlersSize @83 
+IgniteCreateContext @84 
+IgniteDeleteContext @85 
+IgniteDestroyJvm @86 
+IgniteEventsWithAsync @87 
+IgniteEventsStopLocalListen @88 
+IgniteEventsLocalListen @89 
+IgniteEventsIsEnabled @90 
+IgniteTargetOutObject @91 
+IgniteServicesWithAsync @92
+IgniteServicesWithServerKeepPortable @93
+IgniteServicesCancel @94
+IgniteServicesCancelAll @95
+IgniteServicesGetServiceProxy @96
+IgniteProcessorExtensions @97
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/project/vs/targetver.h
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/project/vs/targetver.h b/modules/platform/src/main/cpp/common/project/vs/targetver.h
new file mode 100644
index 0000000..4bea158
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/project/vs/targetver.h
@@ -0,0 +1,25 @@
+/*
+ * 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
+
+// Including SDKDDKVer.h defines the highest available Windows platform.
+
+// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
+// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
+
+#include <SDKDDKVer.h>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/src/concurrent.cpp
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/src/concurrent.cpp b/modules/platform/src/main/cpp/common/src/concurrent.cpp
new file mode 100644
index 0000000..3f85b65
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/src/concurrent.cpp
@@ -0,0 +1,94 @@
+/*
+ * 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.
+ */
+
+#include "ignite/common/concurrent.h"
+
+namespace ignite
+{
+    namespace common
+    {
+        namespace concurrent
+        {
+            /** Thread-local index generator for application. */
+            int32_t appTlsIdxGen = 0;
+
+            int32_t ThreadLocal::NextIndex()
+            {
+                return Atomics::IncrementAndGet32(&appTlsIdxGen);
+            }
+
+            void ThreadLocal::Remove(int32_t idx)
+            {
+                void* val = Get0();
+
+                if (val)
+                {
+                    std::map<int32_t, ThreadLocalEntry*>* map =
+                        static_cast<std::map<int32_t, ThreadLocalEntry*>*>(val);
+
+                    ThreadLocalEntry* appVal = (*map)[idx];
+
+                    if (appVal)
+                        delete appVal;
+
+                    map->erase(idx);
+
+                    if (map->size() == 0)
+                    {
+                        delete map;
+
+                        Set0(NULL);
+                    }
+                }
+            }
+
+            void ThreadLocal::Clear0(void* mapPtr)
+            {
+                if (mapPtr)
+                {
+                    std::map<int32_t, ThreadLocalEntry*>* map =
+                        static_cast<std::map<int32_t, ThreadLocalEntry*>*>(mapPtr);
+
+                    for (std::map<int32_t, ThreadLocalEntry*>::iterator it = map->begin(); it != map->end(); ++it)
+                        delete it->second;
+
+                    delete map;
+                }
+            }
+
+            SharedPointerImpl::SharedPointerImpl(void* ptr) : ptr(ptr), refCnt(1)
+            {
+                Memory::Fence();
+            }
+
+            void* SharedPointerImpl::Pointer()
+            {
+                return ptr;
+            }
+
+            void SharedPointerImpl::Increment()
+            {
+                Atomics::IncrementAndGet32(&refCnt);
+            }
+
+            bool SharedPointerImpl::Decrement()
+            {
+                return Atomics::DecrementAndGet32(&refCnt) == 0;
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7ca8cbc7/modules/platform/src/main/cpp/common/src/exports.cpp
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/common/src/exports.cpp b/modules/platform/src/main/cpp/common/src/exports.cpp
new file mode 100644
index 0000000..10e4801
--- /dev/null
+++ b/modules/platform/src/main/cpp/common/src/exports.cpp
@@ -0,0 +1,413 @@
+/*
+ * 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.
+ */
+
+#include "ignite/common/exports.h"
+#include "ignite/common/java.h"
+
+namespace gcj = ignite::common::java;
+
+/* --- Target methods. --- */
+extern "C" {
+    int IGNITE_CALL IgniteReallocate(long long memPtr, int cap) {
+        return gcj::JniContext::Reallocate(memPtr, cap);
+    }
+
+    void* IGNITE_CALL IgniteIgnitionStart(gcj::JniContext* ctx, char* cfgPath, char* gridName, int factoryId, long long dataPtr) {
+        return ctx->IgnitionStart(cfgPath, gridName, factoryId, dataPtr);
+    }
+
+	void* IGNITE_CALL IgniteIgnitionInstance(gcj::JniContext* ctx, char* gridName) {
+        return ctx->IgnitionInstance(gridName);
+    }
+
+    long long IGNITE_CALL IgniteIgnitionEnvironmentPointer(gcj::JniContext* ctx, char* gridName) {
+        return ctx->IgnitionEnvironmentPointer(gridName);
+    }
+
+	bool IGNITE_CALL IgniteIgnitionStop(gcj::JniContext* ctx, char* gridName, bool cancel) {
+        return ctx->IgnitionStop(gridName, cancel);
+    }
+
+	void IGNITE_CALL IgniteIgnitionStopAll(gcj::JniContext* ctx, bool cancel) {
+        return ctx->IgnitionStopAll(cancel);
+    }
+
+    void IGNITE_CALL IgniteProcessorReleaseStart(gcj::JniContext* ctx, void* obj) {
+        return ctx->ProcessorReleaseStart(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteProcessorProjection(gcj::JniContext* ctx, void* obj) {
+        return ctx->ProcessorProjection(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteProcessorCache(gcj::JniContext* ctx, void* obj, char* name) {
+        return ctx->ProcessorCache(static_cast<jobject>(obj), name);
+    }
+
+    void* IGNITE_CALL IgniteProcessorCreateCache(gcj::JniContext* ctx, void* obj, char* name) {
+        return ctx->ProcessorCreateCache(static_cast<jobject>(obj), name);
+    }
+
+    void* IGNITE_CALL IgniteProcessorGetOrCreateCache(gcj::JniContext* ctx, void* obj, char* name) {
+        return ctx->ProcessorGetOrCreateCache(static_cast<jobject>(obj), name);
+    }
+
+    void* IGNITE_CALL IgniteProcessorAffinity(gcj::JniContext* ctx, void* obj, char* name) {
+        return ctx->ProcessorAffinity(static_cast<jobject>(obj), name);
+    }
+
+    void*IGNITE_CALL IgniteProcessorDataStreamer(gcj::JniContext* ctx, void* obj, char* name, bool keepPortable) {
+        return ctx->ProcessorDataStreamer(static_cast<jobject>(obj), name, keepPortable);
+    }
+    
+    void* IGNITE_CALL IgniteProcessorTransactions(gcj::JniContext* ctx, void* obj) {
+        return ctx->ProcessorTransactions(static_cast<jobject>(obj));
+    }
+        
+    void* IGNITE_CALL IgniteProcessorCompute(gcj::JniContext* ctx, void* obj, void* prj) {
+        return ctx->ProcessorCompute(static_cast<jobject>(obj), static_cast<jobject>(prj));
+    }
+
+    void* IGNITE_CALL IgniteProcessorMessage(gcj::JniContext* ctx, void* obj, void* prj) {
+        return ctx->ProcessorMessage(static_cast<jobject>(obj), static_cast<jobject>(prj));
+    }
+
+    void* IGNITE_CALL IgniteProcessorEvents(gcj::JniContext* ctx, void* obj, void* prj) {
+        return ctx->ProcessorEvents(static_cast<jobject>(obj), static_cast<jobject>(prj));
+    }
+
+    void* IGNITE_CALL IgniteProcessorServices(gcj::JniContext* ctx, void* obj, void* prj) {
+        return ctx->ProcessorServices(static_cast<jobject>(obj), static_cast<jobject>(prj));
+    }
+
+    void* IGNITE_CALL IgniteProcessorExtensions(gcj::JniContext* ctx, void* obj) {
+        return ctx->ProcessorExtensions(static_cast<jobject>(obj));
+    }
+
+    long long IGNITE_CALL IgniteTargetInStreamOutLong(gcj::JniContext* ctx, void* obj, int opType, long long memPtr) {
+        return ctx->TargetInStreamOutLong(static_cast<jobject>(obj), opType, memPtr);
+    }
+
+    void IGNITE_CALL IgniteTargetInStreamOutStream(gcj::JniContext* ctx, void* obj, int opType, long long inMemPtr, long long outMemPtr) {
+        ctx->TargetInStreamOutStream(static_cast<jobject>(obj), opType, inMemPtr, outMemPtr);
+    }
+
+    void* IGNITE_CALL IgniteTargetInStreamOutObject(gcj::JniContext* ctx, void* obj, int opType, long long memPtr) {
+        return ctx->TargetInStreamOutObject(static_cast<jobject>(obj), opType, memPtr);
+    }
+
+    void IGNITE_CALL IgniteTargetInObjectStreamOutStream(gcj::JniContext* ctx, void* obj, int opType, void* arg, long long inMemPtr, long long outMemPtr) {
+        ctx->TargetInObjectStreamOutStream(static_cast<jobject>(obj), opType, arg, inMemPtr, outMemPtr);
+    }
+    
+    long long IGNITE_CALL IgniteTargetOutLong(gcj::JniContext* ctx, void* obj, int opType) {
+        return ctx->TargetOutLong(static_cast<jobject>(obj), opType);
+    }
+
+    void IGNITE_CALL IgniteTargetOutStream(gcj::JniContext* ctx, void* obj, int opType, long long memPtr) {
+        ctx->TargetOutStream(static_cast<jobject>(obj), opType, memPtr);
+    }
+
+    void* IGNITE_CALL IgniteTargetOutObject(gcj::JniContext* ctx, void* obj, int opType) {
+        return ctx->TargetOutObject(static_cast<jobject>(obj), opType);
+    }
+
+    void IGNITE_CALL IgniteTargetListenFuture(gcj::JniContext* ctx, void* obj, long long futId, int typ) {
+        ctx->TargetListenFuture(static_cast<jobject>(obj), futId, typ);
+    }
+
+    void IGNITE_CALL IgniteTargetListenFutureForOperation(gcj::JniContext* ctx, void* obj, long long futId, int typ, int opId) {
+        ctx->TargetListenFutureForOperation(static_cast<jobject>(obj), futId, typ, opId);
+    }
+
+    int IGNITE_CALL IgniteAffinityPartitions(gcj::JniContext* ctx, void* obj) {
+        return ctx->AffinityPartitions(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteCacheWithSkipStore(gcj::JniContext* ctx, void* obj) {
+        return ctx->CacheWithSkipStore(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteCacheWithNoRetries(gcj::JniContext* ctx, void* obj) {
+        return ctx->CacheWithNoRetries(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteCacheWithExpiryPolicy(gcj::JniContext* ctx, void* obj, long long create, long long update, long long access) {
+        return ctx->CacheWithExpiryPolicy(static_cast<jobject>(obj), create, update, access);
+    }
+
+    void* IGNITE_CALL IgniteCacheWithAsync(gcj::JniContext* ctx, void* obj) {
+        return ctx->CacheWithAsync(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteCacheWithKeepPortable(gcj::JniContext* ctx, void* obj)
+    {
+        return ctx->CacheWithKeepPortable(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteCacheClear(gcj::JniContext* ctx, void* obj) {
+        ctx->CacheClear(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteCacheRemoveAll(gcj::JniContext* ctx, void* obj) {
+        ctx->CacheRemoveAll(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteCacheOutOpQueryCursor(gcj::JniContext* ctx, void* obj, int type, long long memPtr) {
+        return ctx->CacheOutOpQueryCursor(static_cast<jobject>(obj), type, memPtr);
+    }
+
+    void* IGNITE_CALL IgniteCacheOutOpContinuousQuery(gcj::JniContext* ctx, void* obj, int type, long long memPtr) {
+        return ctx->CacheOutOpContinuousQuery(static_cast<jobject>(obj), type, memPtr);
+    }
+
+    void* IGNITE_CALL IgniteCacheIterator(gcj::JniContext* ctx, void* obj) {
+        return ctx->CacheIterator(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteCacheLocalIterator(gcj::JniContext* ctx, void* obj, int peekModes) {
+        return ctx->CacheLocalIterator(static_cast<jobject>(obj), peekModes);
+    }
+
+    void IGNITE_CALL IgniteCacheEnterLock(gcj::JniContext* ctx, void* obj, long long id) {
+        ctx->CacheEnterLock(static_cast<jobject>(obj), id);
+    }
+
+    void IGNITE_CALL IgniteCacheExitLock(gcj::JniContext* ctx, void* obj, long long id) {
+        ctx->CacheExitLock(static_cast<jobject>(obj), id);
+    }
+
+    bool IGNITE_CALL IgniteCacheTryEnterLock(gcj::JniContext* ctx, void* obj, long long id, long long timeout) {
+        return ctx->CacheTryEnterLock(static_cast<jobject>(obj), id, timeout);
+    }
+
+    void IGNITE_CALL IgniteCacheCloseLock(gcj::JniContext* ctx, void* obj, long long id) {
+        ctx->CacheCloseLock(static_cast<jobject>(obj), id);
+    }
+
+    void IGNITE_CALL IgniteCacheRebalance(gcj::JniContext* ctx, void* obj, long long futId) {
+        ctx->CacheRebalance(static_cast<jobject>(obj), futId);
+    }
+
+    int IGNITE_CALL IgniteCacheSize(gcj::JniContext* ctx, void* obj, int peekModes, bool loc) {
+        return ctx->CacheSize(static_cast<jobject>(obj), peekModes, loc);
+    }
+
+    void IGNITE_CALL IgniteComputeWithNoFailover(gcj::JniContext* ctx, void* obj) {
+        ctx->ComputeWithNoFailover(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteComputeWithTimeout(gcj::JniContext* ctx, void* obj, long long timeout) {
+        ctx->ComputeWithTimeout(static_cast<jobject>(obj), timeout);
+    }
+
+    void IGNITE_CALL IgniteComputeExecuteNative(gcj::JniContext* ctx, void* obj, long long taskPtr, long long topVer) {
+        ctx->ComputeExecuteNative(static_cast<jobject>(obj), taskPtr, topVer);
+    }
+
+    void IGNITE_CALL IgniteContinuousQueryClose(gcj::JniContext* ctx, void* obj) {
+        ctx->ContinuousQueryClose(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteContinuousQueryGetInitialQueryCursor(gcj::JniContext* ctx, void* obj) {
+        return ctx->ContinuousQueryGetInitialQueryCursor(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteCacheStoreCallbackInvoke(gcj::JniContext* ctx, void* obj, long long memPtr) {
+        ctx->CacheStoreCallbackInvoke(static_cast<jobject>(obj), memPtr);
+    }
+
+    void IGNITE_CALL IgniteDataStreamerListenTopology(gcj::JniContext* ctx, void* obj, long long ptr) {
+        ctx->DataStreamerListenTopology(static_cast<jobject>(obj), ptr);
+    }
+
+    bool IGNITE_CALL IgniteDataStreamerAllowOverwriteGet(gcj::JniContext* ctx, void* obj) {
+        return ctx->DataStreamerAllowOverwriteGet(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteDataStreamerAllowOverwriteSet(gcj::JniContext* ctx, void* obj, bool val) {
+        ctx->DataStreamerAllowOverwriteSet(static_cast<jobject>(obj), val);
+    }
+
+    bool IGNITE_CALL IgniteDataStreamerSkipStoreGet(gcj::JniContext* ctx, void* obj) {
+        return ctx->DataStreamerSkipStoreGet(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteDataStreamerSkipStoreSet(gcj::JniContext* ctx, void* obj, bool val) {
+        ctx->DataStreamerSkipStoreSet(static_cast<jobject>(obj), val);
+    }
+
+    int IGNITE_CALL IgniteDataStreamerPerNodeBufferSizeGet(gcj::JniContext* ctx, void* obj) {
+        return ctx->DataStreamerPerNodeBufferSizeGet(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteDataStreamerPerNodeBufferSizeSet(gcj::JniContext* ctx, void* obj, int val) {
+        ctx->DataStreamerPerNodeBufferSizeSet(static_cast<jobject>(obj), val);
+    }
+
+    int IGNITE_CALL IgniteDataStreamerPerNodeParallelOperationsGet(gcj::JniContext* ctx, void* obj) {
+        return ctx->DataStreamerPerNodeParallelOperationsGet(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteDataStreamerPerNodeParallelOperationsSet(gcj::JniContext* ctx, void* obj, int val) {
+        ctx->DataStreamerPerNodeParallelOperationsSet(static_cast<jobject>(obj), val);
+    }
+
+    void* IGNITE_CALL IgniteMessagingWithAsync(gcj::JniContext* ctx, void* obj) {
+        return ctx->MessagingWithAsync(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteProjectionForOthers(gcj::JniContext* ctx, void* obj, void* prj) {
+        return ctx->ProjectionForOthers(static_cast<jobject>(obj), static_cast<jobject>(prj));
+    }
+
+    void* IGNITE_CALL IgniteProjectionForRemotes(gcj::JniContext* ctx, void* obj) {
+        return ctx->ProjectionForRemotes(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteProjectionForDaemons(gcj::JniContext* ctx, void* obj) {
+        return ctx->ProjectionForDaemons(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteProjectionForRandom(gcj::JniContext* ctx, void* obj) {
+        return ctx->ProjectionForRandom(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteProjectionForOldest(gcj::JniContext* ctx, void* obj) {
+        return ctx->ProjectionForOldest(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteProjectionForYoungest(gcj::JniContext* ctx, void* obj) {
+        return ctx->ProjectionForYoungest(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteProjectionResetMetrics(gcj::JniContext* ctx, void* obj) {
+        ctx->ProjectionResetMetrics(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteProjectionOutOpRet(gcj::JniContext* ctx, void* obj, int type, long long memPtr) {
+        return ctx->ProjectionOutOpRet(static_cast<jobject>(obj), type, memPtr);
+    }
+
+    void IGNITE_CALL IgniteQueryCursorIterator(gcj::JniContext* ctx, void* obj) {
+        ctx->QueryCursorIterator(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteQueryCursorClose(gcj::JniContext* ctx, void* obj) {
+        ctx->QueryCursorClose(static_cast<jobject>(obj));
+    }
+
+    long long IGNITE_CALL IgniteTransactionsStart(gcj::JniContext* ctx, void* obj, int concurrency, int isolation, long long timeout, int txSize) {
+        return ctx->TransactionsStart(static_cast<jobject>(obj), concurrency, isolation, timeout, txSize);
+    }   
+
+    int IGNITE_CALL IgniteTransactionsCommit(gcj::JniContext* ctx, void* obj, long long id) {
+        return ctx->TransactionsCommit(static_cast<jobject>(obj), id);
+    }
+
+    void IGNITE_CALL IgniteTransactionsCommitAsync(gcj::JniContext* ctx, void* obj, long long id, long long futId) {
+        return ctx->TransactionsCommitAsync(static_cast<jobject>(obj), id, futId);
+    }
+
+    int IGNITE_CALL IgniteTransactionsRollback(gcj::JniContext* ctx, void* obj, long long id) {
+        return ctx->TransactionsRollback(static_cast<jobject>(obj), id);
+    }
+
+    void IGNITE_CALL IgniteTransactionsRollbackAsync(gcj::JniContext* ctx, void* obj, long long id, long long futId) {
+        return ctx->TransactionsRollbackAsync(static_cast<jobject>(obj), id, futId);
+    }
+
+    int IGNITE_CALL IgniteTransactionsClose(gcj::JniContext* ctx, void* obj, long long id) {
+        return ctx->TransactionsClose(static_cast<jobject>(obj), id);
+    }
+
+    int IGNITE_CALL IgniteTransactionsState(gcj::JniContext* ctx, void* obj, long long id) {
+        return ctx->TransactionsState(static_cast<jobject>(obj), id);
+    }
+
+    bool IGNITE_CALL IgniteTransactionsSetRollbackOnly(gcj::JniContext* ctx, void* obj, long long id) {
+        return ctx->TransactionsSetRollbackOnly(static_cast<jobject>(obj), id);
+    }
+
+    void IGNITE_CALL IgniteTransactionsResetMetrics(gcj::JniContext* ctx, void* obj) {
+        ctx->TransactionsResetMetrics(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteAcquire(gcj::JniContext* ctx, void* obj) {
+        return ctx->Acquire(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteRelease(void* obj) {
+        gcj::JniContext::Release(static_cast<jobject>(obj));
+    }
+
+    void IGNITE_CALL IgniteThrowToJava(gcj::JniContext* ctx, char* err) {
+        ctx->ThrowToJava(err);
+    }
+    
+    int IGNITE_CALL IgniteHandlersSize() {
+        return sizeof(gcj::JniHandlers);
+    }
+
+    void* IGNITE_CALL IgniteCreateContext(char** opts, int optsLen, gcj::JniHandlers* cbs) {
+        return gcj::JniContext::Create(opts, optsLen, *cbs);
+    }
+
+    void IGNITE_CALL IgniteDeleteContext(gcj::JniContext* ctx) {
+        delete ctx;
+    }
+
+    void IGNITE_CALL IgniteDestroyJvm(gcj::JniContext* ctx) {
+        ctx->DestroyJvm();
+    }
+
+    void* IGNITE_CALL IgniteEventsWithAsync(gcj::JniContext* ctx, void* obj) {
+        return ctx->EventsWithAsync(static_cast<jobject>(obj));
+    }
+
+    bool IGNITE_CALL IgniteEventsStopLocalListen(gcj::JniContext* ctx, void* obj, long long hnd) {
+        return ctx->EventsStopLocalListen(static_cast<jobject>(obj), hnd);
+    }
+
+    void IGNITE_CALL IgniteEventsLocalListen(gcj::JniContext* ctx, void* obj, long long hnd, int type) {
+        ctx->EventsLocalListen(static_cast<jobject>(obj), hnd, type);
+    }
+
+    bool IGNITE_CALL IgniteEventsIsEnabled(gcj::JniContext* ctx, void* obj, int type) {
+        return ctx->EventsIsEnabled(static_cast<jobject>(obj), type);
+    }    
+    
+	void* IGNITE_CALL IgniteServicesWithAsync(gcj::JniContext* ctx, void* obj) {
+		return ctx->ServicesWithAsync(static_cast<jobject>(obj));
+    }
+
+    void* IGNITE_CALL IgniteServicesWithServerKeepPortable(gcj::JniContext* ctx, void* obj) {
+    		return ctx->ServicesWithServerKeepPortable(static_cast<jobject>(obj));
+        }
+
+	void IGNITE_CALL IgniteServicesCancel(gcj::JniContext* ctx, void* obj, char* name) {
+		ctx->ServicesCancel(static_cast<jobject>(obj), name);
+    }
+
+	void IGNITE_CALL IgniteServicesCancelAll(gcj::JniContext* ctx, void* obj) {
+		ctx->ServicesCancelAll(static_cast<jobject>(obj));
+    }
+
+	void* IGNITE_CALL IgniteServicesGetServiceProxy(gcj::JniContext* ctx, void* obj, char* name, bool sticky) {
+		return ctx->ServicesGetServiceProxy(static_cast<jobject>(obj), name, sticky);
+    }
+}
\ No newline at end of file