Bug: http://projects.puppetlabs.com/issues/12723
Bug-Ubuntu: https://launchpad.net/bugs/986973
Origin: https://github.com/puppetlabs/facter/commit/9ff4453b2f0843df887ae1ec2098a4336291df0c
Last-Update: 2013-07-02
From: Timur Batyrshin <timur.batyrshin@flathost.ru>
Date: Mon, 20 Feb 2012 16:16:07 +0400
Subject: [PATCH] Removed exclusive threading

I've experienced regular facter freezes on puppet apply.
Tracing back the freezes showed that they were produced by exclusive threads.
After I've removed the exclusive thread wrapper the facter stopped freezing.

(FYI those were introduced by https://github.com/puppetlabs/facter/commit/c2aa5086ab55da9c708d962b84a1b85404fc6329)

Note: there is a similar code in facter/processor.rb for Windows. I've left
that intact as I don't quite understand the ways Windows works.
---
 lib/facter/util/memory.rb    | 22 +++++-------
 lib/facter/util/processor.rb | 84 +++++++++++++++++++-------------------------
 2 files changed, 46 insertions(+), 60 deletions(-)

--- a/lib/facter/util/memory.rb
+++ b/lib/facter/util/memory.rb
@@ -3,23 +3,19 @@
 ##
 
 module Facter::Memory
-  require 'thread'
-
   def self.meminfo_number(tag)
     memsize = ""
-    Thread::exclusive do
-      size, scale = [0, ""]
-      File.readlines("/proc/meminfo").each do |l|
-        size, scale = [$1.to_f, $2] if l =~ /^#{tag}:\s+(\d+)\s+(\S+)/
-        # MemoryFree == memfree + cached + buffers
-        #  (assume scales are all the same as memfree)
-        if tag == "MemFree" &&
-          l =~ /^(?:Buffers|Cached):\s+(\d+)\s+(?:\S+)/
-          size += $1.to_f
-        end
+    size, scale = [0, ""]
+    File.readlines("/proc/meminfo").each do |l|
+      size, scale = [$1.to_f, $2] if l =~ /^#{tag}:\s+(\d+)\s+(\S+)/
+      # MemoryFree == memfree + cached + buffers
+      #  (assume scales are all the same as memfree)
+      if tag == "MemFree" &&
+        l =~ /^(?:Buffers|Cached):\s+(\d+)\s+(?:\S+)/
+        size += $1.to_f
       end
-      memsize = scale_number(size, scale)
     end
+    memsize = scale_number(size, scale)
 
     memsize
   end
--- a/lib/facter/util/processor.rb
+++ b/lib/facter/util/processor.rb
@@ -8,55 +8,47 @@
       model = Facter.value(:architecture)
       case model
       when "x86_64", "amd64", "i386", /parisc/, "hppa", "ia64"
-        Thread::exclusive do
-          File.readlines(cpuinfo).each do |l|
-            if l =~ /processor\s+:\s+(\d+)/
-              processor_num = $1.to_i
-            elsif l =~ /model name\s+:\s+(.*)\s*$/
-              processor_list[processor_num] = $1 unless processor_num == -1
-              processor_num = -1
-            elsif l =~ /processor\s+(\d+):\s+(.*)/
-              processor_num = $1.to_i
-              processor_list[processor_num] = $2 unless processor_num == -1
-            end
+        File.readlines(cpuinfo).each do |l|
+          if l =~ /processor\s+:\s+(\d+)/
+            processor_num = $1.to_i
+          elsif l =~ /model name\s+:\s+(.*)\s*$/
+            processor_list[processor_num] = $1 unless processor_num == -1
+            processor_num = -1
+          elsif l =~ /processor\s+(\d+):\s+(.*)/
+            processor_num = $1.to_i
+            processor_list[processor_num] = $2 unless processor_num == -1
           end
         end
 
       when "ppc64"
-        Thread::exclusive do
-          File.readlines(cpuinfo).each do |l|
-            if l =~ /processor\s+:\s+(\d+)/
-              processor_num = $1.to_i
-            elsif l =~ /cpu\s+:\s+(.*)\s*$/
-              processor_list[processor_num] = $1 unless processor_num == -1
-              processor_num = -1
-            end
+        File.readlines(cpuinfo).each do |l|
+          if l =~ /processor\s+:\s+(\d+)/
+            processor_num = $1.to_i
+          elsif l =~ /cpu\s+:\s+(.*)\s*$/
+            processor_list[processor_num] = $1 unless processor_num == -1
+            processor_num = -1
           end
         end
 
       when /arm/
-        Thread::exclusive do
-          File.readlines(cpuinfo).each do |l|
-            if l =~ /Processor\s+:\s+(.+)/
+        File.readlines(cpuinfo).each do |l|
+          if l =~ /Processor\s+:\s+(.+)/
+            processor_num += 1
+            processor_list[processor_num] = $1.chomp
+          elsif l =~ /processor\s+:\s+(\d+)\s*$/
+            proc_num = $1.to_i
+            if proc_num != 0
               processor_num += 1
-              processor_list[processor_num] = $1.chomp
-            elsif l =~ /processor\s+:\s+(\d+)\s*$/
-              proc_num = $1.to_i
-              if proc_num != 0
-                processor_num += 1
-                processor_list[processor_num] = processor_list[processor_num-1]
-              end
+              processor_list[processor_num] = processor_list[processor_num-1]
             end
           end
         end
 
       when /sparc/
-        Thread::exclusive do
-          File.readlines(cpuinfo).each do |l|
-            if l =~ /cpu\s+:\s+(.*)\s*$/
-              processor_num += 1
-              processor_list[processor_num] = $1
-            end
+        File.readlines(cpuinfo).each do |l|
+          if l =~ /cpu\s+:\s+(.*)\s*$/
+            processor_num += 1
+            processor_list[processor_num] = $1
           end
         end
       end
@@ -67,18 +59,16 @@
   def self.enum_lsdev
     processor_num = -1
     processor_list = {}
-    Thread::exclusive do
-      procs = Facter::Util::Resolution.exec('lsdev -Cc processor')
-      if procs
-        procs.each_line do |proc|
-          if proc =~ /^proc(\d+)/
-            processor_num = $1.to_i
-            # Not retrieving the frequency since AIX 4.3.3 doesn't support the
-            # attribute and some people still use the OS.
-            proctype = Facter::Util::Resolution.exec('lsattr -El proc0 -a type')
-            if proctype =~ /^type\s+(\S+)\s+/
-              processor_list[processor_num] = $1
-            end
+    procs = Facter::Util::Resolution.exec('lsdev -Cc processor')
+    if procs
+      procs.each_line do |proc|
+        if proc =~ /^proc(\d+)/
+          processor_num = $1.to_i
+          # Not retrieving the frequency since AIX 4.3.3 doesn't support the
+          # attribute and some people still use the OS.
+          proctype = Facter::Util::Resolution.exec('lsattr -El proc0 -a type')
+          if proctype =~ /^type\s+(\S+)\s+/
+            processor_list[processor_num] = $1
           end
         end
       end
