You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/02/15 10:44:56 UTC

[31/50] [abbrv] ignite git commit: IGNITE-1680: CPP: Implemented API for user entry point lookup. This closes #1430.

http://git-wip-us.apache.org/repos/asf/ignite/blob/1410900f/modules/platforms/cpp/jni/include/ignite/jni/utils.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/jni/include/ignite/jni/utils.h b/modules/platforms/cpp/jni/include/ignite/jni/utils.h
index 2b22cf9..bbd461d 100644
--- a/modules/platforms/cpp/jni/include/ignite/jni/utils.h
+++ b/modules/platforms/cpp/jni/include/ignite/jni/utils.h
@@ -44,14 +44,14 @@ namespace ignite
         };
 
         /**
-        * Represents global reference to Java object.
-        */
+         * Represents global reference to Java object.
+         */
         class IGNITE_IMPORT_EXPORT JavaGlobalRef
         {
         public:
             /**
-            * Default constructor
-            */
+             * Default constructor
+             */
             JavaGlobalRef() :
                 ctx(0),
                 obj(0)
@@ -60,11 +60,11 @@ namespace ignite
             }
 
             /**
-            * Constructor
-            *
-            * @param ctx JNI context.
-            * @param obj Java object.
-            */
+             * Constructor
+             *
+             * @param ctx JNI context.
+             * @param obj Java object.
+             */
             JavaGlobalRef(java::JniContext& ctx, jobject obj) :
                 ctx(&ctx),
                 obj(ctx.Acquire(obj))
@@ -73,10 +73,10 @@ namespace ignite
             }
 
             /**
-            * Copy constructor
-            *
-            * @param other Other instance.
-            */
+             * Copy constructor
+             *
+             * @param other Other instance.
+             */
             JavaGlobalRef(const JavaGlobalRef& other) :
                 ctx(other.ctx),
                 obj(ctx->Acquire(other.obj))
@@ -85,11 +85,11 @@ namespace ignite
             }
 
             /**
-            * Assignment operator.
-            *
-            * @param other Other instance.
-            * @return *this.
-            */
+             * Assignment operator.
+             *
+             * @param other Other instance.
+             * @return *this.
+             */
             JavaGlobalRef& operator=(const JavaGlobalRef& other)
             {
                 if (this != &other)
@@ -105,8 +105,8 @@ namespace ignite
             }
 
             /**
-            * Destructor.
-            */
+             * Destructor.
+             */
             ~JavaGlobalRef()
             {
                 if (ctx)
@@ -114,10 +114,10 @@ namespace ignite
             }
 
             /**
-            * Get object.
-            *
-            * @return Object.
-            */
+             * Get object.
+             *
+             * @return Object.
+             */
             jobject Get()
             {
                 return obj;
@@ -136,11 +136,10 @@ namespace ignite
          * First search is performed using the passed path argument (is not NULL).
          * Then JRE_HOME is evaluated. Last, JAVA_HOME is evaluated.
          *
-         * @param Explicitly defined path (optional).
-         * @param found Whether library was found.
-         * @return Path to the file.
+         * @param path Explicitly defined path (optional).
+         * @return Path to the file. Empty string if the library was not found.
          */
-        IGNITE_IMPORT_EXPORT std::string FindJvmLibrary(const std::string* path, bool* found);
+        IGNITE_IMPORT_EXPORT std::string FindJvmLibrary(const std::string& path);
 
         /**
          * Load JVM library into the process.
@@ -151,23 +150,21 @@ namespace ignite
         IGNITE_IMPORT_EXPORT bool LoadJvmLibrary(const std::string& path);
 
         /**
-         * Create Ignite classpath based on user input and home directory.
+         * Create Ignite classpath based on user input directory.
          *
          * @param usrCp User's classpath.
-         * @param home Ignite home directory.
          * @return Classpath.
          */
-        IGNITE_IMPORT_EXPORT std::string CreateIgniteClasspath(const std::string* usrCp, const std::string* home);
+        IGNITE_IMPORT_EXPORT std::string CreateIgniteClasspath(const std::string& usrCp);
 
         /**
          * Create Ignite classpath based on user input and home directory.
          *
          * @param usrCp User's classpath.
          * @param home Ignite home directory.
-         * @param test Whether test classpath must be used.
          * @return Classpath.
          */
-        IGNITE_IMPORT_EXPORT std::string CreateIgniteClasspath(const std::string* usrCp, const std::string* home, bool test);
+        IGNITE_IMPORT_EXPORT std::string CreateIgniteClasspath(const std::string& usrCp, const std::string& home);
 
         /**
          * Resolve IGNITE_HOME directory. Resolution is performed in several
@@ -180,10 +177,10 @@ namespace ignite
          * IGNITE_HOME is considered resolved.
          *
          * @param path Optional path to evaluate.
-         * @param found Whether IGNITE_HOME home was found.
-         * @return Resolved GG home.
+         * @param home Resolved GG home.
+         * @return True if IGNITE_HOME home was found.
          */
-        IGNITE_IMPORT_EXPORT std::string ResolveIgniteHome(const std::string* path, bool* found);
+        IGNITE_IMPORT_EXPORT bool ResolveIgniteHome(const std::string& path, std::string& home);
     }
 }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1410900f/modules/platforms/cpp/jni/os/linux/src/utils.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/jni/os/linux/src/utils.cpp b/modules/platforms/cpp/jni/os/linux/src/utils.cpp
