8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package sun.nio.ch;
26
27 import java.io.IOException;
28 import static sun.nio.ch.KQueue.*;
29
30 /**
31 * Poller implementation based on the kqueue facility.
32 */
33 class KQueuePoller extends Poller {
34 private final int kqfd;
35 private final int filter;
36 private final int maxEvents;
37 private final long address;
38
39 KQueuePoller(boolean subPoller, boolean read) throws IOException {
40 this.kqfd = KQueue.create();
41 this.filter = (read) ? EVFILT_READ : EVFILT_WRITE;
42 this.maxEvents = (subPoller) ? 64 : 512;
43 this.address = KQueue.allocatePollArray(maxEvents);
44 }
45
46 @Override
47 int fdVal() {
48 return kqfd;
49 }
50
51 @Override
52 void implRegister(int fdVal) throws IOException {
53 int err = KQueue.register(kqfd, fdVal, filter, (EV_ADD|EV_ONESHOT));
54 if (err != 0)
55 throw new IOException("kevent failed: " + err);
56 }
57
58 @Override
59 void implDeregister(int fdVal, boolean polled) {
60 // event was deleted if already polled
61 if (!polled) {
62 KQueue.register(kqfd, fdVal, filter, EV_DELETE);
63 }
|
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package sun.nio.ch;
26
27 import java.io.IOException;
28 import java.io.UncheckedIOException;
29 import java.lang.ref.Cleaner.Cleanable;
30 import jdk.internal.ref.CleanerFactory;
31 import static sun.nio.ch.KQueue.*;
32
33 /**
34 * Poller implementation based on the kqueue facility.
35 */
36 class KQueuePoller extends Poller {
37 private final int kqfd;
38 private final int filter;
39 private final int maxEvents;
40 private final long address;
41 private final Cleanable cleaner;
42
43 KQueuePoller(boolean subPoller, boolean read) throws IOException {
44 this.kqfd = KQueue.create();
45 this.filter = (read) ? EVFILT_READ : EVFILT_WRITE;
46 this.maxEvents = (subPoller) ? 64 : 512;
47 this.address = KQueue.allocatePollArray(maxEvents);
48 if (subPoller) {
49 this.cleaner = CleanerFactory.cleaner().register(this, release(kqfd, address));
50 } else {
51 this.cleaner = null;
52 }
53 }
54
55 @Override
56 void close() {
57 cleaner.clean();
58 }
59
60 /**
61 * Closes kernel event queue and release poll array.
62 */
63 private static Runnable release(int kqfd, long address) {
64 return () -> {
65 try {
66 FileDispatcherImpl.closeIntFD(kqfd);
67 } catch (IOException ioe) {
68 throw new UncheckedIOException(ioe);
69 } finally {
70 // release memory
71 KQueue.freePollArray(address);
72 }
73 };
74 }
75
76 @Override
77 int fdVal() {
78 return kqfd;
79 }
80
81 @Override
82 void implRegister(int fdVal) throws IOException {
83 int err = KQueue.register(kqfd, fdVal, filter, (EV_ADD|EV_ONESHOT));
84 if (err != 0)
85 throw new IOException("kevent failed: " + err);
86 }
87
88 @Override
89 void implDeregister(int fdVal, boolean polled) {
90 // event was deleted if already polled
91 if (!polled) {
92 KQueue.register(kqfd, fdVal, filter, EV_DELETE);
93 }
|