org_apache_hadoop.h
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:3k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. /**
  19.  * This file includes some common utilities 
  20.  * for all native code used in hadoop.
  21.  */
  22.  
  23. #if !defined ORG_APACHE_HADOOP_H
  24. #define ORG_APACHE_HADOOP_H
  25. #if defined HAVE_CONFIG_H
  26.   #include <config.h>
  27. #endif
  28. #if defined HAVE_DLFCN_H
  29.   #include <dlfcn.h>
  30. #else
  31.   #error "dlfcn.h not found"
  32. #endif  
  33. #if defined HAVE_JNI_H    
  34.   #include <jni.h>
  35. #else
  36.   #error 'jni.h not found'
  37. #endif
  38. /* A helper macro to 'throw' a java exception. */ 
  39. #define THROW(env, exception_name, message) 
  40.   { 
  41. jclass ecls = (*env)->FindClass(env, exception_name); 
  42. if (ecls) { 
  43.   (*env)->ThrowNew(env, ecls, message); 
  44.   (*env)->DeleteLocalRef(env, ecls); 
  45.   }
  46. /** 
  47.  * A helper function to dlsym a 'symbol' from a given library-handle. 
  48.  * 
  49.  * @param env jni handle to report contingencies.
  50.  * @param handle handle to the dlopen'ed library.
  51.  * @param symbol symbol to load.
  52.  * @return returns the address where the symbol is loaded in memory, 
  53.  *         <code>NULL</code> on error.
  54.  */
  55. static void *do_dlsym(JNIEnv *env, void *handle, const char *symbol) {
  56.   if (!env || !handle || !symbol) {
  57.    THROW(env, "java/lang/InternalError", NULL);
  58.    return NULL;
  59.   }
  60.   char *error = NULL;
  61.   void *func_ptr = dlsym(handle, symbol);
  62.   if ((error = dlerror()) != NULL) {
  63.    THROW(env, "java/lang/UnsatisfiedLinkError", symbol);
  64.    return NULL;
  65.   }
  66.   return func_ptr;
  67. }
  68. /* A helper macro to dlsym the requisite dynamic symbol and bail-out on error. */
  69. #define LOAD_DYNAMIC_SYMBOL(func_ptr, env, handle, symbol) 
  70.   if ((func_ptr = do_dlsym(env, handle, symbol)) == NULL) { 
  71.     return; 
  72.   }
  73. #define LOCK_CLASS(env, clazz, classname) 
  74.   if ((*env)->MonitorEnter(env, clazz) != 0) { 
  75.     char exception_msg[128]; 
  76.     snprintf(exception_msg, 128, "Failed to lock %s", classname); 
  77.     THROW(env, "java/lang/InternalError", exception_msg); 
  78.   }
  79. #define UNLOCK_CLASS(env, clazz, classname) 
  80.   if ((*env)->MonitorExit(env, clazz) != 0) { 
  81.     char exception_msg[128]; 
  82.     snprintf(exception_msg, 128, "Failed to unlock %s", classname); 
  83.     THROW(env, "java/lang/InternalError", exception_msg); 
  84.   }
  85. #endif
  86. //vim: sw=2: ts=2: et