gcj.texi (Object allocation): Remove _Jv_AllocBytes.
authorBryce McKinlay <mckinlay@redhat.com>
Fri, 28 May 2004 18:53:06 +0000 (18:53 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Fri, 28 May 2004 18:53:06 +0000 (19:53 +0100)
* gcj.texi (Object allocation): Remove _Jv_AllocBytes.
(Mixing with C++): Document JvAllocBytes and RawDataManaged.

* gcj/cni.h (JvAllocBytes): New public CNI function. Calls
_Jv_AllocBytes.
* gnu/gcj/RawDataManaged.java: New file.
* java/lang/Thread.java (data): Declare as RawDataManaged.
* java/lang/natThread.cc (init_native): Cast natThread data to
RawDataManaged, not jobject.
* Makefile.am (ordinary_java_source_files): Add RawDataManaged.
* Makefile.in: Rebuilt.

From-SVN: r82372

gcc/java/ChangeLog
gcc/java/gcj.texi
libjava/ChangeLog
libjava/Makefile.am
libjava/Makefile.in
libjava/gcj/cni.h
libjava/gnu/gcj/RawDataManaged.java [new file with mode: 0644]
libjava/java/lang/Thread.java
libjava/java/lang/natThread.cc

index b3a951b1d6c8296d35bbcce47ecbd8170b9bccd3..e869a07785919e9b0ab537220f84b0ea0b6e7998 100644 (file)
@@ -1,3 +1,8 @@
+2004-05-28  Bryce McKinlay  <mckinlay@redhat.com>
+
+       * gcj.texi (Object allocation): Remove _Jv_AllocBytes.
+       (Mixing with C++): Document JvAllocBytes and RawDataManaged.
+
 2004-05-26  Bryce McKinlay  <mckinlay@redhat.com>
 
        * decl.c (struct binding_level): Add GTY marker. Compile
index b71568a3d6f93b5e70dc678c2c9e4840fe59a272..e5b37a0e0771c63c37ea2f3d37107ac8188a0e09 100644 (file)
@@ -1171,9 +1171,7 @@ macros start with the @code{Jv} prefix, for example the function
 @code{JvNewObjectArray}.  This convention is used to avoid conflicts
 with other libraries.  Internal functions in CNI start with the prefix
 @code{_Jv_}.  You should not call these; if you find a need to, let us
-know and we will try to come up with an alternate solution.  (This
-manual lists @code{_Jv_AllocBytes} as an example; CNI should instead
-provide a @code{JvAllocBytes} function.)
+know and we will try to come up with an alternate solution.
 
 
 @subsection Limitations
@@ -1488,11 +1486,6 @@ using standard C++ overload resolution rules.
 java::util::Hashtable *ht = new java::util::Hashtable(120);
 @end example
 
-@deftypefun void* _Jv_AllocBytes (jsize @var{size})
-Allocates @var{size} bytes from the heap.  The memory is not scanned
-by the garbage collector but it freed if no references to it are discovered.
-@end deftypefun
-
 
 @node Arrays
 @section Arrays
@@ -1784,11 +1777,13 @@ jint
 @}
 @end example
 
-But this restriction can cause a problem so @acronym{CNI} includes the
+@subsection RawData
+
+The above restriction can be problematic, so @acronym{CNI} includes the
 @code{gnu.gcj.RawData} class.  The @code{RawData} class is a
 @dfn{non-scanned reference} type.  In other words variables declared
 of type @code{RawData} can contain any data and are not checked by the
-compiler in any way.
+compiler or memory manager in any way.
 
 This means that you can put C/C++ data structures (including classes)
 in your @acronym{CNI} classes, as long as you use the appropriate cast.
@@ -1826,6 +1821,30 @@ void
 @end example
 
 
+@subsection RawDataManaged
+
+@code{gnu.gcj.RawDataManaged} is another type used to indicate special data used 
+by native code. Unlike the @code{RawData} type, fields declared as 
+@code{RawDataManaged} will be "marked" by the memory manager and 
+considered for garbage collection.  
+
+Native data which is allocated using CNI's @code{JvAllocBytes()}
+function and stored in a @code{RawDataManaged} will be automatically 
+freed when the Java object it is associated with becomes unreachable.
+
+@subsection Native memory allocation
+
+@deftypefun void* JvAllocBytes (jsize @var{size})
+Allocates @var{size} bytes from the heap.  The memory returned is zeroed.
+This memory is not scanned for pointers by the garbage collector, but will 
+be freed if no references to it are discovered.
+
+This function can be useful if you need to associate some native data with a
+Java object. Using a CNI's special @code{RawDataManaged} type, native data 
+allocated with @code{JvAllocBytes} will be automatically freed when the Java 
+object itself becomes unreachable.
+@end deftypefun
+
 @node Exception Handling
 @section Exception Handling
 
index a4124d49e0a3fa76d69085a74859365e0e3028bf..e6270fe86a59f5cd147a369c07b2fa14b9e7422f 100644 (file)
@@ -1,3 +1,14 @@
+2004-05-28  Bryce McKinlay  <mckinlay@redhat.com>
+
+       * gcj/cni.h (JvAllocBytes): New public CNI function. Calls
+       _Jv_AllocBytes.
+       * gnu/gcj/RawDataManaged.java: New file.
+       * java/lang/Thread.java (data): Declare as RawDataManaged.
+       * java/lang/natThread.cc (init_native): Cast natThread data to
+       RawDataManaged, not jobject.
+       * Makefile.am (ordinary_java_source_files): Add RawDataManaged.
+       * Makefile.in: Rebuilt.
+
 2004-05-27  Jerry Quinn  <jlquinn@optonline.net>
 
        * java/util/SimpleTimeZone.java: Reverting my last change until I
