From: Bernhard M. Wiedemann <[email-masked]>

avoid a race where some processes try to use a partial cache file
that is still being written to.
Note that we release the lock before load_cache,
because if we got the lock, the cache is already completely written
and it is OK to have multiple parallel readers

Index: intltool-0.51.0/intltool-merge.in
===================================================================
--- intltool-merge.in
+++ intltool-merge.in
@@ -43,6 +43,7 @@ use Getopt::Long;
 use Text::Wrap;
 use File::Basename;
 use Encode;
+use Fcntl qw(:flock);
 
 my $must_end_tag      = -1;
 my $last_depth        = -1;
@@ -392,11 +393,14 @@ sub load_cache
 
 sub get_cached_translation_database
 {
+    open(my $lockfh, ">", "$cache_file.lock") or die $!;
+    flock($lockfh, LOCK_EX) or die "Could not lock '$cache_file.lock' - $!";
     my $cache_file_age = -M $cache_file;
     if (defined $cache_file_age) 
     {
         if ($cache_file_age <= &get_newest_po_age) 
         {
+            close($lockfh);
             &load_cache;
             return;
         }
@@ -404,6 +408,7 @@ sub get_cached_translation_database
     }
 
     &create_cache;
+    close($lockfh);
 }
 
 sub add_translation