Changeset [e203f17e196b811162a66a6446180513c0691ea5] by Paul Davis

May 11th, 2009 @ 12:52 AM

API for limiting resource usage.

You can now enforce crude resource usage limits for scripts executing in the JS VM. Its not overly granular and has some caveats, but it appears to work.

To limit the time a script can run:

>>> rt = spidermonkey.Runtime()
>>> cx = rt.new_context()
>>> cx.max_time(5) # Specified in seconds, returns the previous value.
0
>>> cx.execute("while(true) {}")
...
RuntimeError

To limit the amount of memory is similar:

>>> rt = spidermonkey.Runtime()
>>> cx = rt.new_context()
>>> cx.max_memory(10000) # Specified in bytes, returns the previous value.
0
>>> cx.execute("var f = []; var b = 100000; while(b-- > 0) f.push(b*0.9)")
...
RuntimeError

At the moment this looks like its limiting resources per context when in reality its per runtime. So if you limit to usage on a context, and some other script in the context is running above that limit, the limited context will fail.

You can also get the current values without setting:

>>> cx.max_time(10)
...
>>> cx.max_time()
10
>>> cx.max_memory(10000)
...
>>> cx.max_memory()
10000

Some minor tweaks to make the memory limit specified on the Runtime and to improve the reported errors to follow shortly.

[#12] http://github.com/davisp/python-...

Committed by Paul Davis

  • M spidermonkey/context.c
  • M spidermonkey/context.h
  • M spidermonkey/jsfunction.c
  • M spidermonkey/runtime.c
  • M tests/t.py
  • M tests/test-context.py
  • M tests/test-runtime.py
New-ticket Create new ticket

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile ยป

Python/JavaScript bridge module, making use of Mozilla's spidermonkey JavaScript implementation. Allows implementation of JavaScript classes, objects and functions in Python, and evaluation and calling of JavaScript scripts and functions respectively. Borrows heavily from Claes Jacobssen's Javascript Perl module, in turn based on Mozilla's 'PerlConnect' Perl binding.