[PD-dev] [ pure-data-Bugs-1518030 ] GOP subpatch clearing itself crashes Pd

Mathieu Bouchard matju at artengine.ca
Tue Jul 11 20:26:43 CEST 2006


On Thu, 6 Jul 2006, Hans-Christoph Steiner wrote:

> Yeah, its probably not fixable without limiting flexibility.  Any good 
> programming language will let you crash things in certain ways (fork 
> bomb, infinite loops, rm -rf /, etc.).  Exception handling would be a 
> nice solution to this, but that's not an easy one to implement.

Yes. This is because externs (and interns) aren't built in an 
interruptible fashion. What Pd needs for that, is a macro-driven block 
like:

TRY {
   ...
} ENSURE {
   ...
}

Where a TRY section may be interrupted anytime (e.g. by a watchdog 
timeout) and the ENSURE section is always run after the TRY section even 
when it was interrupted. The ENSURE section does cleanup in order to 
prevent leaks and possible crashes/inconsistencies. e.g.:

void myobject_mymethod(myobject *self, t_symbol *phun) {
   /* you may assume self->foo is 0 at this point */
   TRY {
     self->foo = malloc(666);
     outlet_symbol(self->out,phun);
     (stuff goes here involving self->foo)
   } ENSURE {
     if (self->foo) {free(self->foo); self->foo=0;}
   }
}

The TRY {} ENSURE {} statement would be implemented using standard (though 
scary) C functions like setjmp() and longjmp(), which handle nonlocal 
returns.

Also other handling mechanisms like CATCH and RETRY and such can be 
thought of and implemented.

API versioning can be used to separate object-classes that were written 
with exceptions in mind, from those that weren't.

A problem with watchdog timeouts is that it's difficult and nonportable 
for a UNIX signal-handler to influence the normal execution of the thread 
it runs on top of. As a result, to be portable, those timeouts have to be 
implemented in a more explicit way than we might want to, and then it 
wouldn't catch all possible timeouts. (e.g. not while(1){})

  _ _ __ ___ _____ ________ _____________ _____________________ ...
| Mathieu Bouchard - tél:+1.514.383.3801 - http://artengine.ca/matju
| Freelance Digital Arts Engineer, Montréal QC Canada


More information about the Pd-dev mailing list