import stackless
import weakref
import gc


def print_referrers():
    t = stackless.current
    print gc.get_referrers(t)


def tasklet_func_catcher():
    try:
        tasklet_func_pitcher()
    except TaskletExit, e:
        print "TEXC", e
    except BaseException, e:
        print "EXC", e


def tasklet_func_pitcher():
    print_referrers()
    i = 0
    while 1:
        print "tasklet_func_pitcher.schedule[%s]" % i
        v = stackless.schedule()
        print "tasklet_func_pitcher.scheduled[%s]" % i, v
        del v
        i += 1


def wr_callback(*args):
    print "wr_callback"


def create_tasklet():
    print "create_tasklet.create"
    t = stackless.tasklet(tasklet_func_catcher)()
    print "create_tasklet.pre-run"
    t.run()
    t.run()
    t.run()
    print "create_tasklet.post-run/pre-remove; runcount=", stackless.runcount
    wr = weakref.ref(t, wr_callback)
    t.remove()
    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

