Changeset 259c28f


Ignore:
Timestamp:
Sep 16, 2012 3:47:36 PM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
2b14d32
Parents:
b6a5360
Message:

startup/shutdown synchronization in several places

Location:
router/java/src/net/i2p/router
Files:
30 edited

Legend:

Unmodified
Added
Removed
  • router/java/src/net/i2p/router/InNetMessagePool.java

    rb6a5360 r259c28f  
    325325
    326326    /** does nothing since we aren't threaded */
    327     public void restart() {
     327    public synchronized void restart() {
    328328        shutdown();
    329329        try { Thread.sleep(100); } catch (InterruptedException ie) {}
     
    332332
    333333    /** does nothing since we aren't threaded */
    334     public void shutdown() {
     334    public synchronized void shutdown() {
    335335        _alive = false;
    336336        if (!DISPATCH_DIRECT) {
     
    344344   
    345345    /** does nothing since we aren't threaded */
    346     public void startup() {
     346    public synchronized void startup() {
    347347        _alive = true;
    348348        _dispatchThreaded = DEFAULT_DISPATCH_THREADED;
  • router/java/src/net/i2p/router/MessageHistory.java

    rb6a5360 r259c28f  
    6666   
    6767    /** @since 0.8.12 */
    68     public void shutdown() {
     68    public synchronized void shutdown() {
    6969        if (_doLog)
    7070            addEntry(getPrefix() + "** Router shutdown");
     
    9090     *
    9191     */
    92     public void initialize(boolean forceReinitialize) {
     92    public synchronized void initialize(boolean forceReinitialize) {
    9393        if (!forceReinitialize) return;
    9494
  • router/java/src/net/i2p/router/MessageValidator.java

    rb6a5360 r259c28f  
    9595    }
    9696   
    97     public void startup() {
     97    public synchronized void startup() {
    9898        _filter = new DecayingHashSet(_context, (int)Router.CLOCK_FUDGE_FACTOR * 2, 8, "RouterMV");
    9999    }
    100100   
    101     void shutdown() {
     101    synchronized void shutdown() {
    102102        _filter.stopDecaying();
    103103    }
  • router/java/src/net/i2p/router/Router.java

    rb6a5360 r259c28f  
    6767    private RouterInfo _routerInfo;
    6868    public final Object routerInfoFileLock = new Object();
     69    private final Object _configFileLock = new Object();
    6970    private long _started;
    7071    private boolean _higherVersionSeen;
     
    414415     *  @since public as of 0.9 for Android and other embedded uses
    415416     */
    416     public void runRouter() {
     417    public synchronized void runRouter() {
    417418        if (_isAlive)
    418419            throw new IllegalStateException();
     
    469470     * This is synchronized with saveConfig()
    470471     */
    471     public synchronized void readConfig() {
    472         String f = getConfigFilename();
    473         Properties config = getConfig(_context, f);
    474         // to avoid compiler errror
    475         Map foo = _config;
    476         foo.putAll(config);
     472    public void readConfig() {
     473        synchronized(_configFileLock) {
     474            String f = getConfigFilename();
     475            Properties config = getConfig(_context, f);
     476            // to avoid compiler errror
     477            Map foo = _config;
     478            foo.putAll(config);
     479        }
    477480    }
    478481   
    479482    /**
    480483     *  this does not use ctx.getConfigDir(), must provide a full path in filename
     484     *  Caller must synchronize
    481485     *
    482486     *  @param ctx will be null at startup when called from constructor
     
    519523     */
    520524    public void rebuildRouterInfo() { rebuildRouterInfo(false); }
     525
    521526    public void rebuildRouterInfo(boolean blockingRebuild) {
    522527        if (_log.shouldLog(Log.INFO))
     
    699704     *
    700705     */
    701     public void rebuildNewIdentity() {
     706    public synchronized void rebuildNewIdentity() {
    702707        if (_shutdownHook != null) {
    703708            try {
     
    748753     *  Shutdown with no chance of cancellation
    749754     */
    750     public void shutdown(int exitCode) {
     755    public synchronized void shutdown(int exitCode) {
    751756        if (_shutdownInProgress)
    752757            return;
     
    766771     *  NOT to be called by others, use shutdown().
    767772     */
    768     public void shutdown2(int exitCode) {
     773    public synchronized void shutdown2(int exitCode) {
    769774        // help us shut down esp. after OOM
    770775        int priority = (exitCode == EXIT_OOM) ? Thread.MAX_PRIORITY - 1 : Thread.NORM_PRIORITY + 2;
     
    863868     *  Cancel the JVM runtime hook before calling this.
    864869     */
    865     private void finalShutdown(int exitCode) {
     870    private synchronized void finalShutdown(int exitCode) {
    866871        clearCaches();
    867872        _log.log(Log.CRIT, "Shutdown(" + exitCode + ") complete"  /* , new Exception("Shutdown") */ );
     
    978983     * Synchronized with file read in getConfig()
    979984     */
    980     public synchronized boolean saveConfig() {
    981         FileOutputStream fos = null;
    982         try {
    983             fos = new SecureFileOutputStream(_configFilename);
    984             StringBuilder buf = new StringBuilder(8*1024);
    985             buf.append("# NOTE: This I2P config file must use UTF-8 encoding\n");
    986             TreeSet ordered = new TreeSet(_config.keySet());
    987             for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) {
    988                 String key = (String)iter.next();
    989                 String val = _config.get(key);
    990                     // Escape line breaks before saving.
    991                     // Remember: "\" needs escaping both for regex and string.
    992                     // NOOO - see comments in DataHelper
    993                     //val = val.replaceAll("\\r","\\\\r");
    994                     //val = val.replaceAll("\\n","\\\\n");
    995                 buf.append(key).append('=').append(val).append('\n');
    996             }
    997             fos.write(buf.toString().getBytes("UTF-8"));
    998         } catch (IOException ioe) {
    999             // warning, _log will be null when called from constructor
    1000             if (_log != null)
    1001                 _log.error("Error saving the config to " + _configFilename, ioe);
    1002             else
    1003                 System.err.println("Error saving the config to " + _configFilename + ": " + ioe);
    1004             return false;
    1005         } finally {
    1006             if (fos != null) try { fos.close(); } catch (IOException ioe) {}
    1007         }
    1008        
    1009         return true;
     985    public boolean saveConfig() {
     986        synchronized(_configFileLock) {
     987            FileOutputStream fos = null;
     988            try {
     989                fos = new SecureFileOutputStream(_configFilename);
     990                StringBuilder buf = new StringBuilder(8*1024);
     991                buf.append("# NOTE: This I2P config file must use UTF-8 encoding\n");
     992                TreeSet ordered = new TreeSet(_config.keySet());
     993                for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) {
     994                    String key = (String)iter.next();
     995                    String val = _config.get(key);
     996                        // Escape line breaks before saving.
     997                        // Remember: "\" needs escaping both for regex and string.
     998                        // NOOO - see comments in DataHelper
     999                        //val = val.replaceAll("\\r","\\\\r");
     1000                        //val = val.replaceAll("\\n","\\\\n");
     1001                    buf.append(key).append('=').append(val).append('\n');
     1002                }
     1003                fos.write(buf.toString().getBytes("UTF-8"));
     1004            } catch (IOException ioe) {
     1005                // warning, _log will be null when called from constructor
     1006                if (_log != null)
     1007                    _log.error("Error saving the config to " + _configFilename, ioe);
     1008                else
     1009                    System.err.println("Error saving the config to " + _configFilename + ": " + ioe);
     1010                return false;
     1011            } finally {
     1012                if (fos != null) try { fos.close(); } catch (IOException ioe) {}
     1013            }
     1014           
     1015            return true;
     1016        }
    10101017    }
    10111018   
     
    10201027     * @since 0.8.13
    10211028     */
    1022     public synchronized boolean saveConfig(String name, String value) {
    1023         if (value != null)
    1024             _config.put(name, value);
    1025         else
    1026             removeConfigSetting(name);
    1027         return saveConfig();
     1029    public boolean saveConfig(String name, String value) {
     1030        synchronized(_configFileLock) {
     1031            if (value != null)
     1032                _config.put(name, value);
     1033            else
     1034                removeConfigSetting(name);
     1035            return saveConfig();
     1036        }
    10281037    }
    10291038
     
    10381047     * @since 0.8.13
    10391048     */
    1040     public synchronized boolean saveConfig(Map toAdd, Collection<String> toRemove) {
    1041         if (toAdd != null)
    1042             _config.putAll(toAdd);
    1043         if (toRemove != null) {
    1044             for (String s : toRemove) {
    1045                 removeConfigSetting(s);
    1046             }
    1047         }
    1048         return saveConfig();
     1049    public boolean saveConfig(Map toAdd, Collection<String> toRemove) {
     1050        synchronized(_configFileLock) {
     1051            if (toAdd != null)
     1052                _config.putAll(toAdd);
     1053            if (toRemove != null) {
     1054                for (String s : toRemove) {
     1055                    removeConfigSetting(s);
     1056                }
     1057            }
     1058            return saveConfig();
     1059        }
    10491060    }
    10501061
  • router/java/src/net/i2p/router/client/ClientManager.java

    rb6a5360 r259c28f  
    9090    }
    9191   
    92     public void restart() {
     92    public synchronized void restart() {
    9393        shutdown("Router restart");
    9494       
     
    104104     *  @param msg message to send to the clients
    105105     */
    106     public void shutdown(String msg) {
     106    public synchronized void shutdown(String msg) {
    107107        _isStarted = false;
    108108        _log.info("Shutting down the ClientManager");
  • router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java

    rb6a5360 r259c28f  
    5353    }
    5454   
    55     public void startup() {
     55    public synchronized void startup() {
    5656        _log.info("Starting up the client subsystem");
    5757        int port = _context.getProperty(PROP_CLIENT_PORT, DEFAULT_PORT);
     
    5959    }   
    6060   
    61     public void shutdown() {
     61    public synchronized void shutdown() {
    6262        shutdown("Router shutdown");
    6363    }
     
    6767     *  @since 0.8.8
    6868     */
    69     public void shutdown(String msg) {
     69    public synchronized void shutdown(String msg) {
    7070        if (_manager != null)
    7171            _manager.shutdown(msg);
    7272    }
    7373   
    74     public void restart() {
     74    public synchronized void restart() {
    7575        if (_manager != null)
    7676            _manager.restart();
  • router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java

    rb6a5360 r259c28f  
    6666
    6767    @Override
    68     public void startup() {
     68    public synchronized void startup() {
    6969        super.startup();
    7070        _context.jobQueue().addJob(new FloodfillMonitorJob(_context, this));
     
    8888     */
    8989    @Override
    90     public void shutdown() {
     90    public synchronized void shutdown() {
    9191        if (_floodfillEnabled) {
    9292            // turn off to build a new RI...
  • router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java

    rb6a5360 r259c28f  
    199199    }
    200200   
    201     public void shutdown() {
     201    public synchronized void shutdown() {
    202202        _initialized = false;
    203203        if (_kb != null)
     
    213213    }
    214214   
    215     public void restart() {
     215    public synchronized void restart() {
    216216        _dbDir = _context.router().getConfigSetting(PROP_DB_DIR);
    217217        if (_dbDir == null) {
     
    241241    String getDbDir() { return _dbDir; }
    242242   
    243     public void startup() {
     243    public synchronized void startup() {
    244244        _log.info("Starting up the kademlia network database");
    245245        RouterInfo ri = _context.router().getRouterInfo();
  • router/java/src/net/i2p/router/peermanager/PeerManagerFacadeImpl.java

    rb6a5360 r259c28f  
    3939    }
    4040   
    41     public void startup() {
     41    public synchronized void startup() {
    4242        _log.info("Starting up the peer manager");
    4343        _manager = new PeerManager(_context);
     
    4646    }
    4747   
    48     public void shutdown() {
     48    public synchronized void shutdown() {
    4949        _log.info("Shutting down the peer manager");
    5050        _testJob.stopTesting();
     
    5555    }
    5656   
    57     public void restart() {
     57    public synchronized void restart() {
    5858        _manager.storeProfiles();
    5959        _persistenceHelper.setUs(_context.routerHash());
  • router/java/src/net/i2p/router/peermanager/PeerTestJob.java

    rb6a5360 r259c28f  
    5151   
    5252    // FIXME Exporting non-public type through public API FIXME
    53     public void startTesting(PeerManager manager) {
     53    public synchronized void startTesting(PeerManager manager) {
    5454        _manager = manager;
    5555        _keepTesting = true;
     
    5959            _log.info("Start testing peers");
    6060    }
    61     public void stopTesting() {
     61
     62    public synchronized void stopTesting() {
    6263        _keepTesting = false;
    6364        if (_log.shouldLog(Log.INFO))
  • router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java

    rb6a5360 r259c28f  
    5050    }
    5151   
    52     public void startup() {
     52    public synchronized void startup() {
    5353        _log.info("Starting up the comm system");
    5454        _manager = new TransportManager(_context);
     
    6060     *  Cannot be restarted.
    6161     */
    62     public void shutdown() {
     62    public synchronized void shutdown() {
    6363        if (_manager != null)
    6464            _manager.shutdown();
     
    6666    }
    6767   
    68     public void restart() {
     68    public synchronized void restart() {
    6969        if (_manager == null)
    7070            startup();
  • router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java

    rb6a5360 r259c28f  
    141141    public int getInboundBurstKBytesPerSecond() { return _refiller.getInboundBurstKBytesPerSecond(); }
    142142   
    143     public void reinitialize() {
     143    public synchronized void reinitialize() {
    144144        clear();
    145145        _refiller.reinitialize();
     
    147147
    148148    /** @since 0.8.8 */
    149     public void shutdown() {
     149    public synchronized void shutdown() {
    150150        _refiller.shutdown();
    151151        _refillerThread.interrupt();
  • router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java

    rb6a5360 r259c28f  
    8686
    8787    /** @since 0.8.8 */
    88     void shutdown() {
     88    synchronized void shutdown() {
    8989        _isRunning = false;
    9090    }
     
    112112    }
    113113   
    114     void reinitialize() {
     114    synchronized void reinitialize() {
    115115        _lastRefillTime = _limiter.now();
    116116        checkConfig();
  • router/java/src/net/i2p/router/transport/TransportManager.java

    rb6a5360 r259c28f  
    137137    }
    138138
    139     public void startListening() {
     139    public synchronized void startListening() {
    140140        if (_dhThread.getState() == Thread.State.NEW)
    141141            _dhThread.start();
     
    160160    }
    161161   
    162     public void restart() {
     162    public synchronized void restart() {
    163163        stopListening();
    164164        try { Thread.sleep(5*1000); } catch (InterruptedException ie) {}
     
    169169     *  Can be restarted.
    170170     */
    171     public void stopListening() {
     171    public synchronized void stopListening() {
    172172        if (_upnpManager != null)
    173173            _upnpManager.stop();
     
    183183     *  @since 0.9
    184184     */
    185     public void shutdown() {
     185    public synchronized void shutdown() {
    186186        stopListening();
    187187        _dhThread.shutdown();
  • router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java

    rb6a5360 r259c28f  
    4747    }
    4848   
    49     public void start() {
     49    public synchronized void start() {
    5050        _count = 0;
    5151        _executor = new CustomThreadPoolExecutor(THREADS);
    5252    }
    5353
    54     public void stop() {
     54    public synchronized void stop() {
    5555        if (_executor != null)
    5656            _executor.shutdownNow();
  • router/java/src/net/i2p/router/transport/ntcp/Reader.java

    rb6a5360 r259c28f  
    3737    }
    3838   
    39     public void startReading(int numReaders) {
     39    public synchronized void startReading(int numReaders) {
    4040        for (int i = 1; i <= numReaders; i++) {
    4141            Runner r = new Runner();
     
    4646    }
    4747
    48     public void stopReading() {
     48    public synchronized void stopReading() {
    4949        while (!_runners.isEmpty()) {
    5050            Runner r = _runners.remove(0);
  • router/java/src/net/i2p/router/transport/ntcp/Writer.java

    rb6a5360 r259c28f  
    3333    }
    3434   
    35     public void startWriting(int numWriters) {
     35    public synchronized void startWriting(int numWriters) {
    3636        for (int i = 1; i <=numWriters; i++) {
    3737            Runner r = new Runner();
     
    4141        }
    4242    }
    43     public void stopWriting() {
     43    public synchronized void stopWriting() {
    4444        while (!_runners.isEmpty()) {
    4545            Runner r = _runners.remove(0);
  • router/java/src/net/i2p/router/transport/udp/ACKSender.java

    rb6a5360 r259c28f  
    5454    }
    5555   
    56     public void startup() {
     56    public synchronized void startup() {
    5757        _alive = true;
    5858        _peersToACK.clear();
     
    6161    }
    6262   
    63     public void shutdown() {
     63    public synchronized void shutdown() {
    6464        _alive = false;
    6565        PeerState poison = new PeerState(_context, _transport, null, 0, null, false);
  • router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java

    rb6a5360 r259c28f  
    158158    }
    159159   
    160     public void startup() {
     160    public synchronized void startup() {
    161161        _alive = true;
    162162        I2PThread t = new I2PThread(new Establisher(), "UDP Establisher", true);
     
    164164    }
    165165
    166     public void shutdown() {
     166    public synchronized void shutdown() {
    167167        _alive = false;
    168168        notifyActivity();
  • router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java

    rb6a5360 r259c28f  
    4949    }
    5050   
    51     public void startup() {
     51    public synchronized void startup() {
    5252        _alive = true;
    5353        // may want to extend the DecayingBloomFilter so we can use a smaller
     
    5858        _messageReceiver.startup();
    5959    }
    60     public void shutdown() {
     60
     61    public synchronized void shutdown() {
    6162        _alive = false;
    6263        if (_recentlyCompletedMessages != null)
  • router/java/src/net/i2p/router/transport/udp/MessageReceiver.java

    rb6a5360 r259c28f  
    7070    }
    7171   
    72     public void startup() {
     72    public synchronized void startup() {
    7373        _alive = true;
    7474        for (int i = 0; i < _threadCount; i++) {
     
    8484    }
    8585   
    86     public void shutdown() {
     86    public synchronized void shutdown() {
    8787        _alive = false;
    8888        _completeMessages.clear();
  • router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java

    rb6a5360 r259c28f  
    9393    }
    9494
    95     public void startup() { _alive = true; }
    96 
    97     public void shutdown() {
     95    public synchronized void startup() { _alive = true; }
     96
     97    public synchronized void shutdown() {
    9898        _alive = false;
    9999        _activePeers.clear();
  • router/java/src/net/i2p/router/transport/udp/PacketHandler.java

    rb6a5360 r259c28f  
    9292    }
    9393   
    94     public void startup() {
     94    public synchronized void startup() {
    9595        _keepReading = true;
    9696        for (int i = 0; i < _handlers.length; i++) {
     
    100100    }
    101101   
    102     public void shutdown() {
     102    public synchronized void shutdown() {
    103103        _keepReading = false;
    104104    }
  • router/java/src/net/i2p/router/transport/udp/PacketPusher.java

    rb6a5360 r259c28f  
    2424    }
    2525   
    26     public void startup() {
     26    public synchronized void startup() {
    2727        _alive = true;
    2828        I2PThread t = new I2PThread(this, "UDP packet pusher", true);
     
    3030    }
    3131   
    32     public void shutdown() { _alive = false; }
     32    public synchronized void shutdown() { _alive = false; }
    3333     
    3434    public void run() {
  • router/java/src/net/i2p/router/transport/udp/UDPReceiver.java

    rb6a5360 r259c28f  
    6060    }
    6161   
    62     public void startup() {
     62    public synchronized void startup() {
    6363        //adjustDropProbability();
    6464        _keepRunning = true;
     
    6767    }
    6868   
    69     public void shutdown() {
     69    public synchronized void shutdown() {
    7070        _keepRunning = false;
    7171        _inboundQueue.clear();
  • router/java/src/net/i2p/router/transport/udp/UDPSender.java

    rb6a5360 r259c28f  
    6565    }
    6666   
    67     public void startup() {
     67    public synchronized void startup() {
    6868        if (_log.shouldLog(Log.DEBUG))
    6969            _log.debug("Starting the runner: " + _name);
     
    7373    }
    7474   
    75     public void shutdown() {
     75    public synchronized void shutdown() {
    7676        _keepRunning = false;
    7777        _outboundQueue.clear();
  • router/java/src/net/i2p/router/transport/udp/UDPTransport.java

    rb6a5360 r259c28f  
    246246    }
    247247   
    248     public void startup() {
     248    public synchronized void startup() {
    249249        _fragments.shutdown();
    250250        if (_pusher != null)
     
    374374    }
    375375   
    376     public void shutdown() {
     376    public synchronized void shutdown() {
    377377        destroyAll();
    378378        if (_endpoint != null)
  • router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java

    rb6a5360 r259c28f  
    8787     *  @since 0.9
    8888     */
    89     public void restart() {
     89    public synchronized void restart() {
    9090        synchronized (_recentBuildIds) {
    9191            _recentBuildIds.clear();
     
    9999     *  @since 0.9
    100100     */
    101     public void shutdown() {
     101    public synchronized void shutdown() {
    102102        _isRunning = false;
    103103        restart();
  • router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java

    rb6a5360 r259c28f  
    135135     *  @since 0.9
    136136     */
    137     public void shutdown(int numThreads) {
     137    public synchronized void shutdown(int numThreads) {
    138138        _isRunning = false;
    139139        _inboundBuildMessages.clear();
  • router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java

    rb6a5360 r259c28f  
    391391    }
    392392   
    393     public void restart() {
     393    public synchronized void restart() {
    394394        _handler.restart();
    395395        _executor.restart();
     
    505505    }
    506506
    507     public void startup() {
     507    public synchronized void startup() {
    508508        _isShutdown = false;
    509509        if (!_executor.isRunning()) {
     
    547547     *  Cannot be restarted
    548548     */
    549     public void shutdown() {
     549    public synchronized void shutdown() {
    550550        _handler.shutdown(_numHandlerThreads);
    551551        _executor.shutdown();
Note: See TracChangeset for help on using the changeset viewer.