Home | History | Annotate | Download | only in ch
      1 /*
      2  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      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 
     26 package sun.nio.ch;
     27 
     28 import java.nio.channels.*;
     29 import java.nio.channels.spi.AsynchronousChannelProvider;
     30 import java.util.concurrent.ExecutorService;
     31 import java.util.concurrent.ThreadFactory;
     32 import java.io.IOException;
     33 
     34 public class LinuxAsynchronousChannelProvider
     35     extends AsynchronousChannelProvider
     36 {
     37     private static volatile EPollPort defaultPort;
     38 
     39     private EPollPort defaultEventPort() throws IOException {
     40         if (defaultPort == null) {
     41             synchronized (LinuxAsynchronousChannelProvider.class) {
     42                 if (defaultPort == null) {
     43                     defaultPort = new EPollPort(this, ThreadPool.getDefault()).start();
     44                 }
     45             }
     46         }
     47         return defaultPort;
     48     }
     49 
     50     public LinuxAsynchronousChannelProvider() {
     51     }
     52 
     53     @Override
     54     public AsynchronousChannelGroup openAsynchronousChannelGroup(int nThreads, ThreadFactory factory)
     55         throws IOException
     56     {
     57         return new EPollPort(this, ThreadPool.create(nThreads, factory)).start();
     58     }
     59 
     60     @Override
     61     public AsynchronousChannelGroup openAsynchronousChannelGroup(ExecutorService executor, int initialSize)
     62         throws IOException
     63     {
     64         return new EPollPort(this, ThreadPool.wrap(executor, initialSize)).start();
     65     }
     66 
     67     private Port toPort(AsynchronousChannelGroup group) throws IOException {
     68         if (group == null) {
     69             return defaultEventPort();
     70         } else {
     71             if (!(group instanceof EPollPort))
     72                 throw new IllegalChannelGroupException();
     73             return (Port)group;
     74         }
     75     }
     76 
     77     @Override
     78     public AsynchronousServerSocketChannel openAsynchronousServerSocketChannel(AsynchronousChannelGroup group)
     79         throws IOException
     80     {
     81         return new UnixAsynchronousServerSocketChannelImpl(toPort(group));
     82     }
     83 
     84     @Override
     85     public AsynchronousSocketChannel openAsynchronousSocketChannel(AsynchronousChannelGroup group)
     86         throws IOException
     87     {
     88         return new UnixAsynchronousSocketChannelImpl(toPort(group));
     89     }
     90 }
     91