From 9daf7333cdde6e4956e9632635ea82cb06456434 Mon Sep 17 00:00:00 2001 From: Hannes Wellmann Date: Tue, 21 May 2024 22:35:14 +0200 Subject: [PATCH] Migrate the Windows native file-system refresh monitor to JNA This avoids the native code necessary for JNI and consequently the separate o.e.core.resources.win32.x86_64 fragment, while being only slightly slower without noticeable impact on the overall performance. At the same time it allows to use the 'Win32RefreshProvider' on all CPU architectures supported on Windows out of the box. Also part of https://github.com/eclipse-platform/eclipse.platform.releng.aggregator/issues/577 --- .../.project | 22 -- .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.core.runtime.prefs | 2 - .../BUILD_INFO.txt | 10 - .../META-INF/MANIFEST.MF | 9 - .../about.html | 36 --- .../build.properties | 21 -- .../fragment.properties | 16 -- .../fragment.xml | 12 - .../os/win32/x86_64/win32refresh.dll | Bin 99840 -> 0 bytes .../pom.xml | 21 -- .../META-INF/MANIFEST.MF | 3 +- .../build.properties | 3 +- .../natives/make.bat | 30 --- .../natives/readme.txt | 3 - .../org.eclipse.core.resources/natives/ref.c | 226 ------------------ .../org.eclipse.core.resources/natives/ref.h | 161 ------------- .../schema/refreshProviders.exsd | 3 +- .../core/internal/refresh/MonitorManager.java | 38 ++- .../resources/refresh/win32/Win32Natives.java | 203 ++++++---------- 20 files changed, 114 insertions(+), 707 deletions(-) delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/.project delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/.settings/org.eclipse.core.resources.prefs delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/.settings/org.eclipse.core.runtime.prefs delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/BUILD_INFO.txt delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/META-INF/MANIFEST.MF delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/about.html delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/build.properties delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/fragment.properties delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/fragment.xml delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/os/win32/x86_64/win32refresh.dll delete mode 100644 resources/bundles/org.eclipse.core.resources.win32.x86_64/pom.xml delete mode 100644 resources/bundles/org.eclipse.core.resources/natives/make.bat delete mode 100644 resources/bundles/org.eclipse.core.resources/natives/readme.txt delete mode 100644 resources/bundles/org.eclipse.core.resources/natives/ref.c delete mode 100644 resources/bundles/org.eclipse.core.resources/natives/ref.h diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/.project b/resources/bundles/org.eclipse.core.resources.win32.x86_64/.project deleted file mode 100644 index fe2c03b97cf..00000000000 --- a/resources/bundles/org.eclipse.core.resources.win32.x86_64/.project +++ /dev/null @@ -1,22 +0,0 @@ - - - org.eclipse.core.resources.win32.x86_64 - - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - - diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/.settings/org.eclipse.core.resources.prefs b/resources/bundles/org.eclipse.core.resources.win32.x86_64/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0203a..00000000000 --- a/resources/bundles/org.eclipse.core.resources.win32.x86_64/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/.settings/org.eclipse.core.runtime.prefs b/resources/bundles/org.eclipse.core.resources.win32.x86_64/.settings/org.eclipse.core.runtime.prefs deleted file mode 100644 index 5a0ad22d2a7..00000000000 --- a/resources/bundles/org.eclipse.core.resources.win32.x86_64/.settings/org.eclipse.core.runtime.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -line.separator=\n diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/BUILD_INFO.txt b/resources/bundles/org.eclipse.core.resources.win32.x86_64/BUILD_INFO.txt deleted file mode 100644 index e6fbb82b543..00000000000 --- a/resources/bundles/org.eclipse.core.resources.win32.x86_64/BUILD_INFO.txt +++ /dev/null @@ -1,10 +0,0 @@ -Native Build Info: ------------------- - -platform: win32.x86_64 -built by: Szymon.Brandys@pl.ibm.com -build date: 29-Nov-2012 -OS Name: Microsoft Windows 7 -Compiler version: Microsoft (R) C/C++ Optimizing Compiler Version 15.00.30729.01 for x64 -Linker version: Microsoft (R) Incremental Linker Version 9.00.30729.01 -Java version: Standard Edition (ibm-java2-sdk-50-win-i386) diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/META-INF/MANIFEST.MF b/resources/bundles/org.eclipse.core.resources.win32.x86_64/META-INF/MANIFEST.MF deleted file mode 100644 index ef7d092f770..00000000000 --- a/resources/bundles/org.eclipse.core.resources.win32.x86_64/META-INF/MANIFEST.MF +++ /dev/null @@ -1,9 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %win32FragmentName -Bundle-SymbolicName: org.eclipse.core.resources.win32.x86_64;singleton:=true -Bundle-Version: 3.5.500.qualifier -Bundle-Vendor: %providerName -Fragment-Host: org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)" -Bundle-Localization: fragment -Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.arch=x86_64)) diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/about.html b/resources/bundles/org.eclipse.core.resources.win32.x86_64/about.html deleted file mode 100644 index 164f781a8fd..00000000000 --- a/resources/bundles/org.eclipse.core.resources.win32.x86_64/about.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - -About - - -

