summaryrefslogtreecommitdiff
path: root/libjava/classpath/native/target/readme.txt
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/native/target/readme.txt')
-rw-r--r--libjava/classpath/native/target/readme.txt149
1 files changed, 149 insertions, 0 deletions
diff --git a/libjava/classpath/native/target/readme.txt b/libjava/classpath/native/target/readme.txt
new file mode 100644
index 00000000000..6fee79eba63
--- /dev/null
+++ b/libjava/classpath/native/target/readme.txt
@@ -0,0 +1,149 @@
+The GNU classpath native layer
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To enable GNU classpath to run on a diverse array of different hardware
+platforms, a new native software layer has been added. This layer hide all
+machine and hardware dependent issues except common available definitions,
+which are ANSI C functions. For each targets system where the GNU classpath
+library is to be used, a specific set of native layer functions have to be
+provided. A generic set of functions is provided for Unix like systems
+(currently tested only with Linux). For a new target system, some or
+all native layer functions have to be rewritten. The following scheme
+illustrate the native layer.
+
+ Java API
+ ----------------------
+ | Java classes |
+ | -------------------- |
+ | C native functions |
+ | -------------------- |
+ >> | C native layer | <<
+ | -------------------- |
+ | operating system |
+ | -------------------- |
+ | hardware |
+ ----------------------
+
+The C native layer is implemented as a set of C pre-processor native macros.
+These macros expand to the appropriated native code. Macros are used
+instead function calls to give optimal performance and small code size.
+Of course in special cases, a macro can also expand to a function call
+if this is needed. This approach provide a flexible and efficient
+implementation of the native layer.
+
+The naming pattern for native macros is like follows:
+
+ TARGET_NATIVE_<module name>_<macro name>
+
+where <module name> is a name of a module, e. g. FILE; <macro name> is
+the name of the specific native macro, e. g. OPEN_READ.
+
+The parameters for the macro use in general (with a few exceptions) the
+scheme
+
+ <parameter>,<parameter>,...,<result>
+
+where <parameter> is input/output parameter and <result> is the result
+code TARGET_NATIVE_OK or TARGET_NATIVE_ERROR. Specific error codes
+and error strings can be gotten with
+
+ TARGET_NATIVE_LAST_ERROR and
+ TARGET_NATIVE_LAST_ERROR_STRING
+
+(see also file target_generic.h).
+
+For a single target system there exists two sets of native macros in
+the files
+
+ a) <target name>/target_native_<module name>.h
+ b) generic/target_generic_<module name>.h
+
+The macros in "a" are target specific implementations of native
+functions, the macros in "b" are generic implementations (for Unix) of
+the same native functions. If a native macro is not defined in the file
+"a", then the definition in file "b" is used (there is a check to see if
+a native macros is already defined elsewhere). This technique enables
+"a" to 'overwrite' single generic native macros with specific native
+macros for a specific target. In the default case, where only the
+generic implementation of the native macros is used, the files in the
+directory '<target name>' are empty except for the mandatory include of the
+generic header file in the directory 'generic' at the end. Please
+look at the existing Linux target specific files.
+
+The directory and file structure is as follows.
+
+ native
+ ...
+ |
+ |--- target
+ | |
+ | |--- Linux
+ | | |--- target_native_<module name>.h
+ | | |--- ...
+ | | ...
+ | |--- ...
+ | |--- generic
+ | | |--- target_generic_<module name>.h
+ | | |--- ...
+ ... ... ...
+
+
+Include hierarchy is as follows.
+
+ native file <name>
+ --> include 'target_native_<module name>.h'
+ ...
+ <target specific definitions>
+ ...
+ --> include 'target_generic_<module name>.h'
+ ...
+ <generic definitions>
+ ...
+
+When writing native code, please take care with the following.
+
+ - Use _only_ ANSI C specific functions directly which are available
+ on all target systems with the same parameters, e. g. strdup() is
+ not an ANSI C function, thus is is not available on all systems; mkdir()
+ expect on some systems different parameters.
+
+ !!!Do NOT use this functions in your native code!!!
+
+ Instead
+
+ * if a function is not available, create a native macro in the file
+
+ <target name>/target_native_<module name>.h
+
+ * if it is a generic function, include a generic implementation in
+
+ generic/target_generic_<module name>.h
+
+ * Then use this macro in your native code.
+
+ - Avoid _all_ OS specific data types and constants, e. g. structures or error
+ numbers. Instead, wrap them in a native macro and convert the values to
+ basic scalar types like char, int, double or long.
+
+ - Take care with 64 bit values; the are machine dependent. Not all
+ target system support 64 bit operations. The macros in
+ target_generic_math_int.h give a set of macros implementing 64 bit
+ operations and constants.
+
+ - Avoid - if possible - non-reentrant functions. Non-reentrant functions
+ cause strange problems on some multitasking systems.
+
+ - Avoid - if possible - dynamic data types created by malloc() and similar
+ functions. Instead use (local) static variables to avoid stack usage.
+ On some target systems, dynamic memory management is either slow or even
+ dangerous. Moreover malloc()-calls can cause fragmentation of the system
+ memory, which could result in a system crash or an application failure.
+
+For some examples, please look in the current implementation for
+Linux in the directory 'target/Linux' and the generic implementation in
+the directory 'target/generic'.
+
+
+ aicas GmbH, February 2003
+
+