separate creating and running IPC server instance

networking
brl 10 years ago
parent 120dbd97a2
commit 81b18bc663

@ -29,25 +29,42 @@ type MsgConn struct {
onClose func()
}
func RunServer(address string, factory MsgFactory, log *logging.Logger, handlers ...interface{}) error {
type MsgServer struct {
disp *msgDispatcher
factory MsgFactory
listener *net.UnixListener
done chan bool
idGen <- chan int
}
func NewServer(address string, factory MsgFactory, log *logging.Logger, handlers ...interface{}) (*MsgServer, error) {
md,err := createDispatcher(log, handlers...)
if err != nil {
return err
return nil, err
}
addr := &net.UnixAddr{address, "unix"}
listener,err := net.ListenUnix("unix", addr)
listener,err := net.ListenUnix("unix", &net.UnixAddr{address, "unix"})
if err != nil {
md.close()
return err
return nil, err
}
done := make(chan bool)
idGen := newIdGen(done)
return &MsgServer{
disp: md,
factory: factory,
listener: listener,
done: done,
idGen: idGen,
}, nil
}
func (s *MsgServer) Run() error {
for {
conn,err := listener.AcceptUnix()
conn,err := s.listener.AcceptUnix()
if err != nil {
close(md.msgs)
listener.Close()
s.disp.close()
s.listener.Close()
return err
}
if err := setPassCred(conn); err != nil {
@ -55,10 +72,10 @@ func RunServer(address string, factory MsgFactory, log *logging.Logger, handlers
}
mc := &MsgConn{
conn: conn,
disp: md,
disp: s.disp,
oob: createOobBuffer(),
factory: factory,
idGen: idGen,
factory: s.factory,
idGen: s.idGen,
respMan: newResponseManager(),
}
go mc.readLoop()

Loading…
Cancel
Save