index a0f74ef..924779c 100644
--- a/modules/platforms/cpp/jni/os/linux/src/utils.cpp
+++ b/modules/platforms/cpp/jni/os/linux/src/utils.cpp
@@ -21,8 +21,10 @@
 #include <sys/stat.h>
 #include <dirent.h>
 #include <dlfcn.h>
+#include <unistd.h>
 
 #include "ignite/common/utils.h"
+#include "ignite/common/fixed_size_array.h"
 #include "ignite/jni/utils.h"
 #include "ignite/jni/java.h"
 
@@ -73,81 +75,57 @@ namespace ignite
             if (!val)
                 pthread_setspecific(attachKey, new AttachHelper());
         }
-		
-        /**
-         * Helper method to set boolean result to reference with proper NULL-check.
-         *
-         * @param res Result.
-         * @param outRes Where to set the result.
-         */
-        inline void SetBoolResult(bool res, bool* outRes)
-        {
-            if (outRes)
-                *outRes = res;
-        }
-		
+
         /**
          * Helper function for GG home resolution. Checks whether certain folders
          * exist in the path. Optionally goes upwards in directory hierarchy.
          *
          * @param path Path to evaluate.
          * @param up Whether to go upwards.
-         * @res Resolution result.
-         * @return Resolved directory.
+         * @param res Resolved directory.
+         * @return Resolution result.
          */
