mirror of
https://github.com/evennia/evennia.git
synced 2026-03-25 01:06:32 +01:00
60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
"""
|
|
This defines the the parent for all subprocess children.
|
|
|
|
Inherit from this to define a new type of subprocess.
|
|
|
|
"""
|
|
|
|
from twisted.python import log
|
|
from twisted.internet import error
|
|
from twisted.protocols import amp
|
|
from contrib.procpools.ampoule.commands import Echo, Shutdown, Ping
|
|
|
|
class AMPChild(amp.AMP):
|
|
def __init__(self):
|
|
super(AMPChild, self).__init__(self)
|
|
self.shutdown = False
|
|
|
|
def connectionLost(self, reason):
|
|
amp.AMP.connectionLost(self, reason)
|
|
from twisted.internet import reactor
|
|
try:
|
|
reactor.stop()
|
|
except error.ReactorNotRunning:
|
|
# woa, this means that something bad happened,
|
|
# most probably we received a SIGINT. Now this is only
|
|
# a problem when you use Ctrl+C to stop the main process
|
|
# because it would send the SIGINT to child processes too.
|
|
# In all other cases receiving a SIGINT here would be an
|
|
# error condition and correctly restarted. maybe we should
|
|
# use sigprocmask?
|
|
pass
|
|
if not self.shutdown:
|
|
# if the shutdown wasn't explicit we presume that it's an
|
|
# error condition and thus we return a -1 error returncode.
|
|
import os
|
|
os._exit(-1)
|
|
|
|
def shutdown(self):
|
|
"""
|
|
This method is needed to shutdown the child gently without
|
|
generating an exception.
|
|
"""
|
|
#log.msg("Shutdown message received, goodbye.")
|
|
self.shutdown = True
|
|
return {}
|
|
Shutdown.responder(shutdown)
|
|
|
|
def ping(self):
|
|
"""
|
|
Ping the child and return an answer
|
|
"""
|
|
return {'response': "pong"}
|
|
Ping.responder(ping)
|
|
|
|
def echo(self, data):
|
|
"""
|
|
Echo some data through the child.
|
|
"""
|
|
return {'response': data}
|
|
Echo.responder(echo)
|