About This Content

- -

November 30, 2017

-

License

- -

- The Eclipse Foundation makes available all content in this plug-in - ("Content"). Unless otherwise indicated below, the Content - is provided to you under the terms and conditions of the Eclipse - Public License Version 2.0 ("EPL"). A copy of the EPL is - available at http://www.eclipse.org/legal/epl-2.0. - For purposes of the EPL, "Program" will mean the Content. -

- -

- If you did not receive this Content directly from the Eclipse - Foundation, the Content is being redistributed by another party - ("Redistributor") and different terms and conditions may - apply to your use of any object code in the Content. Check the - Redistributor's license that was provided with the Content. If no such - license exists, contact the Redistributor. Unless otherwise indicated - below, the terms and conditions of the EPL still apply to any source - code in the Content and such source code may be obtained at http://www.eclipse.org. -

- - - \ No newline at end of file diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/build.properties b/resources/bundles/org.eclipse.core.resources.win32.x86_64/build.properties deleted file mode 100644 index b15e6253c5e..00000000000 --- a/resources/bundles/org.eclipse.core.resources.win32.x86_64/build.properties +++ /dev/null @@ -1,21 +0,0 @@ -############################################################################### -# Copyright (c) 2012, 2018 IBM Corporation and others. -# -# This program and the accompanying materials -# are made available under the terms of the Eclipse Public License 2.0 -# which accompanies this distribution, and is available at -# https://www.eclipse.org/legal/epl-2.0/ -# -# SPDX-License-Identifier: EPL-2.0 -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### -bin.includes = fragment.xml,\ - os/,\ - .,\ - META-INF/,\ - about.html,\ - fragment.properties -generateSourceBundle=false - diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/fragment.properties b/resources/bundles/org.eclipse.core.resources.win32.x86_64/fragment.properties deleted file mode 100644 index adf91a4725a..00000000000 --- a/resources/bundles/org.eclipse.core.resources.win32.x86_64/fragment.properties +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################### -# Copyright (c) 2018 IBM Corporation and others. -# -# This program and the accompanying materials -# are made available under the terms of the Eclipse Public License 2.0 -# which accompanies this distribution, and is available at -# https://www.eclipse.org/legal/epl-2.0/ -# -# SPDX-License-Identifier: EPL-2.0 -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### -providerName = Eclipse.org -win32FragmentName = Core Resource Management Win32 Fragment -win32MonitorFactoryName = Windows Auto-refresh monitor diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/fragment.xml b/resources/bundles/org.eclipse.core.resources.win32.x86_64/fragment.xml deleted file mode 100644 index b823b6b7e1e..00000000000 --- a/resources/bundles/org.eclipse.core.resources.win32.x86_64/fragment.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/os/win32/x86_64/win32refresh.dll b/resources/bundles/org.eclipse.core.resources.win32.x86_64/os/win32/x86_64/win32refresh.dll deleted file mode 100644 index f93969d80b11f1cdc32b80631a40f0df2899d22e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99840 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