-        std::string ResolveIgniteHome0(const std::string& path, bool up, bool* res)
+        bool ResolveIgniteHome0(const std::string& path, bool up, std::string& res)
         {
             struct stat pathStat;
-            
-            if (stat(path.c_str(), &pathStat) != -1 && S_ISDIR(pathStat.st_mode)) 
-            {
-                // Remove trailing slashes, otherwise we will have an infinite loop.
-                std::string path0 = path;
 
-                while (true) {
-                    char lastChar = *path0.rbegin();
+            if (stat(path.c_str(), &pathStat) == -1 || !S_ISDIR(pathStat.st_mode))
+                return false;
+            
+            // Remove trailing slashes, otherwise we will have an infinite loop.
+            std::string path0;
 
-                    if (lastChar == '/' || lastChar == ' ') {
-                        size_t off = path0.find_last_of(lastChar);
+            size_t last = path.find_last_not_of("/\\ ");
 
-                        path0.erase(off, 1);
-                    }
-                    else
-                        break;
-                }
+            if (last != std::string::npos)
+                path0.assign(path, 0, last + 1);
 
-                std::string binStr = path0 + PROBE_BIN;
-                struct stat binStat;
+            std::string binStr = path0 + PROBE_BIN;
+            struct stat binStat;
 
-                std::string examplesStr = path0 + PROBE_EXAMPLES;
-                struct stat examplesStat;
+            std::string examplesStr = path0 + PROBE_EXAMPLES;
+            struct stat examplesStat;
 
-                if (stat(binStr.c_str(), &binStat) != -1 && S_ISDIR(binStat.st_mode) &&
-                    stat(examplesStr.c_str(), &examplesStat) != -1 && S_ISDIR(examplesStat.st_mode))
-                {
-                    SetBoolResult(true, res);
-
-                    return std::string(path0);
-                }
+            if (stat(binStr.c_str(), &binStat) != -1 && S_ISDIR(binStat.st_mode) &&
+                stat(examplesStr.c_str(), &examplesStat) != -1 && S_ISDIR(examplesStat.st_mode))
+            {
+                res = path0;
 
-                if (up)
-                {
-                    // Evaluate parent directory.
-                    size_t slashPos = path0.find_last_of("/");
+                return true;
+            }
 
-                    if (slashPos != std::string::npos)
-                    {
-                        std::string parent = path0.substr(0, slashPos);
+            if (!up)
+                return false;
 
-                        return ResolveIgniteHome0(parent, true, res);
-                    }
-                }
+            // Evaluate parent directory.
+            size_t slashPos = path0.find_last_of("/");
 
-            }
+            if (slashPos == std::string::npos)
+                return false;
 
-            SetBoolResult(false, res);
+            std::string parent(path0, 0, slashPos);
 
-            return std::string();
+            return ResolveIgniteHome0(parent, true, res);
         }
 
         /**
@@ -158,7 +136,7 @@ namespace ignite
          */
         std::string ClasspathJars(const std::string& path)
         {
-            std::string res = std::string();
+            std::string res;
 
             DIR* dir = opendir(path.c_str());
 
@@ -168,7 +146,8 @@ namespace ignite
 
                 while ((entry = readdir(dir)) != NULL)
                 {
-                    if (strstr(entry->d_name, ".jar"))
+                    char *dot = strrchr(entry->d_name, '.');
+                    if (dot && !strcmp(dot, ".jar"))
                     {
                         res.append(path);
                         res.append("/");
@@ -319,31 +298,22 @@ namespace ignite
             return res;
         }
 
-        std::string FindJvmLibrary(const std::string* path, bool* found)
+        std::string FindJvmLibrary(const std::string& path)
         {
-            SetBoolResult(true, found); // Optimistically assume that we will find it.
+            // If path is provided explicitly, then check only it.
+            if (!path.empty() && FileExists(path))
+                return path;
 
-            if (path) {
-                // If path is provided explicitly, then check only it.
-                if (FileExists(*path))                            
-                    return std::string(path->data());
-            }
-            else
-            {
-                bool javaEnvFound;
-                std::string javaEnv = GetEnv(JAVA_HOME, javaEnvFound);
+            std::string javaEnv;
 
-                if (javaEnvFound)
-                {
-                    std::string javaDll = javaEnv + JAVA_DLL;
+            if (GetEnv(JAVA_HOME, javaEnv))
+            {
+                std::string javaDll = javaEnv + JAVA_DLL;
 
-                    if (FileExists(javaDll))
-                        return std::string(javaDll);
-                }
+                if (FileExists(javaDll))
+                    return javaDll;
             }
 
-            SetBoolResult(false, found);
-
             return std::string();
         }
 
@@ -352,66 +322,91 @@ namespace ignite
             void* hnd = dlopen(path.c_str(), RTLD_LAZY);
             
             return hnd != NULL;
-        }                
+        }
 
-        std::string ResolveIgniteHome(const std::string* path, bool* found)
+        /**
+         * Create Ignite classpath based on user input and home directory.
+         *
+         * @param usrCp User's classpath.
+         * @param home Ignite home directory.
+         * @param forceTest Whether test classpath must be used.
+         * @return Classpath.
+         */
+        std::string CreateIgniteClasspath(const std::string& usrCp, const std::string* home, bool forceTest)
         {
-            if (path)
-                // 1. Check passed argument.
-                return ResolveIgniteHome0(*path, false, found);
-            else
+            // 1. Append user classpath if it exists.
+            std::string cp;
+
+            if (!usrCp.empty())
             {
-                // 2. Check environment variable.
-                bool envFound;
-                std::string env = GetEnv(IGNITE_HOME, envFound);
+                cp.append(usrCp);
 
-                if (envFound)
-                    return ResolveIgniteHome0(env, false, found);
+                if (*cp.rbegin() != ';')
+                    cp.push_back(';');
             }
 
-            SetBoolResult(false, found);
-                    
-            return std::string();
-        }
-
-        std::string CreateIgniteClasspath(const std::string* usrCp, const std::string* home)
-        {
-            bool forceTest = false;
-
+            // 2. Append home classpath if home is defined.
             if (home)
             {
-                bool envFound;
-                std::string env = GetEnv(IGNITE_NATIVE_TEST_CLASSPATH, envFound);
+                std::string homeCp = CreateIgniteHomeClasspath(*home, forceTest);
 
-                forceTest = envFound && env.compare("true") == 0;
+                cp.append(homeCp);
             }
 
-            return CreateIgniteClasspath(usrCp, home, forceTest);
+            // 3. Return.
+            return cp;
         }
 
-        std::string CreateIgniteClasspath(const std::string* usrCp, const std::string* home, bool forceTest)
+        std::string CreateIgniteClasspath(const std::string& usrCp)
+        {
+            if (usrCp.empty() || *usrCp.rbegin() == ';')
+                return usrCp;
+
+            return usrCp + ';';
+        }
+
+        std::string CreateIgniteClasspath(const std::string& usrCp, const std::string& home)
         {
             // 1. Append user classpath if it exists.
-            std::string cp = std::string();
+            std::string cp = CreateIgniteClasspath(usrCp);
 
-            if (usrCp)
-            {
-                cp.append(*usrCp);
+            // 2. Append home classpath
+            std::string env;
+            bool envFound = GetEnv(IGNITE_NATIVE_TEST_CLASSPATH, env);
 
-                if (*cp.rbegin() != ':')
-                    cp.append(":");
-            }
+            bool forceTest = envFound && env.compare("true") == 0;
 
-            // 2. Append home classpath if home is defined.
-            if (home)
-            {
-                std::string homeCp = CreateIgniteHomeClasspath(*home, forceTest);
+            std::string homeCp = CreateIgniteHomeClasspath(home, forceTest);
 
-                cp.append(homeCp);
-            }
+            cp.append(homeCp);
 
             // 3. Return.
             return cp;
         }
+
+        bool ResolveIgniteHome(const std::string& path, std::string& home)
+        {
+            if (!path.empty())
+                // 1. Check passed argument.
+                return ResolveIgniteHome0(path, false, home);
+
+            // 2. Check environment variable.
+            std::string env;
+
+            if (GetEnv(IGNITE_HOME, env))
+                return ResolveIgniteHome0(env, false, home);
+
+            // 3. Check current work dir.
+            FixedSizeArray<char> curDir(1024 * 16);
+
+            char* res = getcwd(curDir.GetData(), curDir.GetSize());
+
+            if (!res)
+                return false;
+
+            std::string curDirStr(curDir.GetData());
+
+            return ResolveIgniteHome0(curDirStr, true, home);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/1410900f/modules/platforms/cpp/jni/os/win/src/utils.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/jni/os/win/src/utils.cpp b/modules/platforms/cpp/jni/os/win/src/utils.cpp
index 0647aa3..3b2033b 100644
--- a/modules/platforms/cpp/jni/os/win/src/utils.cpp
+++ b/modules/platforms/cpp/jni/os/win/src/utils.cpp
@@ -19,6 +19,7 @@
 
 #include "ignite/common/concurrent.h"
 #include "ignite/common/utils.h"
+#include "ignite/common/fixed_size_array.h"
 
 #include "ignite/jni/utils.h"
 #include "ignite/jni/java.h"
@@ -53,77 +54,55 @@ namespace ignite
         const char* IGNITE_NATIVE_TEST_CLASSPATH = "IGNITE_NATIVE_TEST_CLASSPATH";
 
         /**
-         * Helper method to set boolean result to pointer with proper NULL-check.
-         *
-         * @param res Result.
-         * @param outRes Where to set the result.
-         */
-        inline void SetBoolResult(bool res, bool* outRes)
-        {
-            if (outRes)
-                *outRes = res;
-        }
-
-        /**
          * Helper function for GG home resolution. Checks whether certain folders
          * exist in the path. Optionally goes upwards in directory hierarchy.
          *
          * @param path Path to evaluate.
          * @param up Whether to go upwards.
-         * @res Resolution result.
-         * @return Resolved directory.
+         * @param res Resolved directory.
+         * @return Resolution result.
          */
-        std::string ResolveIgniteHome0(const std::string& path, bool up, bool* res)
+        bool ResolveIgniteHome0(const std::string& path, bool up, std::string& res)
         {
             DWORD attrs = GetFileAttributesA(path.c_str());
 
-            if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY))
-            {
-                // Remove trailing slashes, otherwise we will have an infinite loop.
-                std::string path0 = path;
+            if (attrs == INVALID_FILE_ATTRIBUTES || !(attrs & FILE_ATTRIBUTE_DIRECTORY))
+                return false;
 
-                while (true) {
-                    char lastChar = *path0.rbegin();
+            // Remove trailing slashes, otherwise we will have an infinite loop.
+            std::string path0;
 
-                    if (lastChar == '/' || lastChar == '\\' || lastChar == ' ') {
-                        size_t off = path0.find_last_of(lastChar);
+            size_t last = path.find_last_not_of("/\\ ");
 
-                        path0.erase(off, 1);
-                    }
-                    else
-                        break;
-                }
+            if (last != std::string::npos)
+                path0.assign(path, 0, last + 1);
 
-                std::string binStr = path0 + PROBE_BIN;
-                DWORD binAttrs = GetFileAttributesA(binStr.c_str());
+            std::string binStr = path0 + PROBE_BIN;
+            DWORD binAttrs = GetFileAttributesA(binStr.c_str());
 
-                std::string examplesStr = path0 + PROBE_EXAMPLES;
-                DWORD examplesAttrs = GetFileAttributesA(examplesStr.c_str());
+            std::string examplesStr = path0 + PROBE_EXAMPLES;
+            DWORD examplesAttrs = GetFileAttributesA(examplesStr.c_str());
 
-                if (binAttrs != INVALID_FILE_ATTRIBUTES && (binAttrs & FILE_ATTRIBUTE_DIRECTORY) &&
-                    examplesAttrs != INVALID_FILE_ATTRIBUTES && (examplesAttrs & FILE_ATTRIBUTE_DIRECTORY))
-                {
-                    SetBoolResult(true, res);
-                    return std::string(path0);
-                }
+            if (binAttrs != INVALID_FILE_ATTRIBUTES && (binAttrs & FILE_ATTRIBUTE_DIRECTORY) &&
+                examplesAttrs != INVALID_FILE_ATTRIBUTES && (examplesAttrs & FILE_ATTRIBUTE_DIRECTORY))
+            {
+                res = path0;
 
-                if (up)
-                {
-                    // Evaluate parent directory.
-                    size_t slashPos = path0.find_last_of("/\\");
+                return true;
+            }
 
-                    if (slashPos != std::string::npos)
-                    {
-                        std::string parent = path0.substr(0, slashPos);
+            if (!up)
+                return false;
 
-                        return ResolveIgniteHome0(parent, true, res);
-                    }
-                }
-            }
+            // Evaluate parent directory.
+            size_t slashPos = path0.find_last_of("/\\");
 
-            SetBoolResult(false, res);
+            if (slashPos == std::string::npos)
+                return false;
 
-            return std::string();
+            std::string parent(path0, 0, slashPos);
+
+            return ResolveIgniteHome0(parent, true, res);
         }
 
         /**
@@ -136,24 +115,24 @@ namespace ignite
         {
             std::string searchPath = path + "\\*.jar";
 
-            std::string res = std::string();
-
             WIN32_FIND_DATAA findData;
 
             HANDLE hnd = FindFirstFileA(searchPath.c_str(), &findData);
 
-            if (hnd != INVALID_HANDLE_VALUE)
+            if (hnd == INVALID_HANDLE_VALUE)
+                return std::string();
+
+            std::string res;
+
+            do
             {
-                do
-                {
-                    res.append(path);
-                    res.append("\\");
-                    res.append(findData.cFileName);
-                    res.append(";");
-                } while (FindNextFileA(hnd, &findData) != 0);
+                res.append(path);
+                res.append("\\");
+                res.append(findData.cFileName);
+                res.append(";");
+            } while (FindNextFileA(hnd, &findData) != 0);
 
-                FindClose(hnd);
-            }
+            FindClose(hnd);
 
             return res;
         }
@@ -238,7 +217,7 @@ namespace ignite
          */
         std::string CreateIgniteHomeClasspath(const std::string& home, bool forceTest)
         {
-            std::string res = std::string();
+            std::string res;
 
             // 1. Add exploded test directories.
             if (forceTest)
@@ -292,31 +271,22 @@ namespace ignite
             return res;
         }
 
