[Stackless-checkins] r52175 - stackless/branches/release25-maint/PCbuild/uthread_ccp.py
richard.tew
python-checkins at python.org
Thu Oct 5 21:05:56 CEST 2006
Author: richard.tew
Date: Thu Oct 5 21:05:56 2006
New Revision: 52175
Removed:
stackless/branches/release25-maint/PCbuild/uthread_ccp.py
Log:
CCP's version of the uthread library is now available in the sandbox, so the version that appears in each branch of Stackless is no longer necessary.
http://svn.python.org/view/stackless/sandbox/libraries/uthread-ccp/
Deleted: /stackless/branches/release25-maint/PCbuild/uthread_ccp.py
==============================================================================
--- /stackless/branches/release25-maint/PCbuild/uthread_ccp.py Thu Oct 5 21:05:56 2006
+++ (empty file)
@@ -1,253 +0,0 @@
-"""Python Microthread Library, version 0.1
-Microthreads are useful when you want to program many behaviors
-happening simultaneously. Simulations and games often want to model
-the simultaneous and independent behavior of many people, many
-businesses, many monsters, many physical objects, many spaceships, and
-so forth. With microthreads, you can code these behaviors as Python
-functions. Microthreads use Stackless Python. For more details, see
-http://world.std.com/~wware/uthread.html"""
-
-__version__ = "0.1"
-
-__license__ = \
-"""Python Microthread Library version 0.1
-Copyright (C)2000 Will Ware, Christian Tismer
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of the authors not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-WILL WARE AND CHRISTIAN TISMER DISCLAIM ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL WILL WARE OR CHRISTIAN TISMER BE LIABLE FOR
-ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE."""
-
-#import continuation
-import stackless
-
-MAX_TIMESLICE = 20000000
-
-'''
-tasks = [ ]
-ghandler = None
-'''
-
-'''
-def endtask():
- """force this thread to die"""
- continuation.uthread_lock(1)
- sched = continuation.uthread_reset()
- if sched != None:
- sched()
-'''
-# not needed yet
-
-'''
-def schedule():
- """force a context switch"""
- continuation.uthread_lock(1)
- sched = continuation.uthread_reset()
- sched(continuation.caller())
-'''
-# handled internally
-schedule = stackless.schedule
-
-'''
-def new(func, *args, **kw):
- """Start a new task"""
- if func == None:
- raise "Don't you make me try to call None"
- global tasks
- assert not kw
-
- def wrapper(func, args):
- continuation.return_current()
- try:
- apply(func, args)
- except:
- continuation.uthread_reset()
- raise
- endtask()
-
- tmp = continuation.uthread_lock(1)
- task = wrapper(func, args)
- task.caller = None
- tasks.append(task)
- continuation.uthread_lock(tmp)
-'''
-def new(func, *args, **kw):
- """Start a new task"""
- gen = stackless.taskoutlet(func)
- t = gen(*args, **kw)
- t.insert()
-
-'''
-def run():
- """Run a bunch of tasks, until they all complete"""
- global tasks
- pop = tasks.pop
- append = tasks.append
- timeslice = continuation.timeslice
- if not tasks:
- # just enter the loop
- append(None)
- while tasks:
- task = pop(0)
- if task:
- try:
- task = timeslice(task, MAX_TIMESLICE)
- except UserError, e:
- global ghandler
- if ghandler:
- new(ghandler, e)
- else:
- print e
-
- if task:
- import runner
- runner.PostException(
- task,
- "THIS THREAD WAS PROBABLY STUCK IN AN INFINITE LOOP AND HAS BEEN NUKED!!!",
- None)
-
- #append(task)
-'''
-def run():
- """Run a bunch of tasks, until they all complete"""
- # have to add error handling like above
- while stackless.getruncount() > 1:
- try:
- # running until the end or until something happens
- victim = stackless.run_watchdog(MAX_TIMESLICE)
- if victim:
- print "THIS THREAD WAS PROBABLY STUCK IN AN INFINITE LOOP AND HAS BEEN NUKED!!!",
- # todo: kill the task cleanly
- except Exception, e:
- print "Exception occoured:", e
-
-idIndex = 0
-
-def sethandler(handler):
- global ghandler
- ghandler = handler
-
-
-def uniqueId():
- """Microthread-safe way to get unique numbers, handy for
- giving things unique ID numbers"""
- global idIndex
- tmp = stackless.scheduler_lock(1)
- z = idIndex
- idIndex = z + 1
- stackless.scheduler_lock(tmp)
- return z
-
-def irandom(n):
- """Microthread-safe version of random.randrange(0,n)"""
- import random
- tmp = stackless.scheduler_lock(1)
- n = random.randrange(0, n)
- stackless.scheduler_lock(tmp)
- return n
-
-'''
-class Semaphore:
- """Semaphores protect globally accessible resources from
- the effects of context switching."""
- __guid__ = 'uthread.Semaphore'
- def __init__(self, maxcount=1):
- self.count = maxcount
- self.waiting = []
- def claim(self):
- tmp = continuation.uthread_lock(1)
- if self.count == 0:
- self.waiting.append(continuation.caller())
- endtask()
- else:
- self.count = self.count - 1
- continuation.uthread_lock(tmp)
- def release(self):
- tmp = continuation.uthread_lock(1)
- if self.waiting:
- tasks.append(self.waiting.pop(0))
- else:
- self.count = self.count + 1
- continuation.uthread_lock(tmp)
-'''
-
-class Semaphore:
- """Semaphores protect globally accessible resources from
- the effects of context switching."""
- __guid__ = 'uthread_ccp.Semaphore'
-
- def __init__(self, maxcount=1):
- self.count = maxcount
- self.waiting = stackless.channel()
-
- def acquire(self):
- tmp = stackless.atomic()
- if self.count == 0:
- self.waiting.receive()
- else:
- self.count = self.count - 1
-
- claim = acquire
-
- def release(self):
- tmp = stackless.atomic()
- if self.waiting.queue:
- self.waiting.send(None)
- else:
- self.count = self.count + 1
-
-class Queue:
- """A queue is a microthread-safe FIFO."""
- __guid__ = 'uthread_ccp.Queue'
-
- def __init__(self):
- self.contents = [ ]
- self.channel = stackless.channel()
-
- def put(self, x):
- tmp = stackless.atomic()
- self.contents.append(x)
- while self.channel.queue and self.contents:
- self.channel.send(self.contents.pop(0))
-
- def get(self):
- tmp = stackless.atomic()
- if self.contents:
- return self.contents.pop(0)
- return self.channel.receive()
-
- def unget(self, x):
- tmp = stackless.atomic()
- self.contents.insert(0, x)
-
- def cget(self):
- return self.contents.pop(0)
-
-
-exports = {
- "uthread_ccp.new": new,
- "uthread_ccp.irandom": irandom,
- "uthread_ccp.uniqueId": uniqueId,
- "uthread_ccp.run": run,
- "uthread_ccp.schedule": schedule,
- "uthread_ccp.sethandler": sethandler,
- }
-
-def test(n):
- global cnt
- for cnt in xrange(n):
- if cnt == 12345:
- 1/0
-
-
\ No newline at end of file
_______________________________________________
Stackless-checkins mailing list
Stackless-checkins at stackless.com
http://www.stackless.com/mailman/listinfo/stackless-checkins
More information about the Stackless-checkins
mailing list