Changeset 2d31f30


Ignore:
Timestamp:
Mar 23, 2015 12:49:30 PM (6 years ago)
Author:
str4d <str4d@…>
Branches:
master
Children:
9790d3b
Parents:
2fefe93
Message:

ReadWriteLock? in TunnelControlGroup? (#815)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java

    r2fefe93 r2d31f30  
    1212import java.util.concurrent.Executors;
    1313import java.util.concurrent.SynchronousQueue;
    14 import java.util.concurrent.RejectedExecutionException;
    1514import java.util.concurrent.ThreadPoolExecutor;
    1615import java.util.concurrent.TimeUnit;
    1716import java.util.concurrent.ThreadFactory;
    1817import java.util.concurrent.atomic.AtomicLong;
     18import java.util.concurrent.locks.ReadWriteLock;
     19import java.util.concurrent.locks.ReentrantReadWriteLock;
    1920
    2021import net.i2p.I2PAppContext;
     
    4445   
    4546    private final List<TunnelController> _controllers;
     47    private final ReadWriteLock _controllersLock;
    4648    private final String _configFile;
    4749   
     
    106108        _log = _context.logManager().getLog(TunnelControllerGroup.class);
    107109        _controllers = new ArrayList<TunnelController>();
     110        _controllersLock = new ReentrantReadWriteLock(true);
    108111        if (args == null || args.length <= 0)
    109112            _configFile = DEFAULT_CONFIG_FILE;
     
    244247        changeState(STARTING);
    245248        Properties cfg = loadConfig(configFile);
    246         int i = 0;
    247         while (true) {
    248             String type = cfg.getProperty("tunnel." + i + ".type");
    249             if (type == null)
    250                 break;
    251             TunnelController controller = new TunnelController(cfg, "tunnel." + i + ".");
    252             _controllers.add(controller);
    253             i++;
     249        int i = 0;
     250        _controllersLock.writeLock().lock();
     251        try {
     252            while (true) {
     253                String type = cfg.getProperty("tunnel." + i + ".type");
     254                if (type == null)
     255                    break;
     256                TunnelController controller = new TunnelController(cfg, "tunnel." + i + ".");
     257                _controllers.add(controller);
     258                i++;
     259            }
     260        } finally {
     261            _controllersLock.writeLock().unlock();
    254262        }
    255263        I2PAppThread startupThread = new I2PAppThread(new StartControllers(), "Startup tunnels");
     
    264272        public void run() {
    265273            synchronized(TunnelControllerGroup.this) {
    266                 for (int i = 0; i < _controllers.size(); i++) {
    267                     TunnelController controller = _controllers.get(i);
    268                     if (controller.getStartOnLoad())
    269                         controller.startTunnel();
     274                _controllersLock.readLock().lock();
     275                try {
     276                    for (int i = 0; i < _controllers.size(); i++) {
     277                        TunnelController controller = _controllers.get(i);
     278                        if (controller.getStartOnLoad())
     279                            controller.startTunnel();
     280                    }
     281                } finally {
     282                    _controllersLock.readLock().unlock();
    270283                }
    271284            }
     
    290303     */
    291304    public synchronized void unloadControllers() {
    292         destroyAllControllers();
    293         _controllers.clear();
     305        _controllersLock.writeLock().lock();
     306        try {
     307            destroyAllControllers();
     308            _controllers.clear();
     309        } finally {
     310            _controllersLock.writeLock().unlock();
     311        }
    294312        if (_log.shouldLog(Log.INFO))
    295313            _log.info("All controllers stopped and unloaded");
    296314    }
    297    
     315
    298316    /**
    299317     * Add the given tunnel to the set of known controllers (but dont add it to
     
    301319     *
    302320     */
    303     public synchronized void addController(TunnelController controller) { _controllers.add(controller); }
    304    
     321    public synchronized void addController(TunnelController controller) {
     322        _controllersLock.writeLock().lock();
     323        try {
     324            _controllers.add(controller);
     325        } finally {
     326            _controllersLock.writeLock().unlock();
     327        }
     328    }
     329
    305330    /**
    306331     * Stop and remove the given tunnel
     
    312337        controller.stopTunnel();
    313338        List<String> msgs = controller.clearMessages();
    314         _controllers.remove(controller);
     339        _controllersLock.writeLock().lock();
     340        try {
     341            _controllers.remove(controller);
     342        } finally {
     343            _controllersLock.writeLock().unlock();
     344        }
    315345        msgs.add("Tunnel " + controller.getName() + " removed");
    316346        return msgs;
     
    324354    public synchronized List<String> stopAllControllers() {
    325355        List<String> msgs = new ArrayList<String>();
    326         for (int i = 0; i < _controllers.size(); i++) {
    327             TunnelController controller = _controllers.get(i);
    328             controller.stopTunnel();
    329             msgs.addAll(controller.clearMessages());
    330         }
    331         if (_log.shouldLog(Log.INFO))
    332             _log.info(_controllers.size() + " controllers stopped");
     356        _controllersLock.readLock().lock();
     357        try {
     358            for (int i = 0; i < _controllers.size(); i++) {
     359                TunnelController controller = _controllers.get(i);
     360                controller.stopTunnel();
     361                msgs.addAll(controller.clearMessages());
     362            }
     363            if (_log.shouldLog(Log.INFO))
     364                _log.info(_controllers.size() + " controllers stopped");
     365        } finally {
     366            _controllersLock.readLock().unlock();
     367        }
    333368        return msgs;
    334369    }
     
    356391    public synchronized List<String> startAllControllers() {
    357392        List<String> msgs = new ArrayList<String>();
    358         for (int i = 0; i < _controllers.size(); i++) {
    359             TunnelController controller = _controllers.get(i);
    360             controller.startTunnelBackground();
    361             msgs.addAll(controller.clearMessages());
    362         }
    363 
    364         if (_log.shouldLog(Log.INFO))
    365             _log.info(_controllers.size() + " controllers started");
     393        _controllersLock.readLock().lock();
     394        try {
     395            for (int i = 0; i < _controllers.size(); i++) {
     396                TunnelController controller = _controllers.get(i);
     397                controller.startTunnelBackground();
     398                msgs.addAll(controller.clearMessages());
     399            }
     400
     401            if (_log.shouldLog(Log.INFO))
     402                _log.info(_controllers.size() + " controllers started");
     403        } finally {
     404            _controllersLock.readLock().unlock();
     405        }
    366406        return msgs;
    367407    }
     
    374414    public synchronized List<String> restartAllControllers() {
    375415        List<String> msgs = new ArrayList<String>();
    376         for (int i = 0; i < _controllers.size(); i++) {
    377             TunnelController controller = _controllers.get(i);
    378             controller.restartTunnel();
    379             msgs.addAll(controller.clearMessages());
    380         }
    381         if (_log.shouldLog(Log.INFO))
    382             _log.info(_controllers.size() + " controllers restarted");
     416        _controllersLock.readLock().lock();
     417        try {
     418            for (int i = 0; i < _controllers.size(); i++) {
     419                TunnelController controller = _controllers.get(i);
     420                controller.restartTunnel();
     421                msgs.addAll(controller.clearMessages());
     422            }
     423            if (_log.shouldLog(Log.INFO))
     424                _log.info(_controllers.size() + " controllers restarted");
     425        } finally {
     426            _controllersLock.readLock().unlock();
     427        }
    383428        return msgs;
    384429    }
     
    389434     * @return list of messages the tunnels have generated
    390435     */
    391     public synchronized List<String> clearAllMessages() {
     436    public List<String> clearAllMessages() {
    392437        List<String> msgs = new ArrayList<String>();
    393         for (int i = 0; i < _controllers.size(); i++) {
    394             TunnelController controller = _controllers.get(i);
    395             msgs.addAll(controller.clearMessages());
     438        _controllersLock.readLock().lock();
     439        try {
     440            for (int i = 0; i < _controllers.size(); i++) {
     441                TunnelController controller = _controllers.get(i);
     442                msgs.addAll(controller.clearMessages());
     443            }
     444        } finally {
     445            _controllersLock.readLock().unlock();
    396446        }
    397447        return msgs;
     
    420470       
    421471        Properties map = new OrderedProperties();
    422         for (int i = 0; i < _controllers.size(); i++) {
    423             TunnelController controller = _controllers.get(i);
    424             Properties cur = controller.getConfig("tunnel." + i + ".");
    425             map.putAll(cur);
     472        _controllersLock.readLock().lock();
     473        try {
     474            for (int i = 0; i < _controllers.size(); i++) {
     475                TunnelController controller = _controllers.get(i);
     476                Properties cur = controller.getConfig("tunnel." + i + ".");
     477                map.putAll(cur);
     478            }
     479        } finally {
     480            _controllersLock.readLock().unlock();
    426481        }
    427482       
     
    461516     * @return list of TunnelController objects
    462517     */
    463     public synchronized List<TunnelController> getControllers() {
    464         return new ArrayList<TunnelController>(_controllers);
     518    public List<TunnelController> getControllers() {
     519        _controllersLock.readLock().lock();
     520        try {
     521            return new ArrayList<TunnelController>(_controllers);
     522        } finally {
     523            _controllersLock.readLock().unlock();
     524        }
    465525    }
    466526   
Note: See TracChangeset for help on using the changeset viewer.