-        std::string FindJvmLibrary(const std::string* path, bool* found)
+        std::string FindJvmLibrary(const std::string& path)
         {
-            SetBoolResult(true, found); // Optimistically assume that we will find it.
+            // If path is provided explicitly, then check only it.
+            if (!path.empty() && FileExists(path))
+                return path;
 
-            if (path) {
-                // If path is provided explicitly, then check only it.
-                if (FileExists(*path))
-                    return std::string(path->data());
-            }
-            else
-            {
-                bool javaEnvFound;
-                std::string javaEnv = GetEnv(JAVA_HOME, javaEnvFound);
+            std::string javaEnv;
 
-                if (javaEnvFound)
-                {
-                    std::string javaDll = javaEnv + JAVA_DLL;
+            if (GetEnv(JAVA_HOME, javaEnv))
+            {
+                std::string javaDll = javaEnv + JAVA_DLL;
 
-                    if (FileExists(javaDll))
-                        return std::string(javaDll);
-                }
+                if (FileExists(javaDll))
+                    return javaDll;
             }
 
-            *found = false;
-
             return std::string();
         }
 
@@ -327,32 +297,25 @@ namespace ignite
             return mod != NULL;
         }
 
-        std::string CreateIgniteClasspath(const std::string* usrCp, const std::string* home)
-        {
-            bool forceTest = false;
-
-            if (home)
-            {
-                bool envFound;
-                std::string env = GetEnv(IGNITE_NATIVE_TEST_CLASSPATH, envFound);
-
-                forceTest = envFound && env.compare("true") == 0;
-            }
-
-            return CreateIgniteClasspath(usrCp, home, forceTest);
-        }
-
-        std::string CreateIgniteClasspath(const std::string* usrCp, const std::string* home, bool forceTest)
+        /**
+         * Create Ignite classpath based on user input and home directory.
+         *
+         * @param usrCp User's classpath.
+         * @param home Ignite home directory.
+         * @param forceTest Whether test classpath must be used.
+         * @return Classpath.
+         */
+        std::string CreateIgniteClasspath(const std::string& usrCp, const std::string* home, bool forceTest)
         {
             // 1. Append user classpath if it exists.
-            std::string cp = std::string();
+            std::string cp;
 
-            if (usrCp)
+            if (!usrCp.empty())
             {
-                cp.append(*usrCp);
+                cp.append(usrCp);
 
                 if (*cp.rbegin() != ';')
-                    cp.append(";");
+                    cp.push_back(';');
             }
 
             // 2. Append home classpath if home is defined.
@@ -367,33 +330,55 @@ namespace ignite
             return cp;
         }
 
