#! /usr/bin/python

# To change this template, choose Tools | Templates
# and open the template in the editor.

__author__="brock"
__date__ ="$Feb 17, 2011 2:40:58 PM$"

from CompareAndSwap import CompareAndSwapRegister
import re
import socket
import thread

pat = re.compile('^\s*(\d+)\s+(\d+)\s*\n$')

def handleClient(reg, reglock, strm, addr):
    print "Connection open:  ", addr
    instrm  = strm.makefile('r')
    outstrm = strm.makefile('w')
    line = instrm.readline()
    while line:
        print addr, ' -> ', line,
        mat = pat.match(line)
        if (mat == None):
            repl = 'Bad Syntax'
        else:
            oldval = int(mat.group(1))
            newval = int(mat.group(2))
            reglock.acquire()
            repstr = reg.CompareAndSwap(oldval, newval)
            reglock.release()
            repl   = str(repstr)
        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)
    reglock = thread.allocate_lock()
    try:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ;
        s.bind(('', 22222))
        s.listen(1)

        while True:
            strm, addr = s.accept()
            try:
                thread.start_new_thread(handleClient, (reg,reglock,strm,addr) )
            except:
                print "Unable to start thread for ", addr
                strm.close()
    except KeyboardInterrupt:
        print 'Exiting'
        s.close()


if __name__ == "__main__":
    serverCAS()