R-V6SVT%}Q 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 BsQ~~0 diff --git a/resources/bundles/org.eclipse.core.resources.win32.x86_64/pom.xml b/resources/bundles/org.eclipse.core.resources.win32.x86_64/pom.xml deleted file mode 100644 index 856c262acf6..00000000000 --- a/resources/bundles/org.eclipse.core.resources.win32.x86_64/pom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 4.0.0 - - eclipse.platform.resources - org.eclipse.platform - 4.33.0-SNAPSHOT - ../../ - - org.eclipse.core.resources.win32.x86_64 - 3.5.500-SNAPSHOT - eclipse-plugin - - diff --git a/resources/bundles/org.eclipse.core.resources/META-INF/MANIFEST.MF b/resources/bundles/org.eclipse.core.resources/META-INF/MANIFEST.MF index 7bb930abfb4..e124625c615 100644 --- a/resources/bundles/org.eclipse.core.resources/META-INF/MANIFEST.MF +++ b/resources/bundles/org.eclipse.core.resources/META-INF/MANIFEST.MF @@ -34,4 +34,5 @@ Service-Component: OSGI-INF/ResourceChangeListenerRegistrar.xml, OSGI-INF/org.eclipse.core.internal.resources.CheckMissingNaturesListener.xml Bundle-RequiredExecutionEnvironment: JavaSE-17 Automatic-Module-Name: org.eclipse.core.resources -Import-Package: org.eclipse.osgi.service.datalocation;version="[1.3.0,2.0.0)" +Import-Package: com.sun.jna;version="[5.14.0,6.0.0)", + org.eclipse.osgi.service.datalocation;version="[1.3.0,2.0.0)" diff --git a/resources/bundles/org.eclipse.core.resources/build.properties b/resources/bundles/org.eclipse.core.resources/build.properties index a37441247a9..4b9091f7478 100644 --- a/resources/bundles/org.eclipse.core.resources/build.properties +++ b/resources/bundles/org.eclipse.core.resources/build.properties @@ -16,8 +16,7 @@ output.. = bin/ source.ant_tasks/resources-ant.jar = src_ant/ output.ant_tasks/resources-ant.jar = bin_ant/ src.includes = about.html,\ - schema/,\ - natives/ + schema/ bin.includes = plugin.xml,\ plugin.properties,\ .options,\ diff --git a/resources/bundles/org.eclipse.core.resources/natives/make.bat b/resources/bundles/org.eclipse.core.resources/natives/make.bat deleted file mode 100644 index be540736625..00000000000 --- a/resources/bundles/org.eclipse.core.resources/natives/make.bat +++ /dev/null @@ -1,30 +0,0 @@ -@rem *************************************************************************** -@rem Copyright (c) 2007, 2014 IBM Corporation and others. -@rem -@rem This program and the accompanying materials -@rem are made available under the terms of the Eclipse Public License 2.0 -@rem which accompanies this distribution, and is available at -@rem https://www.eclipse.org/legal/epl-2.0/ -@rem -@rem SPDX-License-Identifier: EPL-2.0 -@rem -@rem Contributors: -@rem IBM Corporation - initial API and implementation -@rem *************************************************************************** -@echo off -REM build JNI header file -cd %~dp0\..\src - -"%JAVA_HOME%\bin\javac" -h . org\eclipse\core\internal\resources\refresh\win32\Win32Natives.java -del org\eclipse\core\internal\resources\refresh\win32\Win32Natives.class -move org_eclipse_core_internal_resources_refresh_win32_Win32Natives.h ..\natives\ref.h - -REM compile and link -if "%MSVC_HOME%"=="" set MSVC_HOME=C:\Program Files\Microsoft Visual Studio\2022\Community -cd ..\natives - -set dll_name=win32refresh.dll - -call "%MSVC_HOME%\VC\Auxiliary\Build\vcvarsall.bat" amd64 -"cl.exe" -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -LD ref.c -Fe%dll_name% -move %dll_name% ..\..\org.eclipse.core.resources.win32.x86_64\os\win32\x86_64\%dll_name% \ No newline at end of file diff --git a/resources/bundles/org.eclipse.core.resources/natives/readme.txt b/resources/bundles/org.eclipse.core.resources/natives/readme.txt deleted file mode 100644 index e27ecd6c006..00000000000 --- a/resources/bundles/org.eclipse.core.resources/natives/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -This folder contains native code for supporting auto-refresh callbacks on Windows. -This source is in the base plugin because there are multiple Windows fragments that -share the same source. \ No newline at end of file diff --git a/resources/bundles/org.eclipse.core.resources/natives/ref.c b/resources/bundles/org.eclipse.core.resources/natives/ref.c deleted file mode 100644 index 7d005258f3a..00000000000 --- a/resources/bundles/org.eclipse.core.resources/natives/ref.c +++ /dev/null @@ -1,226 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 2016 IBM Corporation and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * IBM Corporation - initial API and implementation - * Mikael Barbero (Eclipse Foundation) - 286681 handle WAIT_ABANDONED_0 return value - *******************************************************************************/ -#include -#include "ref.h" - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FindFirstChangeNotificationW - * Signature: (Ljava/lang/String;ZI)J - */ -JNIEXPORT jlong JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FindFirstChangeNotificationW -(JNIEnv * env, jclass this, jstring lpPathName, jboolean bWatchSubtree, jint dwNotifyFilter) { - jlong result; - jsize numberOfChars; - jchar *path; - const jchar *temp; - - // create a new byte array to hold the prefixed and null terminated path - numberOfChars= (*env)->GetStringLength(env, lpPathName); - path= malloc((numberOfChars + 5) * sizeof(jchar)); - //path= malloc((numberOfChars + 4) * sizeof(jchar)); - - // get the path characters from the vm, copy them, and release them - temp= (*env)->GetStringChars(env, lpPathName, JNI_FALSE); - memcpy(path + 4, temp, numberOfChars * sizeof(jchar)); - (*env)->ReleaseStringChars(env, lpPathName, temp); - - // prefix the path to enable long filenames, and null terminate it - path[0] = L'\\'; - path[1] = L'\\'; - path[2] = L'?'; - path[3] = L'\\'; - path[(numberOfChars + 4)] = L'\0'; - - // make the request and free the memory - //printf("%S\n", path); - result = (jlong) FindFirstChangeNotificationW(path, bWatchSubtree, dwNotifyFilter); - free(path); - - return result; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FindCloseChangeNotification - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FindCloseChangeNotification -(JNIEnv *env, jclass this, jlong hChangeHandle){ - return (jboolean) FindCloseChangeNotification((HANDLE) hChangeHandle); -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FindNextChangeNotification - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FindNextChangeNotification -(JNIEnv *env, jclass this, jlong hChangeHandle){ - return (jboolean) FindNextChangeNotification((HANDLE) hChangeHandle); -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: WaitForMultipleObjects - * Signature: (I[JZI)I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WaitForMultipleObjects -(JNIEnv *env, jclass this, jint nCount, jlongArray lpHandles, jboolean bWaitAll, jint dwMilliseconds) { - int i; - jint result; - HANDLE handles[MAXIMUM_WAIT_OBJECTS]; - jlong *handlePointers = (*env)->GetLongArrayElements(env, lpHandles, 0); - - for (i = 0; i < nCount; i++) { - handles[i] = (HANDLE) handlePointers[i]; - } - - result = WaitForMultipleObjects(nCount, handles, bWaitAll, dwMilliseconds); - (*env)->ReleaseLongArrayElements(env, lpHandles, handlePointers, 0); - - return result; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: GetLastError - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_GetLastError -(JNIEnv *env, jclass this){ - return GetLastError(); -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_LAST_WRITE - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1LAST_1WRITE -(JNIEnv *env, jclass this) { - return FILE_NOTIFY_CHANGE_LAST_WRITE; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_DIR_NAME - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1DIR_1NAME -(JNIEnv *env, jclass this) { - return FILE_NOTIFY_CHANGE_DIR_NAME; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_SIZE - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1SIZE -(JNIEnv *env, jclass this) { - return FILE_NOTIFY_CHANGE_SIZE; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_FILE_NAME - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1FILE_1NAME -(JNIEnv *env, jclass this) { - return FILE_NOTIFY_CHANGE_FILE_NAME; -} - - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: MAXIMUM_WAIT_OBJECTS - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_MAXIMUM_1WAIT_1OBJECTS -(JNIEnv *env, jclass this) { - return MAXIMUM_WAIT_OBJECTS; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: WAIT_OBJECT_0 - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WAIT_1OBJECT_10 -(JNIEnv *env, jclass this) { - return WAIT_OBJECT_0; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: WAIT_ABANDONED_0 - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WAIT_1ABANDONED_10 -(JNIEnv *env, jclass this) { - return WAIT_ABANDONED_0; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: WAIT_FAILED - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WAIT_1FAILED -(JNIEnv *env, jclass this) { - return WAIT_FAILED; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: WAIT_TIMEOUT - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WAIT_1TIMEOUT -(JNIEnv *env, jclass this) { - return WAIT_TIMEOUT; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: ERROR_INVALID_HANDLE - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_ERROR_1INVALID_1HANDLE -(JNIEnv *env, jclass this) { - return ERROR_INVALID_HANDLE; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: ERROR_SUCCESS - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_ERROR_1SUCCESS -(JNIEnv *env, jclass this) { - return ERROR_SUCCESS; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: INVALID_HANDLE_VALUE - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_INVALID_1HANDLE_1VALUE -(JNIEnv * env, jclass this) { - return (jlong)INVALID_HANDLE_VALUE; -} diff --git a/resources/bundles/org.eclipse.core.resources/natives/ref.h b/resources/bundles/org.eclipse.core.resources/natives/ref.h deleted file mode 100644 index b8afc0e056d..00000000000 --- a/resources/bundles/org.eclipse.core.resources/natives/ref.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2004, 2024 IBM Corporation and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - */ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class org_eclipse_core_internal_resources_refresh_win32_Win32Natives */ - -#ifndef _Included_org_eclipse_core_internal_resources_refresh_win32_Win32Natives -#define _Included_org_eclipse_core_internal_resources_refresh_win32_Win32Natives -#ifdef __cplusplus -extern "C" { -#endif -#undef org_eclipse_core_internal_resources_refresh_win32_Win32Natives_ERROR_ACCESS_DENIED -#define org_eclipse_core_internal_resources_refresh_win32_Win32Natives_ERROR_ACCESS_DENIED 5L -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FindFirstChangeNotificationW - * Signature: (Ljava/lang/String;ZI)J - */ -JNIEXPORT jlong JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FindFirstChangeNotificationW - (JNIEnv *, jclass, jstring, jboolean, jint); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FindCloseChangeNotification - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FindCloseChangeNotification - (JNIEnv *, jclass, jlong); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FindNextChangeNotification - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FindNextChangeNotification - (JNIEnv *, jclass, jlong); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: WaitForMultipleObjects - * Signature: (I[JZI)I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WaitForMultipleObjects - (JNIEnv *, jclass, jint, jlongArray, jboolean, jint); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: GetLastError - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_GetLastError - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_LAST_WRITE - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1LAST_1WRITE - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_DIR_NAME - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1DIR_1NAME - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_SIZE - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1SIZE - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_FILE_NAME - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1FILE_1NAME - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: MAXIMUM_WAIT_OBJECTS - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_MAXIMUM_1WAIT_1OBJECTS - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: WAIT_OBJECT_0 - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WAIT_1OBJECT_10 - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: WAIT_ABANDONED_0 - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WAIT_1ABANDONED_10 - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: WAIT_FAILED - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WAIT_1FAILED - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: WAIT_TIMEOUT - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WAIT_1TIMEOUT - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: ERROR_INVALID_HANDLE - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_ERROR_1INVALID_1HANDLE - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: ERROR_SUCCESS - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_ERROR_1SUCCESS - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: INVALID_HANDLE_VALUE - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_INVALID_1HANDLE_1VALUE - (JNIEnv *, jclass); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/resources/bundles/org.eclipse.core.resources/schema/refreshProviders.exsd b/resources/bundles/org.eclipse.core.resources/schema/refreshProviders.exsd index 8ebb91145b8..2fd1f650b7c 100644 --- a/resources/bundles/org.eclipse.core.resources/schema/refreshProviders.exsd +++ b/resources/bundles/org.eclipse.core.resources/schema/refreshProviders.exsd @@ -111,7 +111,8 @@ - The <tt>org.eclipse.core.resources.win32</tt> fragment provides a native refresh monitor that uses win32 file system notification callbacks. The workspace also supplies a default naive polling-based monitor that can be used for file systems that do not have native refresh callbacks available. + For Windows this Plug-in provides a native refresh monitor that uses win32 file system notification callbacks. +The workspace also supplies a default naive polling-based monitor that can be used for file systems that do not have native refresh callbacks available. diff --git a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/MonitorManager.java b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/MonitorManager.java index d5accd516cd..01fb19f7ff7 100644 --- a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/MonitorManager.java +++ b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/refresh/MonitorManager.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2015 IBM Corporation and others. + * Copyright (c) 2004, 2024 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -15,16 +15,43 @@ *******************************************************************************/ package org.eclipse.core.internal.refresh; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.eclipse.core.internal.events.ILifecycleListener; import org.eclipse.core.internal.events.LifecycleEvent; import org.eclipse.core.internal.resources.Workspace; +import org.eclipse.core.internal.resources.refresh.win32.Win32RefreshProvider; import org.eclipse.core.internal.utils.Messages; import org.eclipse.core.internal.utils.Policy; -import org.eclipse.core.resources.*; +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IPathVariableChangeEvent; +import org.eclipse.core.resources.IPathVariableChangeListener; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IResourceDeltaVisitor; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.refresh.IRefreshMonitor; import org.eclipse.core.resources.refresh.RefreshProvider; -import org.eclipse.core.runtime.*; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.ICoreRunnable; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubMonitor; /** * Manages monitors by creating new monitors when projects are added and @@ -78,6 +105,9 @@ private RefreshProvider[] getRefreshProviders() { IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PT_REFRESH_PROVIDERS); IConfigurationElement[] infos = extensionPoint.getConfigurationElements(); List providerList = new ArrayList<>(infos.length); + if (Platform.OS.isWindows()) { + providerList.add(new Win32RefreshProvider()); + } for (IConfigurationElement configurationElement : infos) { RefreshProvider provider = null; try { diff --git a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java index 46bc0973fd4..5989447aaf6 100644 --- a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java +++ b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2016 IBM Corporation and others. + * Copyright (c) 2002, 2024 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -11,101 +11,130 @@ * Contributors: * IBM - Initial API and implementation * Mikael Barbero (Eclipse Foundation) - 286681 handle WAIT_ABANDONED_0 return value + * Hannes Wellmann - Migrate Win32Natives to use JNA instead of JNI to avoid native binaries and platform-specific fragments *******************************************************************************/ + package org.eclipse.core.internal.resources.refresh.win32; +import com.sun.jna.Native; +import com.sun.jna.NativeLibrary; +import com.sun.jna.WString; + /** * Hooks for native methods involved with win32 auto-refresh callbacks. */ public class Win32Natives { + + // All constants and native methods are defined with the exact same name + // as in the native windows.h or referenced header files. + /* general purpose */ /** * A general use constant expressing the value of an * invalid handle. */ - public static final long INVALID_HANDLE_VALUE; + public static final long INVALID_HANDLE_VALUE = -1; // handleapi.h /** * An error constant which indicates that the previous function * succeeded. */ - public static final int ERROR_SUCCESS; + public static final int ERROR_SUCCESS = 0; // winerror.h /** * An error constant which indicates that a handle is or has become * invalid. */ - public static final int ERROR_INVALID_HANDLE; + public static final int ERROR_INVALID_HANDLE = 6; // winerror.h /** Access is denied. */ - public static final int ERROR_ACCESS_DENIED = 5; + public static final int ERROR_ACCESS_DENIED = 5; // winerror.h /** * A constant which indicates the maximum number of objects * that can be passed into WaitForMultipleObjects. */ - public static final int MAXIMUM_WAIT_OBJECTS; + public static final int MAXIMUM_WAIT_OBJECTS = 64; // winnt.h /* wait return values */ /** * A constant used returned WaitForMultipleObjects when the function times out. */ - public static final int WAIT_TIMEOUT; + public static final int WAIT_TIMEOUT = 258; // winerror.h /** * A constant used by WaitForMultipleObjects to indicate the object which was * signaled. */ - public static final int WAIT_OBJECT_0; + public static final int WAIT_OBJECT_0 = 0x0; // winbase.h /** * A constant which indicates that some objects which * were waiting to be signaled are an abandoned mutex * objects. */ - public static final int WAIT_ABANDONED_0; + public static final int WAIT_ABANDONED_0 = 0x80; // winbase.h /** * A constant returned by WaitForMultipleObjects which indicates * that the wait failed. */ - public static final int WAIT_FAILED; + public static final int WAIT_FAILED = 0xffffffff; // winbase.h /* wait notification filter masks */ /** * Change filter for monitoring file rename, creation or deletion. */ - public static final int FILE_NOTIFY_CHANGE_FILE_NAME; + public static final int FILE_NOTIFY_CHANGE_FILE_NAME = 0x01; // winnt.h /** * Change filter for monitoring directory creation or deletion. */ - public static final int FILE_NOTIFY_CHANGE_DIR_NAME; + public static final int FILE_NOTIFY_CHANGE_DIR_NAME = 0x02; // winnt.h /** * Change filter for monitoring file size changes. */ - public static final int FILE_NOTIFY_CHANGE_SIZE; + public static final int FILE_NOTIFY_CHANGE_SIZE = 0x08; // winnt.h /** * Change filter for monitoring the file write timestamp */ - public static final int FILE_NOTIFY_CHANGE_LAST_WRITE; + public static final int FILE_NOTIFY_CHANGE_LAST_WRITE = 0x10; // winnt.h - /* - * Make requests to set the constants. - */ - static { - System.loadLibrary("win32refresh"); //$NON-NLS-1$ - INVALID_HANDLE_VALUE = INVALID_HANDLE_VALUE(); - ERROR_SUCCESS = ERROR_SUCCESS(); - ERROR_INVALID_HANDLE = ERROR_INVALID_HANDLE(); + private static class WindowsH { + static { + Native.register(NativeLibrary + .getInstance("Kernel32" /* , W32APIOptions.DEFAULT_OPTIONS < type-conversion unnecessary> */)); //$NON-NLS-1$ + } + // Direct-mappings are faster than interface-mappings + // and avoiding type-conversions is faster again. + // https://github.com/java-native-access/jna/blob/master/www/FunctionalDescription.md#direct-mapping + + // WinNT's type 'HANDLE is expressed as long + // (in winnt.h it is defined as 'typedef HANDLE *PHANDLE;') + + // Methods from fileapi.h header + + static native long FindFirstChangeNotificationW(WString lpPathName, int bWatchSubtree, int dwNotifyFilter); + + static native int FindCloseChangeNotification(long hChangeHandle); - MAXIMUM_WAIT_OBJECTS = MAXIMUM_WAIT_OBJECTS(); + static native int FindNextChangeNotification(long hChangeHandle); - WAIT_TIMEOUT = WAIT_TIMEOUT(); - WAIT_OBJECT_0 = WAIT_OBJECT_0(); - WAIT_ABANDONED_0 = WAIT_ABANDONED_0(); - WAIT_FAILED = WAIT_FAILED(); + // Methods from synchapi.h - FILE_NOTIFY_CHANGE_FILE_NAME = FILE_NOTIFY_CHANGE_FILE_NAME(); - FILE_NOTIFY_CHANGE_DIR_NAME = FILE_NOTIFY_CHANGE_DIR_NAME(); - FILE_NOTIFY_CHANGE_SIZE = FILE_NOTIFY_CHANGE_SIZE(); - FILE_NOTIFY_CHANGE_LAST_WRITE = FILE_NOTIFY_CHANGE_LAST_WRITE(); + static native int WaitForMultipleObjects(int nCount, long[] lpHandles, int bWaitAll, int dwMilliseconds); + + // direct type conversion methods + + static WString fromString(String value) { + return new WString(value); + } + + static int fromBoolean(boolean value) { + return value ? 1 : 0; + } + + static boolean toBoolean(int value) { + return value != 0; + } } + private static final String LONG_PATH_PREFIX = "\\\\?\\"; //$NON-NLS-1$ + /** * Creates a change notification object for the given path. The notification * object allows the client to monitor changes to the directory and the @@ -127,29 +156,11 @@ public class Win32Natives { * ERROR_INVALID_HANDLE if the attempt fails. */ public static long FindFirstChangeNotification(String lpPathName, boolean bWatchSubtree, int dwNotifyFilter) { - return FindFirstChangeNotificationW(lpPathName, bWatchSubtree, dwNotifyFilter); + WString wPathName = WindowsH + .fromString(!lpPathName.startsWith(LONG_PATH_PREFIX) ? LONG_PATH_PREFIX + lpPathName : lpPathName); + return WindowsH.FindFirstChangeNotificationW(wPathName, WindowsH.fromBoolean(bWatchSubtree), dwNotifyFilter); } - /** - * Creates a change notification object for the given path. This notification object - * allows the client to monitor changes to the directory and the subtree - * under the directory using FindNextChangeNotification or - * WaitForMultipleObjects. - * - * @param lpPathName The path to the directory to be monitored. Cannot be null, - * or longer than 2^15 - 1 characters. - * @param bWatchSubtree If true, specifies that the entire - * tree under the given path should be monitored. If false - * specifies that just the named path should be monitored. - * @param dwNotifyFilter Any combination of FILE_NOTIFY_CHANGE_FILE_NAME, - * FILE_NOTIFY_CHANGE_DIR_NAME, FILE_NOTIFY_CHANGE_ATTRIBUTES, - * FILE_NOTIFY_CHANGE_SIZE, FILE_NOTIFY_CHANGE_LAST_WRITE, or - * FILE_NOTIFY_CHANGE_SECURITY. - * @return long The handle to the find change notification object or - * ERROR_INVALID_HANDLE if the attempt fails. - */ - private static native long FindFirstChangeNotificationW(String lpPathName, boolean bWatchSubtree, int dwNotifyFilter); - /** * Stops and disposes of the change notification object that corresponds to the given * handle. The handle cannot be used in future calls to FindNextChangeNotification or @@ -159,7 +170,9 @@ public static long FindFirstChangeNotification(String lpPathName, boolean bWatch * @return boolean true if the method succeeds, false * otherwise. */ - public static native boolean FindCloseChangeNotification(long hChangeHandle); + public static boolean FindCloseChangeNotification(long hChangeHandle) { + return WindowsH.toBoolean(WindowsH.FindCloseChangeNotification(hChangeHandle)); + } /** * Requests that the next change detected be signaled. This method should only be @@ -169,7 +182,9 @@ public static long FindFirstChangeNotification(String lpPathName, boolean bWatch * @param hChangeHandle a handle which was created with FindFirstChangeNotification * @return boolean true if the method succeeds, false otherwise. */ - public static native boolean FindNextChangeNotification(long hChangeHandle); + public static boolean FindNextChangeNotification(long hChangeHandle) { + return WindowsH.toBoolean(WindowsH.FindNextChangeNotification(hChangeHandle)); + } /** * Returns when one of the following occurs. @@ -191,84 +206,16 @@ public static long FindFirstChangeNotification(String lpPathName, boolean bWatch * WAIT_OBJECT_0 + n when a signal for the handle at index n. WAIT_FAILED when this * function fails. */ - public static native int WaitForMultipleObjects(int nCount, long[] lpHandles, boolean bWaitAll, int dwMilliseconds); + public static int WaitForMultipleObjects(int nCount, long[] lpHandles, boolean bWaitAll, int dwMilliseconds) { + return WindowsH.WaitForMultipleObjects(nCount, lpHandles, WindowsH.fromBoolean(bWaitAll), dwMilliseconds); + } /** * Answers the last error set in the current thread. * @return int the last error */ - public static native int GetLastError(); - - /** - * Returns the constant FILE_NOTIFY_CHANGE_LAST_WRITE. - * @return int - */ - private static native int FILE_NOTIFY_CHANGE_LAST_WRITE(); - - /** - * Returns the constant FILE_NOTIFY_CHANGE_DIR_NAME. - * @return int - */ - private static native int FILE_NOTIFY_CHANGE_DIR_NAME(); - - /** - * Returns the constant FILE_NOTIFY_CHANGE_SIZE. - * @return int - */ - private static native int FILE_NOTIFY_CHANGE_SIZE(); - - /** - * Returns the constant FILE_NOTIFY_CHANGE_FILE_NAME. - * @return int - */ - private static native int FILE_NOTIFY_CHANGE_FILE_NAME(); - - /** - * Returns the constant MAXIMUM_WAIT_OBJECTS. - * @return int - */ - private static native int MAXIMUM_WAIT_OBJECTS(); - - /** - * Returns the constant WAIT_OBJECT_0. - * @return int - */ - private static native int WAIT_OBJECT_0(); - - /** - * Returns the constant WAIT_ABANDONED_0. - * @return int - */ - private static native int WAIT_ABANDONED_0(); - - /** - * Returns the constant WAIT_FAILED. - * @return int - */ - private static native int WAIT_FAILED(); - - /** - * Returns the constant WAIT_TIMEOUT. - * @return int - */ - private static native int WAIT_TIMEOUT(); - - /** - * Returns the constant ERROR_INVALID_HANDLE. - * @return int - */ - private static native int ERROR_INVALID_HANDLE(); - - /** - * Returns the constant ERROR_SUCCESS. - * @return int - */ - private static native int ERROR_SUCCESS(); - - /** - * Returns the constant INVALID_HANDLE_VALUE. - * @return long - */ - private static native long INVALID_HANDLE_VALUE(); + public static int GetLastError() { + return Native.getLastError(); + } }