1 #!/Library/Frameworks/Python.framework/Versions/2.5/bin/python
  2 # encoding: utf-8
  3 import sys
  4 import stackless as SL
  5 
  6 def run_benchmark(n, m):
  7     # print(">> Python 2.5.1, stackless 3.1b3 here (N=%d, M=%d)!\n" % (n, m))
  8     firstP = cin = SL.channel()
  9     for s in xrange(1, n):
 10         seqn = s
 11         cout = SL.channel()
 12         # # print("*> s = %d" % (seqn, ))
 13         t = SL.tasklet(loop)(seqn, cin, cout)
 14         cin = cout
 15     else:
 16         seqn = s+1
 17         # # print("$> s = %d" % (seqn, ))
 18         t = SL.tasklet(mloop)(seqn, cin)
 19     for r in xrange(m-1, -1, -1):
 20         # # print("+ sending Msg#  %d" % r)
 21         firstP.send(r)
 22     SL.schedule()
 23 def loop(s, cin, cout):
 24     while True:
 25         r = cin.receive()
 26         cout.send(r)
 27         if r > 0: pass
 28             # print(": Proc: <%s>, Seq#: %s, Msg#: %s .." % (pid(), s, r))
 29         else:
 30             # print("* Proc: <%s>, Seq#: %s, Msg#: terminate!" % (pid(), s))
 31             break
 32 def mloop(s, cin):
 33     while True:
 34         r = cin.receive()
 35         if r > 0: pass
 36             # print("> Proc: <%s>, Seq#: %s, Msg#: %s .." % (pid(), s, r))
 37         else:
 38             # print("@ Proc: <%s>, Seq#: %s, ring terminated." % (pid(), s))
 39             break
 40 
 41 def pid(): return repr(SL.getcurrent()).split()[-1][2:-1]
 42 
 43 if __name__ == '__main__':
 44     run_benchmark(int(sys.argv[1]), int(sys.argv[2]))