Changeset daf7e86


Ignore:
Timestamp:
Feb 9, 2018 5:05:32 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
afad22a8
Parents:
768921b
Message:

SusiMail?: Thread the loading from disk

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • apps/susimail/src/src/i2p/susi/webmail/PersistentMailCache.java

    r768921b rdaf7e86  
    1919import java.util.ArrayList;
    2020import java.util.Collection;
     21import java.util.Collections;
    2122import java.util.Hashtable;
    2223import java.util.List;
    2324import java.util.Locale;
     25import java.util.Queue;
    2426import java.util.concurrent.ConcurrentHashMap;
     27import java.util.concurrent.LinkedBlockingQueue;
    2528import java.util.zip.GZIPInputStream;
    2629import java.util.zip.GZIPOutputStream;
     
    2932import net.i2p.data.Base64;
    3033import net.i2p.data.DataHelper;
     34import net.i2p.util.I2PAppThread;
    3135import net.i2p.util.PasswordManager;
    3236import net.i2p.util.SecureDirectory;
    3337import net.i2p.util.SecureFile;
    3438import net.i2p.util.SecureFileOutputStream;
     39import net.i2p.util.SystemVersion;
    3540
    3641
     
    108113
    109114        private Collection<Mail> locked_getMails() {
    110                 List<Mail> rv = new ArrayList<Mail>();
     115                Queue<File> fq = new LinkedBlockingQueue<File>();
    111116                for (int j = 0; j < B64.length(); j++) {
    112117                        File subdir = new File(_cacheDir, DIR_PREFIX + B64.charAt(j));
     
    118123                                if (!f.isFile())
    119124                                        continue;
     125                                // Threaded, handle below
     126                                //Mail mail = load(f);
     127                                //if (mail != null)
     128                                //       rv.add(mail);
     129                                fq.offer(f);
     130                        }
     131                }
     132                int sz = fq.size();
     133                if (sz <= 0)
     134                        return Collections.emptyList();
     135               
     136                // thread the read-in
     137                long begin = _context.clock().now();
     138                Queue<Mail> rv = new LinkedBlockingQueue<Mail>();
     139                int tcnt = Math.max(1, Math.min(sz / 4, Math.min(SystemVersion.getCores(), 16)));
     140                List<Thread> threads = new ArrayList<Thread>(tcnt);
     141                for (int i = 0; i < tcnt; i++) {
     142                        Thread t = new I2PAppThread(new Loader(fq, rv), "Email loader " + i);
     143                        t.start();
     144                        threads.add(t);
     145                }
     146                for (int i = 0; i < tcnt; i++) {
     147                        try {
     148                                threads.get(i).join();
     149                        } catch (InterruptedException ie) {
     150                                break;
     151                        }
     152                }
     153                long end = _context.clock().now();
     154                Debug.debug(Debug.DEBUG, "Loaded " + sz + " emails with " + tcnt + " threads in " + DataHelper.formatDuration(end - begin));
     155                return rv;
     156        }
     157
     158        /**
     159         * Load files from in, add mail to out
     160         * @since 0.9.34
     161         */
     162        private class Loader implements Runnable {
     163                private final Queue<File> _in;
     164                private final Queue<Mail> _out;
     165
     166                public Loader(Queue<File> in, Queue<Mail> out) {
     167                        _in = in; _out = out;
     168                }
     169
     170                public void run() {
     171                        File f;
     172                        while ((f = _in.poll()) != null) {
    120173                                Mail mail = load(f);
    121174                                if (mail != null)
    122                                        rv.add(mail);
     175                                        _out.offer(mail);
    123176                        }
    124177                }
    125                 return rv;
    126         }
     178        }
     179
    127180
    128181        /**
  • core/java/src/net/i2p/util/SystemVersion.java

    r768921b rdaf7e86  
    271271
    272272    /**
     273     *  Runtime.getRuntime().availableProcssors()
     274     *  @return never smaller than 1
     275     *  @since 0.9.34
     276     */
     277    public static int getCores() {
     278        return Runtime.getRuntime().availableProcessors();
     279    }
     280
     281    /**
    273282     *  The system's time zone, which is probably different from the
    274283     *  JVM time zone, because Router changes the JVM default to GMT.
     
    314323        System.out.println("Apache   : " + isApache());
    315324        System.out.println("ARM      : " + isARM());
     325        System.out.println("Cores    : " + getCores());
    316326        System.out.println("Gentoo   : " + isGentoo());
    317327        System.out.println("GNU      : " + isGNU());
Note: See TracChangeset for help on using the changeset viewer.