import stackless
import weakref
import gc

zzz = None

def print_referrers():
    t = stackless.current
    print gc.get_referrers(t)


def tasklet_func_catcher(wc):
    global zzz
    try:
        tasklet_func_pitcher(wc)
    except TaskletExit, e:
        zzz = "TEXC", e
    except BaseException, e:
        zzz = "EXC", e
    finally:
        zzz = "FIN", None
    print "tasklet_func_catcher.exit"


def tasklet_func_pitcher(wc):
    print_referrers()
    i = 0
    while 1:
        print "tasklet_func_pitcher.schedule[%s]" % i
        wc.receive()
        i += 1


def wr_callback(*args):
    print "wr_callback"


def create_tasklet():
    c = stackless.channel()
    wc = weakref.proxy(c)
    print "create_tasklet.create"
    t = stackless.tasklet(tasklet_func_catcher)(wc)
    wr = weakref.ref(t, wr_callback)
    print "create_tasklet.pre-run"
    wc.send(None)
    wc.send(None)
    wc.send(None)
    print "create_tasklet.post-run/pre-remove; runcount=", stackless.runcount
    del c
    print "create_tasklet.post-remove; runcount=", stackless.runcount, "wr=", wr
    return wr


ref = create_tasklet()
print "gc.get_referrers; pre-collect", ref
gc.collect()
print "gc.get_referrers; post-collect", ref

print "zzz", zzz