1
0
Fork 0
forked from External/ergo

get rid of mutexes in favor of channel-base syncing

This commit is contained in:
Jeremy Latt 2014-02-16 17:23:47 -08:00
parent 74b8221db7
commit e411dafda7
6 changed files with 397 additions and 351 deletions

View file

@ -28,9 +28,19 @@ func (mode UserMode) String() string {
type Phase uint
type Numeric uint
type ReplyCode interface {
String() string
}
func (code Numeric) String() string {
type StringCode string
func (code StringCode) String() string {
return string(code)
}
type NumericCode uint
func (code NumericCode) String() string {
return fmt.Sprintf("%03d", code)
}
@ -87,29 +97,43 @@ func (clients ClientNameMap) Remove(client *Client) error {
type ChannelModeSet map[ChannelMode]bool
type ClientSet map[*Client]ChannelModeSet
type ClientSet map[*Client]bool
func (clients ClientSet) Add(client *Client) {
clients[client] = make(ChannelModeSet)
clients[client] = true
}
func (clients ClientSet) Remove(client *Client) {
delete(clients, client)
}
func (clients ClientSet) HasMode(client *Client, mode ChannelMode) bool {
modes, ok := clients[client]
func (clients ClientSet) Has(client *Client) bool {
return clients[client]
}
type MemberSet map[*Client]ChannelModeSet
func (members MemberSet) Add(member *Client) {
members[member] = make(ChannelModeSet)
}
func (members MemberSet) Remove(member *Client) {
delete(members, member)
}
func (members MemberSet) Has(member *Client) bool {
_, ok := members[member]
return ok
}
func (members MemberSet) HasMode(member *Client, mode ChannelMode) bool {
modes, ok := members[member]
if !ok {
return false
}
return modes[mode]
}
func (clients ClientSet) Has(client *Client) bool {
_, ok := clients[client]
return ok
}
type ChannelSet map[*Channel]bool
func (channels ChannelSet) Add(channel *Channel) {
@ -141,6 +165,7 @@ type Replier interface {
}
type Reply interface {
Code() ReplyCode
Format(*Client) []string
Source() Identifier
}
@ -172,6 +197,10 @@ type ChannelCommand interface {
HandleChannel(channel *Channel)
}
type ClientCommand interface {
HandleClient(client *Client)
}
//
// structs
//