-        std::string ResolveIgniteHome(const std::string* path, bool* found)
+        std::string CreateIgniteClasspath(const std::string& usrCp)
         {
-            if (path)
+            if (usrCp.empty() || *usrCp.rbegin() == ';')
+                return usrCp;
+
+            return usrCp + ';';
+        }
+
+        std::string CreateIgniteClasspath(const std::string& usrCp, const std::string& home)
+        {
+            // 1. Append user classpath if it exists.
+            std::string cp = CreateIgniteClasspath(usrCp);
+
+            // 2. Append home classpath
+            std::string env;
+            bool envFound = GetEnv(IGNITE_NATIVE_TEST_CLASSPATH, env);
+
+            bool forceTest = envFound && env.compare("true") == 0;
+
+            std::string homeCp = CreateIgniteHomeClasspath(home, forceTest);
+
+            cp.append(homeCp);
+
+            // 3. Return.
+            return cp;
+        }
+
+        bool ResolveIgniteHome(const std::string& path, std::string& home)
+        {
+            if (!path.empty())
                 // 1. Check passed argument.
-                return ResolveIgniteHome0(*path, false, found);
-            else
-            {
-                // 2. Check environment variable.
-                bool envFound;
-                std::string env = GetEnv(IGNITE_HOME, envFound);
+                return ResolveIgniteHome0(path, false, home);
 
-                if (envFound)
-                    return ResolveIgniteHome0(env, false, found);
+            // 2. Check environment variable.
+            std::string env;
 
-                // 3. Check current work dir.
-                const DWORD curDirLen = GetCurrentDirectory(0, NULL);
+            if (GetEnv(IGNITE_HOME, env))
+                return ResolveIgniteHome0(env, false, home);
 
-                char* curDir = new char[curDirLen];
+            // 3. Check current work dir.
+            const DWORD curDirLen = GetCurrentDirectory(0, NULL);
 
-                GetCurrentDirectoryA(curDirLen, curDir);
+            FixedSizeArray<char> curDir(curDirLen);
 
-                std::string curDirStr = curDir;
+            GetCurrentDirectoryA(curDir.GetSize(), curDir.GetData());
 
-                delete[] curDir;
+            std::string curDirStr(curDir.GetData());
 
-                return ResolveIgniteHome0(curDirStr, true, found);
-            }
+            return ResolveIgniteHome0(curDirStr, true, home);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/1410900f/modules/platforms/cpp/jni/src/java.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/jni/src/java.cpp b/modules/platforms/cpp/jni/src/java.cpp
index 0c2e460..1988a86 100644
--- a/modules/platforms/cpp/jni/src/java.cpp
+++ b/modules/platforms/cpp/jni/src/java.cpp
@@ -32,7 +32,16 @@
     JniHandlers* hnds = reinterpret_cast<JniHandlers*>(envPtr); \
     type hnd = hnds->field; \
     if (hnd) \
-        hnd(hnds->target); \
+    { \
+        try \
+        { \
+            hnd(hnds->target); \
+        } \
+        catch (std::exception& err) \
+        { \
+            ThrowToJava(jniEnv, err.what()); \
+        } \
+    } \
     else \
         ThrowOnMissingHandler(jniEnv); \
 }
