Curl Global Community
importされたパッケージ - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: importされたパッケージ (/showthread.php?tid=214)



importされたパッケージ - 森口 慶紀 - 08-17-2011

続けて投稿失礼します。

Curlで、メモリ内キャッシュからパッケージもしくはマニフェストが解放されるタイミングを取得することはできないでしょうか。
もしくはメモリ内から解放されない様にする方法がございましたら、是非ご教授お願い致しますHuh


RE: importされたパッケージ - nmyzk - 08-18-2011

質問の意図が明確に捉えられてないのですが、
理解した限りで回答します。

1.文中のパッケージ/マニフェストが
  動作中のアプレットで利用される(またはされている)
  モジュール一式を指している場合
  
→アプレット内で読み込まれたパッケージは
 メモリに展開された後開放されることはありません。
 開放されてしまうと、同名で別インスタンスの
 パッケージ定義が発生してしまうからです。
 強いて言うならアプリケーションの終了時に開放されます。
 
2.文中のパッケージ/マニフェストが
  リフレクションで利用されるPackage及びComponentManifestクラスの
  オブジェクトの場合
  
→開放されるタイミングは通常のガベージコレクトと同じで、
 インスタンスが参照されなくなったときに開放されます。
 
 Singletonなどの構造でオブジェクトを維持する構造を作れば
 メモリ内に維持させることもできますが、
 あまりメリットが無いように思えます。
 
 
ちなみに、そもそもやろうとしていることは何でしょうか?
場合によっては全く別の解決案がある気がしました。


RE: importされたパッケージ - cbarber - 08-19-2011

(08-17-2011, 05:28 PM)森口 慶紀 Wrote: 続けて投稿失礼します。

Curlで、メモリ内キャッシュからパッケージもしくはマニフェストが解放されるタイミングを取得することはできないでしょうか。
もしくはメモリ内から解放されない様にする方法がございましたら、是非ご教授お願い致しますHuh
I have to rely on Google translate to read your question so I am not sure I correctly understand your question, but it seems that you are asking about how long packages are kept in memory.

Packages that are loaded using the 'import' or 'import-package' are stored in a shared memory area so that they can be used by multiple applets. Such a package will not be unloaded from memory until there are no remaining applets that have imported it. Flushing of unused packages occurs after an applet finishes loading, thus reloading an applet will not flush a package from memory unless the applet has been changed to no longer import the package.

You can also create a new 'OpenPackage' object and use it to 'evaluate' code dynamically. Such packages are not shared with other applets and can be reclaimed by the Curl garbage collector when there are no longer any references to them. So if you want to do a lot of dynamic code generation but don't want it to live as long as the applet, you should use this technique.



RE: importされたパッケージ - 森口 慶紀 - 09-13-2011


お返事が遅くなってしまい、誠に申し訳ありません。

>nmyzkさん

申し訳ありません。特にやろうとしていることというのはなく、できるのかな?
といったレベルで質問させていただいておりました・・・Sad

ご回答いただき、ありがとうございますSmile

>cbarberさん

Thank you for my question! I understand your anwerBig Grin


RE: importされたパッケージ - alchimiste - 09-28-2011

(08-19-2011, 09:02 AM)cbarber Wrote: Packages that are loaded using the 'import' or 'import-package' are stored in a shared memory area so that they can be used by multiple applets. Such a package will not be unloaded from memory until there are no remaining applets that have imported it. Flushing of unused packages occurs after an applet finishes loading, thus reloading an applet will not flush a package from memory unless the applet has been changed to no longer import the package.



But is it possible to reload a package that has been loaded already without restarting an applet?

I found from Curl6.0, packages can be reloaded by dynamically importing manifest and package.

It' very useful in applications which has many menu, and each of those menu is a independent manifest.

Here is a sample code:

Code:
let mf:ComponentManifest = {with-file-caching-style FileCachingStyle.resynchronize do
                               {import-manifest
                                   path asa Url,
                                   check-out-of-date? = true
                               }
                           }
let agent-package:#Package
set agent-package = {import-package
                        manifest=mf,
                        {make-package-selector pkg-name}
                    }


I'm using this code for loading menu applications in the main appication with OCC