Synchronize message is a critical section

pull/161/head
M66B 6 years ago
parent 52bef544bb
commit 1e654c3490

@ -77,6 +77,8 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
@ -111,6 +113,7 @@ import static androidx.core.app.NotificationCompat.DEFAULT_SOUND;
class Core {
private static int lastUnseen = -1;
private static ConcurrentMap<Long, Long> lockFolders = new ConcurrentHashMap<>();
private static final int MAX_NOTIFICATION_COUNT = 10; // per group
private static final int SYNC_CHUNCK_SIZE = 200;
@ -1369,6 +1372,8 @@ class Core {
IMAPFolder ifolder, IMAPMessage imessage,
boolean browsed, boolean download,
List<EntityRule> rules, State state) throws MessagingException, IOException {
lockFolders.putIfAbsent(folder.id, folder.id);
synchronized (lockFolders.get(folder.id)) {
long uid = ifolder.getUID(imessage);
if (imessage.isExpunged()) {
@ -1528,13 +1533,6 @@ class Core {
try {
db.beginTransaction();
// Check if message was added in the meantime
EntityMessage existing = db.message().getMessageByUid(message.folder, message.uid);
if (existing != null) {
Log.i("Message was already added");
return existing;
}
message.id = db.message().insertMessage(message);
Log.i(folder.name + " added id=" + message.id + " uid=" + message.uid);
@ -1696,6 +1694,7 @@ class Core {
return message;
}
}
private static EntityIdentity matchIdentity(Context context, EntityFolder folder, EntityMessage message) {
DB db = DB.getInstance(context);

Loading…
Cancel
Save