aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToshiaki Asai <toshi.alternative@gmail.com>2013-06-02 17:39:31 +0900
committerToshiaki Asai <toshi.alternative@gmail.com>2013-06-02 18:23:49 +0900
commitabbacd892ad50228a49311a2875881cbe24ee047 (patch)
treee5864d9491f7709fa2f9f3a3c3504f12fac66dec
parentf6f15b575e83328561d6410da3b267572ca52aa4 (diff)
downloadmikutter-abbacd892ad50228a49311a2875881cbe24ee047.tar.gz
Delayerを削除。Delayer gemを使うように変更した
-rw-r--r--Gemfile1
-rw-r--r--core/boot/delayer.rb11
-rw-r--r--core/delayer.rb134
-rw-r--r--core/event.rb5
-rw-r--r--core/lib/deferred/deferred.rb4
-rw-r--r--core/lib/deferred/test.deferred.rb3
-rw-r--r--core/lib/mikutwitter/test/test_api_call_support.rb3
-rw-r--r--core/lib/mikutwitter/test/test_api_shortcuts.rb4
-rw-r--r--core/miquire.rb6
-rw-r--r--core/mui/gtk_postbox.rb3
-rw-r--r--core/plugin.rb4
-rw-r--r--core/plugin/gtk/delayer.rb44
-rw-r--r--core/plugin/openimg/openimg.rb27
-rw-r--r--core/serialthread.rb2
-rw-r--r--core/service.rb4
-rwxr-xr-xmikutter.rb2
-rw-r--r--test/core/test_event.rb6
-rw-r--r--test/core/test_web_image_loader.rb4
-rw-r--r--test/helper.rb3
19 files changed, 67 insertions, 203 deletions
diff --git a/Gemfile b/Gemfile
index 320c73c7..a4af6026 100644
--- a/Gemfile
+++ b/Gemfile
@@ -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'
+