Add a WatchService implementation backed by kqueue,

leveraging the libinotify wrapper.

It's still possible to use the polling watchservice,
by defining the following system property:

 sun.nio.fs.watchservice=polling
This commit is contained in:
Alex Dupre 2018-12-27 09:52:52 +00:00
parent 4752aab612
commit ad43f6fd6e
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=488523
5 changed files with 68 additions and 2 deletions

View file

@ -2,7 +2,7 @@
PORTNAME= openjdk
PORTVERSION= ${JDK_MAJOR_VERSION}.${JDK_UPDATE_VERSION}.${JDK_BUILD_NUMBER:S/^0//}
PORTREVISION= 2
PORTREVISION= 3
CATEGORIES= java devel
MASTER_SITES= http://download.java.net/openjdk/jdk${JDK_MAJOR_VERSION}/promoted/b${DIST_BUILD_NUMBER}/:jdk \
https://adopt-openjdk.ci.cloudbees.com/job/jtreg/${JTREG_JENKINS_BUILD}/artifact/:jtreg \
@ -46,7 +46,8 @@ BUILD_DEPENDS= zip:archivers/zip \
autoconf>0:devel/autoconf \
${LOCALBASE}/include/cups/cups.h:print/cups \
bash:shells/bash
LIB_DEPENDS= libfreetype.so:print/freetype2
LIB_DEPENDS= libfreetype.so:print/freetype2 \
libinotify.so:devel/libinotify
RUN_DEPENDS= javavm:java/javavmwrapper \
dejavu>0:x11-fonts/dejavu
@ -406,6 +407,7 @@ post-patch:
${WRKSRC}/configure \
${WRKSRC}/common/autoconf/toolchain.m4 \
${WRKSRC}/jdk/make/lib/Awt2dLibraries.gmk \
${WRKSRC}/jdk/make/lib/NioLibraries.gmk \
${WRKSRC}/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java \
${WRKSRC}/jdk/src/share/classes/sun/print/PSPrinterJob.java \
${WRKSRC}/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java

View file

@ -0,0 +1,18 @@
--- ./jdk/make/CompileJavaClasses.gmk.orig 2018-12-13 14:57:18.491487000 +0100
+++ ./jdk/make/CompileJavaClasses.gmk 2018-12-13 14:58:08.484490000 +0100
@@ -129,12 +129,12 @@
sun/nio/fs/LinuxFileSystem.java \
sun/nio/fs/LinuxFileSystemProvider.java \
sun/nio/fs/LinuxNativeDispatcher.java \
- sun/nio/fs/LinuxUserDefinedFileAttributeView.java \
- sun/nio/fs/LinuxWatchService.java
+ sun/nio/fs/LinuxUserDefinedFileAttributeView.java
endif
ifeq (, $(filter $(OPENJDK_TARGET_OS), linux bsd))
- EXFILES += sun/nio/fs/MagicFileTypeDetector.java
+ EXFILES += sun/nio/fs/MagicFileTypeDetector.java \
+ sun/nio/fs/LinuxWatchService.java
endif
ifneq ($(OPENJDK_TARGET_OS), macosx)

View file

@ -0,0 +1,14 @@
--- ./jdk/make/lib/NioLibraries.gmk.orig 2018-12-13 14:21:04.047810000 +0100
+++ ./jdk/make/lib/NioLibraries.gmk 2018-12-13 14:48:16.288168000 +0100
@@ -92,8 +92,11 @@
PollArrayWrapper.c \
UnixAsynchronousServerSocketChannelImpl.c \
UnixAsynchronousSocketChannelImpl.c \
+ LinuxWatchService.c \
UnixCopyFile.c \
UnixNativeDispatcher.c
+ BUILD_LIBNIO_CFLAGS += -I%%LOCALBASE%%/include
+ BUILD_LIBNIO_LDFLAGS += -L%%LOCALBASE%%/lib -linotify
endif
ifeq ($(OPENJDK_TARGET_OS), macosx)

View file

@ -0,0 +1,17 @@
--- ./jdk/make/mapfiles/libnio/mapfile-bsd.orig 2018-12-13 15:20:56.817147000 +0100
+++ ./jdk/make/mapfiles/libnio/mapfile-bsd 2018-12-13 15:22:41.507010000 +0100
@@ -143,6 +143,14 @@
Java_sun_nio_fs_MagicFileTypeDetector_initialize0;
Java_sun_nio_fs_MagicFileTypeDetector_probe0;
Java_sun_nio_fs_UnixCopyFile_transfer;
+ Java_sun_nio_fs_LinuxWatchService_eventSize;
+ Java_sun_nio_fs_LinuxWatchService_eventOffsets;
+ Java_sun_nio_fs_LinuxWatchService_inotifyInit;
+ Java_sun_nio_fs_LinuxWatchService_inotifyAddWatch;
+ Java_sun_nio_fs_LinuxWatchService_inotifyRmWatch;
+ Java_sun_nio_fs_LinuxWatchService_configureBlocking;
+ Java_sun_nio_fs_LinuxWatchService_socketpair;
+ Java_sun_nio_fs_LinuxWatchService_poll;
Java_sun_nio_fs_UnixNativeDispatcher_access0;
Java_sun_nio_fs_UnixNativeDispatcher_chmod0;
Java_sun_nio_fs_UnixNativeDispatcher_chown0;

View file

@ -0,0 +1,15 @@
--- ./jdk/src/solaris/classes/sun/nio/fs/BsdFileSystem.java.orig 2018-12-13 14:23:02.834223000 +0100
+++ ./jdk/src/solaris/classes/sun/nio/fs/BsdFileSystem.java 2018-12-13 17:34:09.359192000 +0100
@@ -45,8 +45,10 @@
public WatchService newWatchService()
throws IOException
{
- // use polling implementation until we implement a BSD/kqueue one
- return new PollingWatchService();
+ if (System.getProperty("sun.nio.fs.watchservice", "").equals("polling"))
+ return new PollingWatchService();
+ else
+ return new LinuxWatchService(this); // use the linux inotify implementation that wraps the kqueue calls
}
// lazy initialization of the list of supported attribute views