index e8fac90557d693c45c20d48b86201c707fdd95f0..5a97d9b886fccc9d1272e95a2aad7e7540793ad1 100644 (file)
@@ -2251,6 +2251,7 @@ gnu/classpath/ServiceFactory.java \
 gnu/classpath/ServiceProviderLoadingAction.java \
 gnu/gcj/Core.java \
 gnu/gcj/RawData.java \
+gnu/gcj/RawDataManaged.java \
 gnu/gcj/io/DefaultMimeTypes.java \
 gnu/gcj/io/MimeTypes.java \
 gnu/gcj/io/SimpleSHSStream.java        \
index a68a718616c4bf30c2dbaf9c76f3d1f9c5749bfa..cb924d587572b3f0fdda33b1c9ac32a184ff93d5 100644 (file)
@@ -1923,6 +1923,7 @@ gnu/classpath/ServiceFactory.java \
 gnu/classpath/ServiceProviderLoadingAction.java \
 gnu/gcj/Core.java \
 gnu/gcj/RawData.java \
+gnu/gcj/RawDataManaged.java \
 gnu/gcj/io/DefaultMimeTypes.java \
 gnu/gcj/io/MimeTypes.java \
 gnu/gcj/io/SimpleSHSStream.java        \
@@ -3075,7 +3076,8 @@ DEP_FILES =  .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
 .deps/gnu/awt/xlib/XToolkit.P .deps/gnu/classpath/Configuration.P \
 .deps/gnu/classpath/ServiceFactory.P \
 .deps/gnu/classpath/ServiceProviderLoadingAction.P .deps/gnu/gcj/Core.P \
-.deps/gnu/gcj/RawData.P .deps/gnu/gcj/convert/BytesToUnicode.P \
+.deps/gnu/gcj/RawData.P .deps/gnu/gcj/RawDataManaged.P \
+.deps/gnu/gcj/convert/BytesToUnicode.P \
 .deps/gnu/gcj/convert/Convert.P .deps/gnu/gcj/convert/IOConverter.P \
 .deps/gnu/gcj/convert/Input_8859_1.P \
 .deps/gnu/gcj/convert/Input_ASCII.P \
index 59cf673b09273748979e363720a3863a77f6e3ff..b9ee3829ce12e8defb9a8353620f8b6dc803e5a6 100644 (file)
@@ -22,6 +22,7 @@ details.  */
 
 extern "C" jstring _Jv_NewStringUTF (const char *bytes);
 extern "C" void _Jv_InitClass (jclass);
+extern "C" void *_Jv_AllocBytes (jsize size) __attribute__((__malloc__));
 
 extern inline void
 JvInitClass (jclass cls)
@@ -29,6 +30,12 @@ JvInitClass (jclass cls)
   return _Jv_InitClass (cls);
 }
 
+extern inline void *
+JvAllocBytes (jsize sz)
+{
+  return _Jv_AllocBytes (sz);
+}
+
 extern inline jstring
 JvAllocString (jsize sz)
 {
diff --git a/libjava/gnu/gcj/RawDataManaged.java b/libjava/gnu/gcj/RawDataManaged.java
new file mode 100644 (file)
index 0000000..91a36ac
--- /dev/null
@@ -0,0 +1,23 @@
+/* Copyright (C) 2004  Free Software Foundation
+
+   This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
+details.  */
+
+package gnu.gcj;
+
+/** A type used to indicate special data used by native code. Unlike the 
+    <code>RawData</code> type, fields declared as <code>RawDataManaged</code> 
+    will be "marked" by the memory manager and considered for garbage 
+    collection.  
+    
+    Native data which is allocated using CNI's <code>JvAllocBytes()</code> 
+    function and stored in a <code>RawDataManaged</code> will be automatically 
+    freed when the Java object it is associated with becomes unreachable.  */
+
+public final class RawDataManaged
+{
+   private RawDataManaged() { }
+}
index 0232a1d6afd111cd1f5071bb12f08117bf835d50..f631cc5aaeaab690f5169009a384f25ab713f3d7 100644 (file)
@@ -39,6 +39,7 @@ exception statement from your version. */
 package java.lang;
 
 import gnu.gcj.RawData;
+import gnu.gcj.RawDataManaged;
 
 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
  * "The Java Language Specification", ISBN 0-201-63451-1
@@ -127,7 +128,7 @@ public class Thread implements Runnable
   RawData interp_frame;
 
   // Our native data - points to an instance of struct natThread.
-  private Object data;
+  private RawDataManaged data;
 
   /**
    * Allocates a new <code>Thread</code> object. This constructor has
index a131f058be75ae73664f59ed421d461756d17371..ea235ce378979ed74a7ef34523336e3dd1e6d2bc 100644 (file)
@@ -16,6 +16,7 @@ details.  */
 #include <jvm.h>
 #include <java-threads.h>
 
+#include <gnu/gcj/RawDataManaged.h>
 #include <java/lang/Thread.h>
 #include <java/lang/ThreadGroup.h>
 #include <java/lang/IllegalArgumentException.h>
@@ -59,11 +60,7 @@ java::lang::Thread::initialize_native (void)
 {
   natThread *nt = (natThread *) _Jv_AllocBytes (sizeof (natThread));
   
-  // The native thread data is kept in a Object field, not a RawData, so that
-  // the GC allocator can be used and a finalizer run after the thread becomes
-  // unreachable. Note that this relies on the GC's ability to finalize 
-  // non-Java objects. FIXME?
-  data = reinterpret_cast<jobject> (nt);
+  data = (gnu::gcj::RawDataManaged *) nt;
   
   // Register a finalizer to clean up the native thread resources.
   _Jv_RegisterFinalizer (data, finalize_native);