@@ -539,28 +539,32 @@ func (r *registry) RegisterWorkflow(af interface{}) {
539539}
540540
541541func (r * registry ) RegisterWorkflowWithOptions (
542- af interface {},
542+ wf interface {},
543543 options RegisterWorkflowOptions ,
544544) {
545545 // Validate that it is a function
546- fnType := reflect .TypeOf (af )
546+ fnType := reflect .TypeOf (wf )
547547 if err := validateFnFormat (fnType , true ); err != nil {
548548 panic (err )
549549 }
550- fnName := getFunctionName (af )
550+ fnName := getFunctionName (wf )
551551 alias := options .Name
552552 registerName := fnName
553553 if len (alias ) > 0 {
554554 registerName = alias
555555 }
556+
557+ r .Lock ()
558+ defer r .Unlock ()
559+
556560 if ! options .DisableAlreadyRegisteredCheck {
557561 if _ , ok := r .workflowFuncMap [registerName ]; ok {
558562 panic (fmt .Sprintf ("workflow name \" %v\" is already registered" , registerName ))
559563 }
560564 }
561- r .addWorkflowFn ( registerName , af )
565+ r .workflowFuncMap [ registerName ] = wf
562566 if len (alias ) > 0 {
563- r .addWorkflowAlias ( fnName , alias )
567+ r .workflowAliasMap [ fnName ] = alias
564568 }
565569}
566570
@@ -594,20 +598,27 @@ func (r *registry) registerActivityFunction(af interface{}, options RegisterActi
594598 if len (alias ) > 0 {
595599 registerName = alias
596600 }
601+
602+ r .Lock ()
603+ defer r .Unlock ()
604+
597605 if ! options .DisableAlreadyRegisteredCheck {
598606 if _ , ok := r .activityFuncMap [registerName ]; ok {
599607 return fmt .Errorf ("activity type \" %v\" is already registered" , registerName )
600608 }
601609 }
602- r .addActivityFn ( registerName , af )
610+ r .activityFuncMap [ registerName ] = & activityExecutor { registerName , af }
603611 if len (alias ) > 0 {
604- r .addActivityAlias ( fnName , alias )
612+ r .activityAliasMap [ fnName ] = alias
605613 }
606614
607615 return nil
608616}
609617
610618func (r * registry ) registerActivityStruct (aStruct interface {}, options RegisterActivityOptions ) error {
619+ r .Lock ()
620+ defer r .Unlock ()
621+
611622 structValue := reflect .ValueOf (aStruct )
612623 structType := structValue .Type ()
613624 count := 0
@@ -629,11 +640,11 @@ func (r *registry) registerActivityStruct(aStruct interface{}, options RegisterA
629640 }
630641 registerName = prefix + name
631642 if ! options .DisableAlreadyRegisteredCheck {
632- if _ , ok := r .getActivityFn (registerName ); ok {
643+ if _ , ok := r .getActivityNoLock (registerName ); ok {
633644 return fmt .Errorf ("activity type \" %v\" is already registered" , registerName )
634645 }
635646 }
636- r .addActivityFn ( registerName , methodValue .Interface ())
647+ r .activityFuncMap [ registerName ] = & activityExecutor { registerName , methodValue .Interface ()}
637648 count ++
638649 }
639650
@@ -644,12 +655,6 @@ func (r *registry) registerActivityStruct(aStruct interface{}, options RegisterA
644655 return nil
645656}
646657
647- func (r * registry ) addWorkflowAlias (fnName string , alias string ) {
648- r .Lock ()
649- defer r .Unlock ()
650- r .workflowAliasMap [fnName ] = alias
651- }
652-
653658func (r * registry ) getWorkflowAlias (fnName string ) (string , bool ) {
654659 r .Lock () // do not defer for Unlock to call next.getWorkflowAlias without lock
655660 alias , ok := r .workflowAliasMap [fnName ]
@@ -661,12 +666,6 @@ func (r *registry) getWorkflowAlias(fnName string) (string, bool) {
661666 return alias , ok
662667}
663668
664- func (r * registry ) addWorkflowFn (fnName string , wf interface {}) {
665- r .Lock ()
666- defer r .Unlock ()
667- r .workflowFuncMap [fnName ] = wf
668- }
669-
670669func (r * registry ) getWorkflowFn (fnName string ) (interface {}, bool ) {
671670 r .Lock () // do not defer for Unlock to call next.getWorkflowFn without lock
672671 fn , ok := r .workflowFuncMap [fnName ]
@@ -692,12 +691,6 @@ func (r *registry) getRegisteredWorkflowTypes() []string {
692691 return result
693692}
694693
695- func (r * registry ) addActivityAlias (fnName string , alias string ) {
696- r .Lock ()
697- defer r .Unlock ()
698- r .activityAliasMap [fnName ] = alias
699- }
700-
701694func (r * registry ) getActivityAlias (fnName string ) (string , bool ) {
702695 r .Lock () // do not defer for Unlock to call next.getActivityAlias without lock
703696 alias , ok := r .activityAliasMap [fnName ]
@@ -709,32 +702,30 @@ func (r *registry) getActivityAlias(fnName string) (string, bool) {
709702 return alias , ok
710703}
711704
712- func (r * registry ) addActivity (fnName string , a activity ) {
705+ // Use in unit test only, otherwise deadlock will occur.
706+ func (r * registry ) addActivityWithLock (fnName string , a activity ) {
713707 r .Lock ()
714708 defer r .Unlock ()
715709 r .activityFuncMap [fnName ] = a
716710}
717711
718- func (r * registry ) addActivityFn (fnName string , af interface {}) {
719- r .addActivity (fnName , & activityExecutor {fnName , af })
720- }
721-
722- func (r * registry ) getActivity (fnName string ) (activity , bool ) {
723- r .Lock () // do not defer for Unlock to call next.getActivity without lock
712+ func (r * registry ) GetActivity (fnName string ) (activity , bool ) {
713+ r .Lock () // do not defer for Unlock to call next.GetActivity without lock
724714 a , ok := r .activityFuncMap [fnName ]
725715 if ! ok && r .next != nil {
726716 r .Unlock ()
727- return r .next .getActivity (fnName )
717+ return r .next .GetActivity (fnName )
728718 }
729719 r .Unlock ()
730720 return a , ok
731721}
732722
733- func (r * registry ) getActivityFn (fnName string ) (interface {}, bool ) {
734- if a , ok := r .getActivity (fnName ); ok {
735- return a .GetFunction (), ok
723+ func (r * registry ) getActivityNoLock (fnName string ) (activity , bool ) {
724+ a , ok := r .activityFuncMap [fnName ]
725+ if ! ok && r .next != nil {
726+ return r .next .getActivityNoLock (fnName )
736727 }
737- return nil , false
728+ return a , ok
738729}
739730
740731func (r * registry ) getRegisteredActivities () []activity {
0 commit comments