actor_child.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package mhayaActor
  2. import (
  3. "strings"
  4. "sync"
  5. cfacade "github.com/mhaya/facade"
  6. )
  7. type actorChild struct {
  8. thisActor *Actor
  9. childActors *sync.Map // key:childActorId, value:*actor
  10. }
  11. func newChild(thisActor *Actor) actorChild {
  12. return actorChild{
  13. thisActor: thisActor,
  14. childActors: &sync.Map{},
  15. }
  16. }
  17. func (p *actorChild) onStop() {
  18. p.childActors.Range(func(key, value any) bool {
  19. if childActor, ok := value.(*Actor); ok {
  20. childActor.Exit()
  21. }
  22. return true
  23. })
  24. //p.childActors = nil
  25. p.thisActor = nil
  26. }
  27. func (p *actorChild) Create(childID string, handler cfacade.IActorHandler) (cfacade.IActor, error) {
  28. if p.thisActor.path.IsChild() {
  29. return nil, ErrForbiddenCreateChildActor
  30. }
  31. if strings.TrimSpace(childID) == "" {
  32. return nil, ErrActorIDIsNil
  33. }
  34. if thisActor, ok := p.Get(childID); ok {
  35. return thisActor, nil
  36. }
  37. childActor, err := newActor(p.thisActor.ActorID(), childID, handler, p.thisActor.system)
  38. if err != nil {
  39. return nil, err
  40. }
  41. p.childActors.Store(childID, &childActor)
  42. go childActor.run()
  43. return &childActor, nil
  44. }
  45. func (p *actorChild) Get(childID string) (cfacade.IActor, bool) {
  46. return p.GetActor(childID)
  47. }
  48. func (p *actorChild) GetActor(childID string) (*Actor, bool) {
  49. if actorValue, ok := p.childActors.Load(childID); ok {
  50. actor, found := actorValue.(*Actor)
  51. return actor, found
  52. }
  53. return nil, false
  54. }
  55. func (p *actorChild) Remove(childID string) {
  56. p.childActors.Delete(childID)
  57. }
  58. func (p *actorChild) Each(fn func(cfacade.IActor)) {
  59. p.childActors.Range(func(key, value any) bool {
  60. if actor, found := value.(*Actor); found {
  61. fn(actor)
  62. }
  63. return true
  64. })
  65. }