Documentation ¶
Overview ¶
Package sync2 provides extra functionality along the same lines as sync.
Index ¶
Constants ¶
const ( SERVICE_STOPPED = iota SERVICE_RUNNING SERVICE_SHUTTING_DOWN )
These are the three predefined states of a service.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AtomicDuration ¶
type AtomicDuration int64
func (*AtomicDuration) CompareAndSwap ¶
func (d *AtomicDuration) CompareAndSwap(oldval, newval time.Duration) (swapped bool)
func (*AtomicDuration) Get ¶
func (d *AtomicDuration) Get() time.Duration
func (*AtomicDuration) Set ¶
func (d *AtomicDuration) Set(duration time.Duration)
type AtomicInt32 ¶
type AtomicInt32 int32
func (*AtomicInt32) Add ¶
func (i *AtomicInt32) Add(n int32) int32
func (*AtomicInt32) CompareAndSwap ¶
func (i *AtomicInt32) CompareAndSwap(oldval, newval int32) (swapped bool)
func (*AtomicInt32) Get ¶
func (i *AtomicInt32) Get() int32
func (*AtomicInt32) Set ¶
func (i *AtomicInt32) Set(n int32)
type AtomicInt64 ¶
type AtomicInt64 int64
func (*AtomicInt64) Add ¶
func (i *AtomicInt64) Add(n int64) int64
func (*AtomicInt64) CompareAndSwap ¶
func (i *AtomicInt64) CompareAndSwap(oldval, newval int64) (swapped bool)
func (*AtomicInt64) Get ¶
func (i *AtomicInt64) Get() int64
func (*AtomicInt64) Set ¶
func (i *AtomicInt64) Set(n int64)
type AtomicString ¶
type AtomicString struct {
// contains filtered or unexported fields
}
AtomicString gives you atomic-style APIs for string, but it's only a convenience wrapper that uses a mutex. So, it's not as efficient as the rest of the atomic types.
func (*AtomicString) CompareAndSwap ¶
func (s *AtomicString) CompareAndSwap(oldval, newval string) (swqpped bool)
func (*AtomicString) Get ¶
func (s *AtomicString) Get() string
func (*AtomicString) Set ¶
func (s *AtomicString) Set(str string)
type AtomicUint32 ¶
type AtomicUint32 uint32
func (*AtomicUint32) Add ¶
func (i *AtomicUint32) Add(n uint32) uint32
func (*AtomicUint32) CompareAndSwap ¶
func (i *AtomicUint32) CompareAndSwap(oldval, newval uint32) (swapped bool)
func (*AtomicUint32) Get ¶
func (i *AtomicUint32) Get() uint32
func (*AtomicUint32) Set ¶
func (i *AtomicUint32) Set(n uint32)
type Semaphore ¶
type Semaphore struct {
// contains filtered or unexported fields
}
Semaphore is a counting semaphore with the option to specify a timeout.
func NewSemaphore ¶
NewSemaphore creates a Semaphore. The count parameter must be a positive number. A timeout of zero means that there is no timeout.
func (*Semaphore) Release ¶
func (sem *Semaphore) Release()
Release releases the acquired semaphore. You must not release more than the number of semaphores you've acquired.
func (*Semaphore) TryAcquire ¶
TryAcquire acquires a semaphore if it's immediately available. It returns false otherwise.
type ServiceContext ¶
type ServiceContext struct { // ShuttingDown is a channel that the service can select on to be notified // when it should shut down. The channel is closed when the state transitions // from SERVICE_RUNNING to SERVICE_SHUTTING_DOWN. ShuttingDown chan struct{} }
ServiceContext is passed into the service function to give it access to information about the running service. You can create an empty service context, in which case it will be non-cancelable.
func (*ServiceContext) IsRunning ¶
func (svc *ServiceContext) IsRunning() bool
IsRunning returns true if the ServiceContext.ShuttingDown channel has not been closed yet.
type ServiceManager ¶
type ServiceManager struct {
// contains filtered or unexported fields
}
ServiceManager manages the state of a service through its lifecycle. It's not recommended to nest service managers because they introduce race conditions in the Stop functions that can cause one service to indefinitely wait for the other. You can instead pass the top level ServiceContext around and manage shutdown using the single ServiceManager.
func (*ServiceManager) Go ¶
func (svm *ServiceManager) Go(service func(svc *ServiceContext) error) bool
Go tries to change the state from SERVICE_STOPPED to SERVICE_RUNNING.
If the current state is not SERVICE_STOPPED (already running), it returns false immediately.
On successful transition, it launches the service as a goroutine and returns true. The service function is responsible for returning on its own when requested, either by regularly checking svc.IsRunning(), or by waiting for the svc.ShuttingDown channel to be closed.
When the service func returns, the state is reverted to SERVICE_STOPPED.
func (*ServiceManager) Join ¶
func (svm *ServiceManager) Join() error
Join waits for the service to terminate and returns the value returned by the service function.
func (*ServiceManager) State ¶
func (svm *ServiceManager) State() int64
State returns the current state of the service. This should only be used to report the current state.
func (*ServiceManager) StateName ¶
func (svm *ServiceManager) StateName() string
StateName returns the name of the current state.
func (*ServiceManager) Stop ¶
func (svm *ServiceManager) Stop() bool
Stop tries to change the state from SERVICE_RUNNING to SERVICE_SHUTTING_DOWN. If the current state is not SERVICE_RUNNING, it returns false immediately. On successul transition, it waits for the service to finish, and returns true. You are allowed to Go() again after a Stop().