pull/131/head
v2ray 2016-04-26 01:08:41 +02:00
parent d9d3eac8f7
commit d9367efb2d
2 changed files with 12 additions and 0 deletions

View File

@ -1,10 +1,12 @@
package signal package signal
// CancelSignal is a signal passed to goroutine, in order to cancel the goroutine on demand.
type CancelSignal struct { type CancelSignal struct {
cancel chan struct{} cancel chan struct{}
done chan struct{} done chan struct{}
} }
// NewCloseSignal creates a new CancelSignal.
func NewCloseSignal() *CancelSignal { func NewCloseSignal() *CancelSignal {
return &CancelSignal{ return &CancelSignal{
cancel: make(chan struct{}), cancel: make(chan struct{}),
@ -12,18 +14,22 @@ func NewCloseSignal() *CancelSignal {
} }
} }
// Cancel signals the goroutine to stop.
func (this *CancelSignal) Cancel() { func (this *CancelSignal) Cancel() {
close(this.cancel) close(this.cancel)
} }
// WaitForCancel should be monitored by the goroutine for when to stop.
func (this *CancelSignal) WaitForCancel() <-chan struct{} { func (this *CancelSignal) WaitForCancel() <-chan struct{} {
return this.cancel return this.cancel
} }
// Done signals the caller that the goroutine has completely finished.
func (this *CancelSignal) Done() { func (this *CancelSignal) Done() {
close(this.done) close(this.done)
} }
// WaitForDone is used by caller to wait for the goroutine finishes.
func (this *CancelSignal) WaitForDone() <-chan struct{} { func (this *CancelSignal) WaitForDone() <-chan struct{} {
return this.done return this.done
} }

View File

@ -16,14 +16,17 @@ var (
type UUID [16]byte type UUID [16]byte
// String returns the string representation of this UUID.
func (this *UUID) String() string { func (this *UUID) String() string {
return bytesToString(this.Bytes()) return bytesToString(this.Bytes())
} }
// Bytes returns the bytes representation of this UUID.
func (this *UUID) Bytes() []byte { func (this *UUID) Bytes() []byte {
return this[:] return this[:]
} }
// Equals returns true if this UUID equals another UUID by value.
func (this *UUID) Equals(another *UUID) bool { func (this *UUID) Equals(another *UUID) bool {
if this == nil && another == nil { if this == nil && another == nil {
return true return true
@ -61,12 +64,14 @@ func bytesToString(bytes []byte) string {
return result return result
} }
// New creates an UUID with random value.
func New() *UUID { func New() *UUID {
uuid := new(UUID) uuid := new(UUID)
rand.Read(uuid.Bytes()) rand.Read(uuid.Bytes())
return uuid return uuid
} }
// PraseBytes converts an UUID in byte form to object.
func ParseBytes(b []byte) (*UUID, error) { func ParseBytes(b []byte) (*UUID, error) {
if len(b) != 16 { if len(b) != 16 {
return nil, ErrorInvalidID return nil, ErrorInvalidID
@ -76,6 +81,7 @@ func ParseBytes(b []byte) (*UUID, error) {
return uuid, nil return uuid, nil
} }
// ParseString converts an UUID in string form to object.
func ParseString(str string) (*UUID, error) { func ParseString(str string) (*UUID, error) {
text := []byte(str) text := []byte(str)
if len(text) < 32 { if len(text) < 32 {