diff options
author | Toshiaki Asai <toshi.alternative@gmail.com> | 2013-06-02 17:39:31 +0900 |
---|---|---|
committer | Toshiaki Asai <toshi.alternative@gmail.com> | 2013-06-02 18:23:49 +0900 |
commit | abbacd892ad50228a49311a2875881cbe24ee047 (patch) | |
tree | e5864d9491f7709fa2f9f3a3c3504f12fac66dec | |
parent | f6f15b575e83328561d6410da3b267572ca52aa4 (diff) | |
download | mikutter-abbacd892ad50228a49311a2875881cbe24ee047.tar.gz |
Delayerを削除。Delayer gemを使うように変更した
-rw-r--r-- | Gemfile | 1 | ||||
-rw-r--r-- | core/boot/delayer.rb | 11 | ||||
-rw-r--r-- | core/delayer.rb | 134 | ||||
-rw-r--r-- | core/event.rb | 5 | ||||
-rw-r--r-- | core/lib/deferred/deferred.rb | 4 | ||||
-rw-r--r-- | core/lib/deferred/test.deferred.rb | 3 | ||||
-rw-r--r-- | core/lib/mikutwitter/test/test_api_call_support.rb | 3 | ||||
-rw-r--r-- | core/lib/mikutwitter/test/test_api_shortcuts.rb | 4 | ||||
-rw-r--r-- | core/miquire.rb | 6 | ||||
-rw-r--r-- | core/mui/gtk_postbox.rb | 3 | ||||
-rw-r--r-- | core/plugin.rb | 4 | ||||
-rw-r--r-- | core/plugin/gtk/delayer.rb | 44 | ||||
-rw-r--r-- | core/plugin/openimg/openimg.rb | 27 | ||||
-rw-r--r-- | core/serialthread.rb | 2 | ||||
-rw-r--r-- | core/service.rb | 4 | ||||
-rwxr-xr-x | mikutter.rb | 2 | ||||
-rw-r--r-- | test/core/test_event.rb | 6 | ||||
-rw-r--r-- | test/core/test_web_image_loader.rb | 4 | ||||
-rw-r--r-- | test/helper.rb | 3 |
19 files changed, 67 insertions, 203 deletions
@@ -8,6 +8,7 @@ group :default do gem 'memoize' gem 'ruby-hmac' gem 'typed-array' + gem 'delayer' end group :test do diff --git a/core/boot/delayer.rb b/core/boot/delayer.rb new file mode 100644 index 00000000..506b12cb --- /dev/null +++ b/core/boot/delayer.rb @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +miquire :lib, "delayer" + +Delayer.default = Delayer.generate_class(priority: [:ui_response, + :routine_active, + :ui_passive, + :routine_passive], + default: :routine_passive, + expire: 0.02) + diff --git a/core/delayer.rb b/core/delayer.rb deleted file mode 100644 index 85abd633..00000000 --- a/core/delayer.rb +++ /dev/null @@ -1,134 +0,0 @@ -# -*- coding: utf-8 -*- -require File.expand_path(File.dirname(__FILE__)+'/utils') - -# ブロックを、後で時間があいたときに順次実行する。 -# 名前deferのほうがよかったんじゃね -class Delayer - # ユーザのUI入力に対するレスポンスのプライオリティ。 - # 何が何でもこれを最優先にする。 - UI_RESPONSE = 0 - - # ユーザの入力によって行われる内部処理。 - ROUTINE_ACTIVE = 1 - - # Twitterからのレスポンスなど、外的要因によるUIの更新。 - UI_PASSIVE = 2 - - # 外的要因によって発生した内部処理。 - ROUTINE_PASSIVE = 3 - - # OBSOLETE - CRITICAL = 0 - FASTER = 0 - NORMAL = 1 - LATER = 2 - LAST = 2 - - extend MonitorMixin - @@routines = [[],[],[],[]] - @frozen = false - - attr_reader :backtrace, :status - - class << self - attr_accessor :exception - - # 登録されたDelayerオブジェクトをいくつか実行する。 - # 0.1秒以内に実行が終わらなければ、残りは保留してとりあえず処理を戻す。 - def run - return if @frozen - debugging_wait - begin - @busy = true - @st = Process.times.utime - @@routines.size.times{ |cnt| - procs = [] - if not @@routines[cnt].empty? then - procs = @@routines[cnt].clone - procs.each{ |routine| - @@routines[cnt].delete(routine) - if Mopt.debug - r_start = Process.times.utime - routine.run - if (r_end = Process.times.utime - r_start) > 0.1 - bt = routine.backtrace.find{ |bt| not bt.include?('delayer') } - bt = routine.backtrace.first if not bt - Plugin.call(:processtime, :delayer, "#{"%.2f" % r_end},#{bt.gsub(FOLLOW_DIR, '{MIKUTTER_DIR}')}") - end - else - routine.run end - return if time_limit? } end } - rescue => e - Delayer.exception = e - raise e - ensure - @busy = false end end - - - def time_limit? - (Process.times.utime - @st) > 0.02 end - - # Delayerのタスクを消化中ならtrueを返す - def busy? - @busy end - - # 仕事がなければtrue - def empty? - @@routines.all?{|r| r.empty? } end - - # 残っているDelayerの数を返す - def size - @@routines.map(&:size).reduce(:+)end - - # このメソッドが呼ばれたら、以後 Delayer.run が呼ばれても、Delayerオブジェクト - # を実行せずにすぐにreturnするようになる。 - def freeze - @frozen = true end - - # freezeのはんたい - def melt - @frozen = false end - - def on_regist(delayer) - end end - - # あとで実行するブロックを登録する。 - def initialize(prio = NORMAL, *args, &block) - @routine = block - @args = args - @backtrace = caller - @status = :wait - regist(prio) - Delayer.on_regist(self) - end - - # このDelayerを取り消す。処理が呼ばれる前に呼べば、処理をキャンセルできる - def reject - @status = nil - end - - # このブロックを実行する。内部で呼ぶためにあるので、明示的に呼ばないこと - def run - return if @status != :wait - @status = :run - begin - @routine.call(*@args) - rescue Exception => e - now = caller.size + 1 # @routine.callのぶんスタックが1つ多い - $@ = e.backtrace[0, e.backtrace.size - now] + @backtrace - raise e - end - @routine = nil - @status = nil - end - - private - def regist(prio) - self.class.synchronize{ - @@routines[prio] << self - } - Thread.main.wakeup - end - -end - diff --git a/core/event.rb b/core/event.rb index 0cac4b74..1cccebdc 100644 --- a/core/event.rb +++ b/core/event.rb @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- require 'observer' -miquire :core, "delayer" -miquire :lib, "instance_storage" +miquire :lib, "instance_storage", "delayer" # イベントの定義。イベントの種類を識別するためのオブジェクト。 class Event @@ -26,7 +25,7 @@ class Event if @options.has_key? :priority @options[:priority] else - Delayer::ROUTINE_PASSIVE end end + :routine_passive end end # イベントを引数 _args_ で発生させる # ==== Args diff --git a/core/lib/deferred/deferred.rb b/core/lib/deferred/deferred.rb index 64c9eab4..453c9bbe 100644 --- a/core/lib/deferred/deferred.rb +++ b/core/lib/deferred/deferred.rb @@ -94,7 +94,7 @@ module Enumerable while not iteratee.empty? item = iteratee.shift proc.call(item) - if Delayer.time_limit? + if Delayer.expire? break result = iteratee.deach(&proc) end end result } end @@ -103,3 +103,5 @@ end def deferred(&proc) Deferred.new.next(&proc) end # ~> -:4: uninitialized constant Deferred::Deferredable (NameError) + + diff --git a/core/lib/deferred/test.deferred.rb b/core/lib/deferred/test.deferred.rb index 451fcc63..d57681ca 100644 --- a/core/lib/deferred/test.deferred.rb +++ b/core/lib/deferred/test.deferred.rb @@ -25,8 +25,7 @@ $LOAD_PATH.push(File.expand_path(File.join(File.dirname($0), '../..'))) require 'test/unit' require 'utils' -miquire :core, 'delayer' -miquire :lib, 'deferred', 'test_unit_extensions' +miquire :lib, 'delayer', 'deferred', 'test_unit_extensions' class TC_Deferred < Test::Unit::TestCase def setup() diff --git a/core/lib/mikutwitter/test/test_api_call_support.rb b/core/lib/mikutwitter/test/test_api_call_support.rb index f998a388..1255c22b 100644 --- a/core/lib/mikutwitter/test/test_api_call_support.rb +++ b/core/lib/mikutwitter/test/test_api_call_support.rb @@ -6,8 +6,7 @@ require 'webmock/test_unit' require 'pp' require 'utils' -miquire :lib, 'test_unit_extensions', 'mikutwitter' -miquire :core, 'delayer' +miquire :lib, 'delayer', 'test_unit_extensions', 'mikutwitter' class Plugin def self.call(*args); end end diff --git a/core/lib/mikutwitter/test/test_api_shortcuts.rb b/core/lib/mikutwitter/test/test_api_shortcuts.rb index 776d54c5..dc189d20 100644 --- a/core/lib/mikutwitter/test/test_api_shortcuts.rb +++ b/core/lib/mikutwitter/test/test_api_shortcuts.rb @@ -6,8 +6,8 @@ require 'mocha' require 'webmock/test_unit' require 'pp' require 'utils' -miquire :lib, 'test_unit_extensions', 'mikutwitter' -miquire :core, 'delayer', 'message', 'user', 'userlist' +miquire :lib, 'delayer', 'test_unit_extensions', 'mikutwitter' +miquire :core, 'message', 'user', 'userlist' class Plugin def self.call(*args); end end diff --git a/core/miquire.rb b/core/miquire.rb index 3740eea6..90c62ae0 100644 --- a/core/miquire.rb +++ b/core/miquire.rb @@ -4,9 +4,9 @@ require 'set' $LOAD_PATH. - unshift(File.expand_path(File.join(File.dirname(__FILE__), 'lib'))). + unshift(File.expand_path(File.join(File.dirname(__FILE__)))). unshift(File.expand_path(File.join(File.dirname(__FILE__), '../vendor/'))). - unshift(File.expand_path(File.join(File.dirname(__FILE__)))) + unshift(File.expand_path(File.join(File.dirname(__FILE__), 'lib'))) # ミクってかわいいよねぇ。 # ツインテールいいよねー。 @@ -30,7 +30,7 @@ module Miquire render[:cairo] else render[:gtk] end } }.new - PATH_KIND_CONVERTER[:core] = "" + PATH_KIND_CONVERTER[:core] = File.expand_path(File.join(File.dirname(__FILE__)))+"/" PATH_KIND_CONVERTER[:user_plugin] = '../plugin/' PATH_KIND_CONVERTER[:lib] = Class.new{ define_method(:+){ |other| diff --git a/core/mui/gtk_postbox.rb b/core/mui/gtk_postbox.rb index 75683de1..2143c47c 100644 --- a/core/mui/gtk_postbox.rb +++ b/core/mui/gtk_postbox.rb @@ -274,7 +274,8 @@ module Gtk 140 - widget_post.buffer.text.size - footer end end def focus_out_event(widget, event=nil) - Delayer.new(Delayer::NORMAL, @options){ |options| + options = @options + Delayer.new{ if(not(frozen?) and not(options.has_key?(:postboxstorage)) and post_is_empty?) destroy_if_necessary(widget_send, widget_tool, *@replies) end } false end diff --git a/core/plugin.rb b/core/plugin.rb index 441c70e7..ea984aa6 100644 --- a/core/plugin.rb +++ b/core/plugin.rb @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- -miquire :core, 'configloader', 'environment', 'delayer', 'event', 'event_listener', 'event_filter' -miquire :lib, "instance_storage" +miquire :core, 'configloader', 'environment', 'event', 'event_listener', 'event_filter' +miquire :lib, "instance_storage", 'delayer' # プラグインの本体。 # DSLを提供し、イベントやフィルタの管理をする diff --git a/core/plugin/gtk/delayer.rb b/core/plugin/gtk/delayer.rb index 43672827..b5c731df 100644 --- a/core/plugin/gtk/delayer.rb +++ b/core/plugin/gtk/delayer.rb @@ -1,37 +1,23 @@ # -*- coding: utf-8 -*- require "gtk2" +miquire :lib, "delayer" -class Delayer - class << self - attr_accessor :idle_handler +Module.new do - def idle_handler_lock - @idle_handler_lock ||= Mutex.new end - - def event_lock - @event_lock = true - result = yield - @event_lock = false - @idle_handler = nil - on_regist(nil) - result end + def self.boot + Gtk.idle_add_priority(GLib::PRIORITY_LOW) { + begin + Delayer.run + rescue => e + into_debug_mode(e) + Gtk.main_quit end + false } + end - def on_regist(delayer) - idle_handler_lock.synchronize { - if not(defined?(@event_lock) and @event_lock) - @idle_handler ||= Gtk.idle_add_priority(GLib::PRIORITY_LOW) { - next true if @event_lock - begin - Delayer.run - rescue => e - into_debug_mode(e) - Gtk.main_quit end - idle_handler_lock.synchronize { - if Delayer.empty? - @idle_handler = nil - false - else - true end } } end } end + Delayer.register_remain_hook do + boot end + + boot end diff --git a/core/plugin/openimg/openimg.rb b/core/plugin/openimg/openimg.rb index 1888ec9f..fb7ad373 100644 --- a/core/plugin/openimg/openimg.rb +++ b/core/plugin/openimg/openimg.rb @@ -35,7 +35,7 @@ Plugin.create :openimg do Thread.new{ url = url.value if url.is_a? Thread if not(url) or not(url.respond_to?(:to_s)) - Delayer.new{ + Delayer.new(:ui_response).new{ unless w.destroyed? if cancel w.destroy @@ -62,7 +62,7 @@ Plugin.create :openimg do loader.write raw loader.close pixbuf = loader.pixbuf end - Delayer.new{ + Delayer.new(:ui_passive){ unless w.destroyed? w.set_title(url.to_s) eventbox.signal_connect("event"){ |ev, event| @@ -152,21 +152,18 @@ Plugin.create :openimg do if block == nil ::Gtk::TimeLine.addopenway(cond){ |shrinked_url, cancel| url = MessageConverters.expand_url_one(shrinked_url) - Delayer.new(Delayer::NORMAL, Thread.new{ imgurlresolver(url, element_rule) }){ |url| - display(url, cancel) - } - } + Delayer.new(:ui_response){ + display(Thread.new{ + imgurlresolver(url, element_rule) + }, cancel) } } else ::Gtk::TimeLine.addopenway(cond){ |shrinked_url, cancel| url = MessageConverters.expand_url_one(shrinked_url) - Delayer.new(Delayer::NORMAL, Thread.new{ - imgurlresolver(url, element_rule){ |url| block.call(url, cancel) } - }) {|url| - display(url, cancel) - } - } - end - end + Delayer.new(:ui_response){ + display(Thread.new{ + imgurlresolver(url, element_rule){ |url| + block.call(url, cancel) } + }, cancel) } } end end pattern = JSON.parse(file_get_contents(File.expand_path(File.join(File.dirname(__FILE__), 'pattern_file.json'))), create_additions: true) pattern.each{ |name, config| @@ -216,7 +213,7 @@ Plugin.create :openimg do ::Gtk::TimeLine.addopenway(/.*\.(?:jpg|png|gif|)$/) { |shrinked_url, cancel| url = MessageConverters.expand_url_one(shrinked_url) - Delayer.new(Delayer::NORMAL) { display(url, cancel) } + Delayer.new { display(url, cancel) } } end diff --git a/core/serialthread.rb b/core/serialthread.rb index f6a3352d..b1b0711c 100644 --- a/core/serialthread.rb +++ b/core/serialthread.rb @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- require File.expand_path(File.join(File.dirname(__FILE__), 'utils')) -miquire :core, 'delayer' +miquire :lib, 'delayer' require 'set' require 'thread' diff --git a/core/service.rb b/core/service.rb index 553318a6..4aa86945 100644 --- a/core/service.rb +++ b/core/service.rb @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- -miquire :core, 'environment', 'user', 'message', 'userlist', 'configloader', 'userconfig', 'delayer', 'reserver' -miquire :lib, "mikutwitter" +miquire :core, 'environment', 'user', 'message', 'userlist', 'configloader', 'userconfig' +miquire :lib, "mikutwitter", 'reserver', 'delayer' Thread.abort_on_exception = true diff --git a/mikutter.rb b/mikutter.rb index 018bbddc..78dfe6a4 100755 --- a/mikutter.rb +++ b/mikutter.rb @@ -32,7 +32,7 @@ require 'fileutils' require File.expand_path(File.join(mikutter_directory, 'core/boot/option')) require File.expand_path(File.join(mikutter_directory, 'core/utils')) -miquire :boot, 'check_config_permission', 'mainloop' +miquire :boot, 'check_config_permission', 'mainloop', 'delayer' miquire :core, 'service', 'environment' Dir.chdir(Environment::CONFROOT) miquire :boot, 'load_plugin' diff --git a/test/core/test_event.rb b/test/core/test_event.rb index 89d73cd9..0740c6fd 100644 --- a/test/core/test_event.rb +++ b/test/core/test_event.rb @@ -25,9 +25,9 @@ class TC_Event < Test::Unit::TestCase end must "priority" do - assert_kind_of Fixnum, Event[:prio1].priority - Event[:prio1].options[:priority] = Delayer::UI_RESPONSE - assert_equal Delayer::UI_RESPONSE, Event[:prio1].priority + assert_kind_of Symbol, Event[:prio1].priority + Event[:prio1].options[:priority] = :ui_response + assert_equal :ui_response, Event[:prio1].priority end end diff --git a/test/core/test_web_image_loader.rb b/test/core/test_web_image_loader.rb index fbdca340..3bd9448c 100644 --- a/test/core/test_web_image_loader.rb +++ b/test/core/test_web_image_loader.rb @@ -7,7 +7,7 @@ require 'gtk2' ICON_TEST = File.expand_path(File.dirname(__FILE__) + "/icon_test.png") miquire :mui, 'web_image_loader' -miquire :core, 'delayer' +miquire :lib, 'delayer' Plugin = Class.new do def self.call(*args); end @@ -46,7 +46,7 @@ class TC_GtkWebImageLoader < Test::Unit::TestCase response_pixbuf, response_success = [pixbuf, success] } (Thread.list - [Thread.current]).each &:join - Delayer.run + Delayer.run(0) assert_equal(true, response_success) assert_kind_of(Gdk::Pixbuf, response_pixbuf) end diff --git a/test/helper.rb b/test/helper.rb index c65b18a5..63f4f164 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -19,3 +19,6 @@ $LOAD_PATH.unshift(File.dirname(__FILE__)) require 'utils' require 'miquire' require 'test_unit_extensions' + +miquire :boot, 'delayer' + |