#! /usr/bin/python

__author__="Brock"
__date__ ="$Feb 19, 2011 9:02:21 PM$"

from compareandswap import CompareAndSwapRegister
import re
import socket
import threading

def HandleConnection(reg, strm, addr):
    pat  = re.compile('\s*(\d+)\s+(\d+)\s*')
    print "Connection open:  ", addr
    instrm  = strm.makefile('r')
    outstrm = strm.makefile('w')
    line = instrm.readline()
    while line:
        print addr, ' -> ', line,               # need a lock?
        mat = pat.match(line)
        if (mat == None):
            repl = 'Bad Syntax'
        else:
            repl = str(reg.CompareAndSwap(int(mat.group(1)),int(mat.group(2))))
            outstrm.write(repl+'\n\r')
            outstrm.flush()
        line = instrm.readline()
    instrm.close()
    outstrm.close()
    strm.close()
    print "Connection close: ", addr


def serverCAS():
    reg = CompareAndSwapRegister()
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ;
        s.bind(('', 22222))
        s.listen(1)
        while True:
            strm, addr = s.accept()
            t = threading.Thread(target=HandleConnection, args=(reg,strm,addr,))
            t.daemon = True           # Exit when only daemons remain
            t.start()
    except KeyboardInterrupt:
        print 'Exiting'
        s.close()


if __name__ == "__main__":
    serverCAS()

