public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
Maintain a seperate buffer for each thread
josh (author)
Mon Aug 18 21:33:46 -0700 2008
commit  96ab01e8f2b5a4475453acf60f9cf9bd8cd98483
tree    6bf2233365025492b6ec20bd74dd95f287fe3c5e
parent  c1a8690d582c08777055caf449c03f85b4c8aa4b
...
33
34
35
36
37
38
39
40
 
41
42
43
...
60
61
62
63
64
65
 
66
67
68
...
96
97
98
99
100
 
 
101
102
103
...
113
114
115
 
 
 
 
 
 
 
 
116
117
...
33
34
35
 
36
37
38
 
39
40
41
42
...
59
60
61
 
 
 
62
63
64
65
...
93
94
95
 
 
96
97
98
99
100
...
110
111
112
113
114
115
116
117
118
119
120
121
122
0
@@ -33,11 +33,10 @@ module ActiveSupport
0
 
0
     attr_accessor :level
0
     attr_reader :auto_flushing
0
-    attr_reader :buffer
0
 
0
     def initialize(log, level = DEBUG)
0
       @level         = level
0
-      @buffer        = []
0
+      @buffer        = {}
0
       @auto_flushing = 1
0
       @guard = Mutex.new
0
 
0
@@ -60,9 +59,7 @@ module ActiveSupport
0
       # If a newline is necessary then create a new message ending with a newline.
0
       # Ensures that the original message is not mutated.
0
       message = "#{message}\n" unless message[-1] == ?\n
0
-      @guard.synchronize do
0
-        buffer << message
0
-      end
0
+      buffer << message
0
       auto_flush
0
       message
0
     end
0
@@ -96,8 +93,8 @@ module ActiveSupport
0
     def flush
0
       @guard.synchronize do
0
         unless buffer.empty?
0
-          old_buffer    = @buffer
0
-          @buffer       = []
0
+          old_buffer = buffer
0
+          clear_buffer
0
           @log.write(old_buffer.join)
0
         end
0
       end
0
@@ -113,5 +110,13 @@ module ActiveSupport
0
       def auto_flush
0
         flush if buffer.size >= @auto_flushing
0
       end
0
+
0
+      def buffer
0
+        @buffer[Thread.current] ||= []
0
+      end
0
+
0
+      def clear_buffer
0
+        @buffer[Thread.current] = []
0
+      end
0
   end
0
 end
...
70
71
72
73
 
74
75
76
...
83
84
85
86
 
87
88
89
 
90
91
92
...
105
106
107
108
 
109
110
111
...
115
116
117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
...
70
71
72
 
73
74
75
76
...
83
84
85
 
86
87
88
 
89
90
91
92
...
105
106
107
 
108
109
110
111
...
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
0
@@ -70,7 +70,7 @@ class BufferedLoggerTest < Test::Unit::TestCase
0
       end
0
 
0
       @logger.flush
0
-      assert !@output.string.empty?, @logger.buffer.size
0
+      assert !@output.string.empty?, @logger.send(:buffer).size
0
     end
0
 
0
     define_method "test_disabling_auto_flush_with_#{disable.inspect}_should_flush_at_max_buffer_size_as_failsafe" do
0
@@ -83,10 +83,10 @@ class BufferedLoggerTest < Test::Unit::TestCase
0
       end
0
 
0
       @logger.info 'there it is.'
0
-      assert !@output.string.empty?, @logger.buffer.size
0
+      assert !@output.string.empty?, @logger.send(:buffer).size
0
     end
0
   end
0
-  
0
+
0
   def test_should_know_if_its_loglevel_is_below_a_given_level
0
     ActiveSupport::BufferedLogger::Severity.constants.each do |level|
0
       @logger.level = ActiveSupport::BufferedLogger::Severity.const_get(level) - 1
0
@@ -105,7 +105,7 @@ class BufferedLoggerTest < Test::Unit::TestCase
0
     @logger.info 'there it is.'
0
     assert !@output.string.empty?, @output.string
0
   end
0
-  
0
+
0
   def test_should_create_the_log_directory_if_it_doesnt_exist
0
     tmp_directory = File.join(File.dirname(__FILE__), "tmp")
0
     log_file = File.join(tmp_directory, "development.log")
0
@@ -115,4 +115,25 @@ class BufferedLoggerTest < Test::Unit::TestCase
0
   ensure
0
     FileUtils.rm_rf(tmp_directory)
0
   end
0
+
0
+  def test_logger_should_maintain_separate_buffers_for_each_thread
0
+    @logger.auto_flushing = false
0
+
0
+    a = Thread.new do
0
+      @logger.info("a"); Thread.pass;
0
+      @logger.info("b"); Thread.pass;
0
+      @logger.info("c"); @logger.flush
0
+    end
0
+
0
+    b = Thread.new do
0
+      @logger.info("x"); Thread.pass;
0
+      @logger.info("y"); Thread.pass;
0
+      @logger.info("z"); @logger.flush
0
+    end
0
+
0
+    a.join
0
+    b.join
0
+
0
+    assert_equal "a\nb\nc\nx\ny\nz\n", @output.string
0
+  end
0
 end

Comments