I've implemented the infinite loop-catching suggestion by instrumenting
the Python code. I haven't adopted the techniques from the article Ian
found because I'm lazy, and because my users are silly, not evil. It
took a bit of buggering about but the result is fairly simple. Read on
if you're interested.
1. I figure that the only Python construct that can easily loop
infinitely is the while statement. (for statements could also blow out,
and I'll fix that if it becomes a problem.)
2. I can convert the code to be evaluated into a parse tree as follows:
asList = parser.suite(code).tolist(True) # We want original line
numbers to be preserved
3. I can instrument this code by adding a call to loopCheck() at the
beginning of each while loop: (This code assumes you're familiar with
the structure of Python parse trees.)
# Construct the parse tree for the call to loopCheck()
_callLoopCheck = parser.suite('loopCheck()').tolist()[1]
def _addLoopChecks(l):
"""Takes a parse tree and adds calls to loopCheck() to every loop."""
if type(l) is list:
for subL in l:
_addLoopChecks(subL)
if type(l[1]) is list:
if symbol.sym_name[l[0]] == 'while_stmt':
m = l[4]
assert symbol.sym_name[m[0]] == 'suite'
i = 1
while type(m[i][1]) is not list:
i = i + 1
m.insert(i, _callLoopCheck)
4. Then I can recompile the patched parse tree:
compiled = parser.sequence2ast(asList).compile()
5. And finally execute it:
class _LoopCheck:
def __init__(self):
self._loopCount = 0
def loopCheck(self):
self._loopCount = self._loopCount + 1
if self._loopCount == 500000:
raise Exception, "Code has gone into an infinite loop."
exec compiled in { 'loopCheck': _LoopCheck().loopCheck }
Thanks for all the help.
Oliver
--
Richard Wheeler wrote:
> Ian Bicking <[EMAIL PROTECTED]> writes:
>
>> This recipe might be of use:
>> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496746
>>
>> I don't believe it is threadsafe, but I'm not sure. I think it needs to
>> run the code in the main thread, then puts an alarm in a subthread that
>> interrupts the main thread if it takes too long. I don't think other
>> threads can be interrupted that way.
>>
>
> That is a very good find Ian. It is very similar to what I am suggesting.
> In
> my worker threads we used event object for signaling. The main thread joins
> the worker thread to set the event which worker thread then detects it is to
> end. Using that mechanism you would avoid the issue of how to kill the
> thread
> since the thread ends it self based on the event object allowing it to break
> out of the loop.
>
> Since the recipe has the parsing logic already in place it shouldn't take
> much
> tweaking to scan for loop keywords and insert code. I would log those code
> fragments so that if the parsing logic misses a loop, you could examine the
> code fragment and further refine the parsing logic. Eventually it would
> become bullet proof.
>
> Using this mechanism you can enforce the necessary logic to avoid infinite
> loops.
>
> Oliver to solve your issue it is going to take some work given the nature of
> your system that you have described. With that recipe you have a lot of the
> work already done. If you are not sure how to setup worker threads and use
> event objects I could post a code fragment here. For that matter I think
> ASPN
> already has recipes for those concepts.
>
>
>
>
>
>
>
>
> All the advantages of Linux Managed Hosting--Without the Cost and Risk!
> Fully trained technicians. The highest number of Red Hat certifications in
> the hosting industry. Fanatical Support. Click to learn more
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=107521&bid=248729&dat=121642
> _______________________________________________
> Webware-discuss mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/webware-discuss
>
>
All the advantages of Linux Managed Hosting--Without the Cost and Risk!
Fully trained technicians. The highest number of Red Hat certifications in
the hosting industry. Fanatical Support. Click to learn more
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=107521&bid=248729&dat=121642
_______________________________________________
Webware-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/webware-discuss