Changeset 5860

Show
Ignore:
Timestamp:
01/30/08 10:44:54 (5 years ago)
Author:
cho45
Message:

lang/ruby/net-irc/trunk/lib/net/irc.rb,
lang/ruby/net-irc/trunk/spec/net-irc_spec.rb:

Synchronize @channels between threads surely.

Location:
lang/ruby/net-irc/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lang/ruby/net-irc/trunk/lib/net/irc.rb

    r5849 r5860  
    55require "thread" 
    66require "logger" 
     7require "monitor" 
    78 
    89module Net; end 
     
    450451#                       } 
    451452                } 
     453                @channels.extend(MonitorMixin) 
    452454        end 
    453455 
     
    510512                init_channel(channel) 
    511513 
    512                 m[3].split(/\s+/).each do |u| 
    513                         _, mode, nick = *u.match(/^([@+]?)(.+)/) 
    514  
    515                         @channels[channel][:users] << nick 
    516                         @channels[channel][:users].uniq! 
    517  
    518                         case mode 
    519                         when "@" # channel operator 
    520                                 @channels[channel][:modes] << ["o", nick] 
    521                         when "+" # voiced (under moderating mode) 
    522                                 @channels[channel][:modes] << ["v", nick] 
    523                         end 
    524                 end 
    525  
    526                 case type 
    527                 when "@" # secret 
    528                         @channels[channel][:modes] << ["s", nil] 
    529                 when "*" # private 
    530                         @channels[channel][:modes] << ["p", nil] 
    531                 when "=" # public 
    532                 end 
    533  
    534                 @channels[channel][:modes].uniq! 
     514                @channels.synchronize do 
     515                        m[3].split(/\s+/).each do |u| 
     516                                _, mode, nick = *u.match(/^([@+]?)(.+)/) 
     517 
     518                                @channels[channel][:users] << nick 
     519                                @channels[channel][:users].uniq! 
     520 
     521                                case mode 
     522                                when "@" # channel operator 
     523                                        @channels[channel][:modes] << ["o", nick] 
     524                                when "+" # voiced (under moderating mode) 
     525                                        @channels[channel][:modes] << ["v", nick] 
     526                                end 
     527                        end 
     528 
     529                        case type 
     530                        when "@" # secret 
     531                                @channels[channel][:modes] << ["s", nil] 
     532                        when "*" # private 
     533                                @channels[channel][:modes] << ["p", nil] 
     534                        when "=" # public 
     535                        end 
     536 
     537                        @channels[channel][:modes].uniq! 
     538                end 
    535539        end 
    536540 
     
    541545                init_channel(channel) 
    542546 
    543                 info = @channels[channel] 
    544                 if info 
    545                         info[:users].delete(nick) 
    546                         info[:modes].delete_if {|u| 
    547                                 u[1] == nick 
    548                         } 
     547                @channels.synchronize do 
     548                        info = @channels[channel] 
     549                        if info 
     550                                info[:users].delete(nick) 
     551                                info[:modes].delete_if {|u| 
     552                                        u[1] == nick 
     553                                } 
     554                        end 
    549555                end 
    550556        end 
     
    554560                nick = m.prefix.nick 
    555561 
    556                 @channels.each do |channel, info| 
    557                         info[:users].delete(nick) 
    558                         info[:modes].delete_if {|u| 
    559                                 u[1] == nick 
    560                         } 
     562                @channels.synchronize do 
     563                        @channels.each do |channel, info| 
     564                                info[:users].delete(nick) 
     565                                info[:modes].delete_if {|u| 
     566                                        u[1] == nick 
     567                                } 
     568                        end 
    561569                end 
    562570        end 
     
    565573        def on_kick(m) 
    566574                users = m[1].split(/,/) 
    567                 m[0].split(/,/).each do |chan| 
    568                         init_channel(chan) 
    569                         info = @channels[chan] 
    570                         if info 
    571                                 users.each do |nick| 
    572                                         info[:users].delete(nick) 
    573                                         info[:modes].delete_if {|u| 
    574                                                 u[1] == nick 
    575                                         } 
     575 
     576                @channels.synchronize do 
     577                        m[0].split(/,/).each do |chan| 
     578                                init_channel(chan) 
     579                                info = @channels[chan] 
     580                                if info 
     581                                        users.each do |nick| 
     582                                                info[:users].delete(nick) 
     583                                                info[:modes].delete_if {|u| 
     584                                                        u[1] == nick 
     585                                                } 
     586                                        end 
    576587                                end 
    577588                        end 
     
    583594                nick    = m.prefix.nick 
    584595                channel = m[0] 
    585                 init_channel(channel) 
    586  
    587                 @channels[channel][:users] << nick 
    588                 @channels[channel][:users].uniq! 
     596 
     597                @channels.synchronize do 
     598                        init_channel(channel) 
     599 
     600                        @channels[channel][:users] << nick 
     601                        @channels[channel][:users].uniq! 
     602                end 
    589603        end 
    590604 
     
    592606        def on_mode(m) 
    593607                channel = m[0] 
    594                 init_channel(channel) 
    595  
    596                 positive_mode = [] 
    597                 negative_mode = [] 
    598  
    599                 mode = positive_mode 
    600                 arg_pos = 0 
    601                 m[1].each_byte do |c| 
    602                         case c 
    603                         when ?+ 
    604                                 mode = positive_mode 
    605                         when ?- 
    606                                 mode = negative_mode 
    607                         when ?o, ?v, ?k, ?l, ?b, ?e, ?I 
    608                                 mode << [c.chr, m[arg_pos + 2]] 
    609                                 arg_pos += 1 
    610                         else 
    611                                 mode << [c.chr, nil] 
    612                         end 
    613                 end 
    614                 mode = nil 
    615  
    616                 negative_mode.each do |m| 
    617                         @channels[channel][:modes].delete(m) 
    618                 end 
    619  
    620                 positive_mode.each do |m| 
    621                         @channels[channel][:modes] << m 
    622                 end 
    623  
    624                 @channels[channel][:modes].uniq! 
    625                 [negative_mode, positive_mode] 
     608                @channels.synchronize do 
     609                        init_channel(channel) 
     610 
     611                        positive_mode = [] 
     612                        negative_mode = [] 
     613 
     614                        mode = positive_mode 
     615                        arg_pos = 0 
     616                        m[1].each_byte do |c| 
     617                                case c 
     618                                when ?+ 
     619                                        mode = positive_mode 
     620                                when ?- 
     621                                        mode = negative_mode 
     622                                when ?o, ?v, ?k, ?l, ?b, ?e, ?I 
     623                                        mode << [c.chr, m[arg_pos + 2]] 
     624                                        arg_pos += 1 
     625                                else 
     626                                        mode << [c.chr, nil] 
     627                                end 
     628                        end 
     629                        mode = nil 
     630 
     631                        negative_mode.each do |m| 
     632                                @channels[channel][:modes].delete(m) 
     633                        end 
     634 
     635                        positive_mode.each do |m| 
     636                                @channels[channel][:modes] << m 
     637                        end 
     638 
     639                        @channels[channel][:modes].uniq! 
     640                        [negative_mode, positive_mode] 
     641                end 
    626642        end 
    627643 
  • lang/ruby/net-irc/trunk/spec/net-irc_spec.rb

    r5859 r5860  
    222222                        @server.start 
    223223                end 
     224 
     225                true until @server.instance_variable_get(:@serv) 
    224226 
    225227                @port = @server.instance_variable_get(:@serv).addr[1]