-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgoactor.go
93 lines (77 loc) · 2.14 KB
/
goactor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package goactor
import (
"fmt"
"github.com/hedisam/goactor/internal/intlpid"
"github.com/hedisam/goactor/internal/relations"
"github.com/hedisam/goactor/mailbox"
p "github.com/hedisam/goactor/pid"
"github.com/hedisam/goactor/process"
)
func DefaultQueueMailbox() Mailbox {
return mailbox.NewQueueMailbox(
mailbox.DefaultUserMailboxCap,
mailbox.DefaultSysMailboxCap,
mailbox.DefaultMailboxTimeout,
mailbox.DefaultGoSchedulerInterval)
}
var DefaultChanMailbox = func() Mailbox {
return mailbox.NewChanMailbox(
mailbox.DefaultUserMailboxCap,
mailbox.DefaultSysMailboxCap,
mailbox.DefaultMailboxTimeout)
}
func NewParentActor(mailboxBuilder MailboxBuilderFunc) (*Actor, func()) {
actor, _ := setupActor(mailboxBuilder)
return actor, actor.dispose
}
func NewFutureActor() *FutureActor {
return setupFutureActor()
}
func Spawn(fn ActorFunc, mailboxBuilder MailboxBuilderFunc) *p.PID {
actor, pid := setupActor(mailboxBuilder)
go spawn(fn, actor)
return pid
}
func Send(pid *p.PID, msg interface{}) error {
if pid == nil {
return ErrSendNilPID
}
if pid.IsSupervisor() {
return ErrSendToSupervisor
}
err := intlpid.SendMessage(pid.InternalPID(), msg)
if err != nil {
return fmt.Errorf("send failed: %w", err)
}
return nil
}
func SendNamed(name string, msg interface{}) error {
pid, ok := process.WhereIs(name)
if !ok {
return ErrSendNameNotFound
}
return Send(pid, msg)
}
func setupActor(mailboxBuilder MailboxBuilderFunc) (*Actor, *p.PID) {
if mailboxBuilder == nil {
mailboxBuilder = DefaultQueueMailbox
}
m := mailboxBuilder()
relationManager := relations.NewRelation()
actor := newActor(m, relationManager)
localPID := intlpid.NewLocalPID(m, relationManager, false, actor.shutdown)
pid := p.ToPID(localPID)
actor.self = pid
return actor, pid
}
func setupFutureActor() *FutureActor {
noShutdown := func() {}
m := mailbox.NewQueueMailbox(1, 1, mailbox.DefaultMailboxTimeout, mailbox.DefaultGoSchedulerInterval)
localPID := intlpid.NewLocalPID(m, nil, false, noShutdown)
featureActor := newFutureActor(m, localPID)
return featureActor
}
func spawn(fn ActorFunc, actor *Actor) {
defer actor.dispose()
fn(actor)
}