Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
776ea109
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
776ea109
编写于
5月 21, 2012
作者:
J
José Valim
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Revert "Merge pull request #6425 from pinetops/resolver_concurrency_fix"
This reverts commit
254c0428
, reversing changes made to
513a0525
.
上级
254c0428
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
23 addition
and
72 deletion
+23
-72
actionpack/lib/action_view/template/resolver.rb
actionpack/lib/action_view/template/resolver.rb
+19
-68
actionpack/test/template/lookup_context_test.rb
actionpack/test/template/lookup_context_test.rb
+4
-4
未找到文件。
actionpack/lib/action_view/template/resolver.rb
浏览文件 @
776ea109
...
@@ -2,7 +2,6 @@
...
@@ -2,7 +2,6 @@
require
"active_support/core_ext/class"
require
"active_support/core_ext/class"
require
"active_support/core_ext/class/attribute_accessors"
require
"active_support/core_ext/class/attribute_accessors"
require
"action_view/template"
require
"action_view/template"
require
"thread"
module
ActionView
module
ActionView
# = Action View Resolver
# = Action View Resolver
...
@@ -25,64 +24,6 @@ def initialize(name, prefix, partial, virtual)
...
@@ -25,64 +24,6 @@ def initialize(name, prefix, partial, virtual)
end
end
end
end
# Threadsafe template cache
class
Cache
#:nodoc:
class
CacheEntry
attr_accessor
:templates
delegate
:synchronize
,
:to
=>
"@mutex"
def
initialize
@mutex
=
Mutex
.
new
end
end
def
initialize
@data
=
Hash
.
new
{
|
h1
,
k1
|
h1
[
k1
]
=
Hash
.
new
{
|
h2
,
k2
|
h2
[
k2
]
=
Hash
.
new
{
|
h3
,
k3
|
h3
[
k3
]
=
Hash
.
new
{
|
h4
,
k4
|
h4
[
k4
]
=
{}
}
}
}
}
@mutex
=
Mutex
.
new
end
# Cache the templates returned by the block
def
cache
(
key
,
name
,
prefix
,
partial
,
locals
)
cache_entry
=
nil
# first obtain a lock on the main data structure to create the cache entry
@mutex
.
synchronize
do
cache_entry
=
@data
[
key
][
name
][
prefix
][
partial
][
locals
]
||=
CacheEntry
.
new
end
# then to avoid a long lasting global lock, obtain a more granular lock
# on the CacheEntry itself
cache_entry
.
synchronize
do
if
Resolver
.
caching?
# all templates are cached forever the first time they are accessed
cache_entry
.
templates
||=
yield
else
# templates are still cached, but are only returned if they are
# all still current
fresh
=
yield
mtime
=
cache_entry
.
templates
&&
cache_entry
.
templates
.
map
(
&
:updated_at
).
max
newer
=
!
mtime
||
fresh
.
empty?
||
fresh
.
any?
{
|
t
|
t
.
updated_at
>
mtime
}
if
newer
cache_entry
.
templates
=
fresh
else
cache_entry
.
templates
end
end
end
end
def
clear
@mutex
.
synchronize
do
@data
.
clear
end
end
end
cattr_accessor
:caching
cattr_accessor
:caching
self
.
caching
=
true
self
.
caching
=
true
...
@@ -91,11 +32,12 @@ class << self
...
@@ -91,11 +32,12 @@ class << self
end
end
def
initialize
def
initialize
@cache
=
Cache
.
new
@cached
=
Hash
.
new
{
|
h1
,
k1
|
h1
[
k1
]
=
Hash
.
new
{
|
h2
,
k2
|
h2
[
k2
]
=
Hash
.
new
{
|
h3
,
k3
|
h3
[
k3
]
=
Hash
.
new
{
|
h4
,
k4
|
h4
[
k4
]
=
{}
}
}
}
}
end
end
def
clear_cache
def
clear_cache
@cache
.
clear
@cache
d
.
clear
end
end
# Normalizes the arguments and passes it on to find_template.
# Normalizes the arguments and passes it on to find_template.
...
@@ -123,18 +65,27 @@ def build_path(name, prefix, partial)
...
@@ -123,18 +65,27 @@ def build_path(name, prefix, partial)
# Handles templates caching. If a key is given and caching is on
# Handles templates caching. If a key is given and caching is on
# always check the cache before hitting the resolver. Otherwise,
# always check the cache before hitting the resolver. Otherwise,
# it always hits the resolver but
if the key is present, check if the
# it always hits the resolver but
check if the resolver is fresher
#
resolver is fresher
before returning it.
# before returning it.
def
cached
(
key
,
path_info
,
details
,
locals
)
#:nodoc:
def
cached
(
key
,
path_info
,
details
,
locals
)
#:nodoc:
name
,
prefix
,
partial
=
path_info
name
,
prefix
,
partial
=
path_info
locals
=
locals
.
map
{
|
x
|
x
.
to_s
}.
sort!
locals
=
locals
.
map
{
|
x
|
x
.
to_s
}.
sort!
if
key
if
key
&&
caching?
@cache
.
cache
(
key
,
name
,
prefix
,
partial
,
locals
)
do
@cached
[
key
][
name
][
prefix
][
partial
][
locals
]
||=
decorate
(
yield
,
path_info
,
details
,
locals
)
decorate
(
yield
,
path_info
,
details
,
locals
)
end
else
else
decorate
(
yield
,
path_info
,
details
,
locals
)
fresh
=
decorate
(
yield
,
path_info
,
details
,
locals
)
return
fresh
unless
key
scope
=
@cached
[
key
][
name
][
prefix
][
partial
]
cache
=
scope
[
locals
]
mtime
=
cache
&&
cache
.
map
(
&
:updated_at
).
max
if
!
mtime
||
fresh
.
empty?
||
fresh
.
any?
{
|
t
|
t
.
updated_at
>
mtime
}
scope
[
locals
]
=
fresh
else
cache
end
end
end
end
end
...
...
actionpack/test/template/lookup_context_test.rb
浏览文件 @
776ea109
...
@@ -169,7 +169,7 @@ def teardown
...
@@ -169,7 +169,7 @@ def teardown
assert_not_equal
template
,
old_template
assert_not_equal
template
,
old_template
end
end
test
"responds to #prefixes"
do
test
"responds to #prefixes"
do
assert_equal
[],
@lookup_context
.
prefixes
assert_equal
[],
@lookup_context
.
prefixes
@lookup_context
.
prefixes
=
[
"foo"
]
@lookup_context
.
prefixes
=
[
"foo"
]
...
@@ -180,7 +180,7 @@ def teardown
...
@@ -180,7 +180,7 @@ def teardown
class
LookupContextWithFalseCaching
<
ActiveSupport
::
TestCase
class
LookupContextWithFalseCaching
<
ActiveSupport
::
TestCase
def
setup
def
setup
@resolver
=
ActionView
::
FixtureResolver
.
new
(
"test/_foo.erb"
=>
[
"Foo"
,
Time
.
utc
(
2000
)])
@resolver
=
ActionView
::
FixtureResolver
.
new
(
"test/_foo.erb"
=>
[
"Foo"
,
Time
.
utc
(
2000
)])
ActionView
::
R
esolver
.
stubs
(
:caching?
).
returns
(
false
)
@r
esolver
.
stubs
(
:caching?
).
returns
(
false
)
@lookup_context
=
ActionView
::
LookupContext
.
new
(
@resolver
,
{})
@lookup_context
=
ActionView
::
LookupContext
.
new
(
@resolver
,
{})
end
end
...
@@ -247,6 +247,6 @@ def setup
...
@@ -247,6 +247,6 @@ def setup
@lookup_context
.
view_paths
.
find
(
"foo"
,
"parent"
,
true
,
details
)
@lookup_context
.
view_paths
.
find
(
"foo"
,
"parent"
,
true
,
details
)
end
end
assert_match
%r{Missing partial parent/foo with .* Searched in:
\n
\*
"/Path/to/views"
\n
}
,
e
.
message
assert_match
%r{Missing partial parent/foo with .* Searched in:
\n
\*
"/Path/to/views"
\n
}
,
e
.
message
end
end
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录