EmergeManager: Do not queue duplicate block requests
authorkwolekr <kwolekr@minetest.net>
Sat, 14 Nov 2015 08:07:21 +0000 (03:07 -0500)
committerkwolekr <kwolekr@minetest.net>
Tue, 19 Jan 2016 09:18:06 +0000 (04:18 -0500)
src/emerge.cpp
src/emerge.h

index b188a7f413986e2b4022fca838836f8c1a28d1cf..ccb4c1703554341f0b87a8475514761a0a9baabe 100644 (file)
@@ -292,14 +292,18 @@ bool EmergeManager::enqueueBlockEmergeEx(
        void *callback_param)
 {
        EmergeThread *thread = NULL;
+       bool entry_already_exists = false;
 
        {
                MutexAutoLock queuelock(m_queue_mutex);
 
                if (!pushBlockEmergeData(blockpos, peer_id, flags,
-                               callback, callback_param))
+                               callback, callback_param, &entry_already_exists))
                        return false;
 
+               if (entry_already_exists)
+                       return true;
+
                thread = getOptimalThread();
                thread->pushBlock(blockpos);
        }
@@ -382,7 +386,8 @@ bool EmergeManager::pushBlockEmergeData(
        u16 peer_requested,
        u16 flags,
        EmergeCompletionCallback callback,
-       void *callback_param)
+       void *callback_param,
+       bool *entry_already_exists)
 {
        u16 &count_peer = m_peer_queue_count[peer_requested];
 
@@ -402,12 +407,12 @@ bool EmergeManager::pushBlockEmergeData(
        findres = m_blocks_enqueued.insert(std::make_pair(pos, BlockEmergeData()));
 
        BlockEmergeData &bedata = findres.first->second;
-       bool update_existing    = !findres.second;
+       *entry_already_exists   = !findres.second;
 
        if (callback)
                bedata.callbacks.push_back(std::make_pair(callback, callback_param));
 
-       if (update_existing) {
+       if (*entry_already_exists) {
                bedata.flags |= flags;
        } else {
                bedata.flags = flags;
index a143b660ff3646a6127234cdab9da38f2dd74cf0..02bdf7e672de1bfc4ef58e41dd3f8df5f3bf3aad 100644 (file)
@@ -159,8 +159,15 @@ private:
 
        // Requires m_queue_mutex held
        EmergeThread *getOptimalThread();
-       bool pushBlockEmergeData(v3s16 pos, u16 peer_requested, u16 flags,
-               EmergeCompletionCallback callback, void *callback_param);
+
+       bool pushBlockEmergeData(
+               v3s16 pos,
+               u16 peer_requested,
+               u16 flags,
+               EmergeCompletionCallback callback,
+               void *callback_param,
+               bool *entry_already_exists);
+
        bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata);
 
        friend class EmergeThread;