[Stackless] tasklets on threads

Richard Tew richard.m.tew at gmail.com
Thu Sep 8 01:43:10 CEST 2011


2011/9/8 Kristján Valur Jónsson <kristjan at ccpgames.com>:
> I just realized that there are various interesting ways to crash stackless
> with threads.
>
> This one is simple
>
> Import treading, stackless
>
> Def foo():
>
>   Global task
>
>   Task = stackless.getcurrent()
>
> Threading.Thread(target=foo).start()
>
> ...
>
> Task.thread_id
>
>
>
> This will crash because the other thread‘s task->cstate is NULL.
>
>
>
> This is fixable.  But what about other cases?  Tasklets that are blocked (or
> removed) when their thread exits?
>
> Their task->cstate->tstate will be invalid.  And so, there are a number of
> things that can be done to crash them, like task.insert(), I imagine.
>
> Should we worry about this?  Or should we simply require of the programmer
> that for safe operation, a thread should exist at least as long as all
> tasklets created on it, and leave it to the programmer to ensure?

Do we really have a choice?  Is it clean to forceably kill all
tasklets belonging to a thread when it exits?  i.e. raise a
TaskletThreadExit exception on them.

I seem to recall Christian saying that some tasklets could be migrated
under certain circumstances - presumably if they had not done any hard
switching.   Doesn't sound very useful if some can and some can't,
unless the programmer is given a choice via a callback when the time
comes.

Cheers,
Richard.



More information about the Stackless mailing list