@@ -41,7 +50,16 @@
     JniHandlers* hnds = reinterpret_cast<JniHandlers*>(envPtr); \
     type hnd = hnds->field; \
     if (hnd) \
-        hnd(hnds->target, __VA_ARGS__); \
+    { \
+        try \
+        { \
+            hnd(hnds->target, __VA_ARGS__); \
+        } \
+        catch (std::exception& err) \
+        { \
+            ThrowToJava(jniEnv, err.what()); \
+        } \
+    } \
     else \
         ThrowOnMissingHandler(jniEnv); \
 }
@@ -50,7 +68,17 @@
     JniHandlers* hnds = reinterpret_cast<JniHandlers*>(envPtr); \
     type hnd = hnds->field; \
     if (hnd) \
-        return hnd(hnds->target, __VA_ARGS__); \
+    { \
+        try \
+        { \
+            return hnd(hnds->target, __VA_ARGS__); \
+        } \
+        catch (std::exception& err) \
+        { \
+            ThrowToJava(jniEnv, err.what()); \
+            return 0; \
+        } \
+    } \
     else \
     { \
         ThrowOnMissingHandler(jniEnv); \
@@ -358,6 +386,21 @@ namespace ignite
                 return 0;
             }
 
+            /**
+             * Throw generic exception to Java in case of native exception. As JniContext is not available at
+             * this point, we have to obtain exception details from scratch. This is not critical from performance
+             * perspective because such exception is usually denotes fatal condition.
+             *
+             * @param env JNI environment.
+             * @param msg Message.
+             */
+            void ThrowToJava(JNIEnv* env, const char* msg)
+            {
+                jclass cls = env->FindClass(C_IGNITE_EXCEPTION);
+
+                env->ThrowNew(cls, msg);
+            }
+
             char* StringToChars(JNIEnv* env, jstring str, int* len) {
                 if (!str) {
                     *len = 0;
@@ -937,12 +980,12 @@ namespace ignite
                 ExceptionCheck(env);
             }
 
-            jobject JniContext::ProcessorProjection(jobject obj) {
+            jobject JniContext::ProcessorProjection(jobject obj, JniErrorInfo* errInfo) {
                 JNIEnv* env = Attach();
 
                 jobject prj = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_projection);
 
-                ExceptionCheck(env);
+                ExceptionCheck(env, errInfo);
 
                 return LocalToGlobal(env, prj);
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/1410900f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs
index 53dd47a..1d88f76 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs
@@ -443,14 +443,15 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
         {
             var marsh = grid.Marshaller;
 
-            var key = marsh.Unmarshal<object>(inOutStream);
-            var val = marsh.Unmarshal<object>(inOutStream);
             var isLocal = inOutStream.ReadBool();
 
             var holder = isLocal
                 ? _handleRegistry.Get<CacheEntryProcessorHolder>(inOutStream.ReadLong(), true)
                 : marsh.Unmarshal<CacheEntryProcessorHolder>(inOutStream);
 
+            var key = marsh.Unmarshal<object>(inOutStream);
+            var val = marsh.Unmarshal<object>(inOutStream);
+
             return holder.Process(key, val, val != null, grid);
         }