< prev index next >

src/java.base/share/classes/jdk/internal/misc/Unsafe.java

Print this page

        

@@ -916,10 +916,93 @@
      */
     private void freeMemoryChecks(long address) {
         checkPointer(null, address);
     }
 
+    /**
+     * ensure writeback of a specified virtual memory address range
+     * from cache to physical memory. all bytes in the address range
+     * are guaranteed to have been written back to physical memory on
+     * return from this call i.e. subsequently executed store
+     * instructions are guaranteed not to be visible before the
+     * writeback is completed.
+     *
+     * @param address
+     *        the lowest byte address that must be guaranteed written
+     *        back to memory. bytes at lower addresses may also be
+     *        written back.
+     *
+     * @param length
+     *        the length in bytes of the region starting at address
+     *        that must be guaranteed written back to memory.
+     *        
+     * @throws RuntimeException if the arguments are invalid
+     *         (<em>Note:</em> after optimization, invalid inputs may
+     *         go undetected, which will lead to unpredictable
+     *         behavior)
+     *
+     * @since 12
+     */
+    
+    public void writebackMemory(long address, long length)
+    {
+        checkWritebackMemory(address, length);
+
+        // perform any required pre-writeback barrier
+        writebackPreSync0();
+
+        // write back one cache line at a time
+        long line = (address & CACHE_LINE_MASK);
+        long end = address + length;
+        while (line < end) {
+            writeback0(line);
+            line += CACHE_LINE_FLUSH_SIZE;
+        }
+
+        // perform any required post-writeback barrier
+        writebackPostSync0();
+    }
+
+    /**
+     * Validate the arguments to writebackMemory
+     *
+     * @throws RuntimeException if the arguments are invalid
+     *         (<em>Note:</em> after optimization, invalid inputs may
+     *         go undetected, which will lead to unpredictable
+     *         behavior)
+     */
+    private void checkWritebackMemory(long address, long length)
+    {
+        checkNativeAddress(address);
+        checkSize(length);
+    }
+    
+    /**
+     * The size of an L1 data cache line which will be a power of two.
+     */
+    private static final long CACHE_LINE_FLUSH_SIZE = (long)theUnsafe.dataCacheLineFlushSize0();
+    private static final long CACHE_LINE_MASK = ~(CACHE_LINE_FLUSH_SIZE - 1);
+
+    /**
+     * primitive operation forcing writeback of a single cache line.
+     *
+     * @param address
+     *        the start address of the cache line to be written back
+     */
+    // native used to write back an individual cache line starting at
+    // the supplied address
+    @HotSpotIntrinsicCandidate
+    private native void writeback0(long address);
+    // native used to serialise writeback operations relative to
+    // preceding memory writes
+    @HotSpotIntrinsicCandidate
+    private native void writebackPreSync0();
+    // native used to serialise writeback operations relative to
+    // following memory writes
+    @HotSpotIntrinsicCandidate
+    private native void writebackPostSync0();
+    
     /// random queries
 
     /**
      * This constant differs from all results that will ever be returned from
      * {@link #staticFieldOffset}, {@link #objectFieldOffset},

@@ -1170,11 +1253,10 @@
      * Reports the size in bytes of a native memory page (whatever that is).
      * This value will always be a power of two.
      */
     public native int pageSize();
 
-
     /// random trusted operations from JNI:
 
     /**
      * Tells the VM to define a class, without security checks.  By default, the
      * class loader and protection domain come from the caller's class.

@@ -3710,10 +3792,11 @@
     private native boolean shouldBeInitialized0(Class<?> c);
     private native void ensureClassInitialized0(Class<?> c);
     private native int arrayBaseOffset0(Class<?> arrayClass);
     private native int arrayIndexScale0(Class<?> arrayClass);
     private native int addressSize0();
+    private native int dataCacheLineFlushSize0();
     private native Class<?> defineAnonymousClass0(Class<?> hostClass, byte[] data, Object[] cpPatches);
     private native int getLoadAverage0(double[] loadavg, int nelems);
     private native boolean unalignedAccess0();
     private native boolean isBigEndian0();
 }
< prev index next >