@@ -353,6 +353,60 @@ namespace NActors {
353
353
void DoActorInit () { LastUsageTimestamp = GetCycleCountFast (); }
354
354
};
355
355
356
+ class TActorActivityType {
357
+ public:
358
+ TActorActivityType ()
359
+ : TActorActivityType(FromEnum(EInternalActorType::OTHER))
360
+ {}
361
+
362
+ template <typename EEnum>
363
+ static TActorActivityType FromEnum (EEnum activityType) requires (std::is_enum_v<EEnum>) {
364
+ return FromIndex (TEnumProcessKey<TActorActivityTag, EEnum>::GetIndex (activityType));
365
+ }
366
+
367
+ static TActorActivityType FromName (TStringBuf activityName) {
368
+ return FromIndex (TLocalProcessKeyState<TActorActivityTag>::GetInstance ().Register (activityName));
369
+ }
370
+
371
+ template <const char * Name>
372
+ static TActorActivityType FromStaticName () {
373
+ return FromIndex (TLocalProcessKey<TActorActivityTag, Name>::GetIndex ());
374
+ }
375
+
376
+ template <typename T>
377
+ static TActorActivityType FromTypeName () {
378
+ // 200 characters is limit for solomon metric tag length
379
+ return FromIndex (TLocalProcessExtKey<TActorActivityTag, T, 200 >::GetIndex ());
380
+ }
381
+
382
+ static constexpr TActorActivityType FromIndex (size_t index) {
383
+ return TActorActivityType (index);
384
+ }
385
+
386
+ constexpr ui32 GetIndex () const {
387
+ return Index;
388
+ }
389
+
390
+ TStringBuf GetName () const {
391
+ return TLocalProcessKeyState<TActorActivityTag>::GetInstance ().GetNameByIndex (Index);
392
+ }
393
+
394
+ friend constexpr bool operator ==(TActorActivityType a, TActorActivityType b) = default ;
395
+
396
+ template <typename EEnum>
397
+ friend bool operator ==(TActorActivityType a, EEnum b) requires (std::is_enum_v<EEnum>) {
398
+ return a == FromEnum (b);
399
+ }
400
+
401
+ private:
402
+ explicit constexpr TActorActivityType (ui32 index)
403
+ : Index(index)
404
+ {}
405
+
406
+ private:
407
+ ui32 Index;
408
+ };
409
+
356
410
class IActor
357
411
: protected IActorOps
358
412
, public TActorUsageImpl<ActorLibCollectUsageStats>
@@ -374,13 +428,6 @@ namespace NActors {
374
428
friend class TExecutorPoolBaseMailboxed ;
375
429
friend class TExecutorThread ;
376
430
377
- IActor (const ui32 activityType)
378
- : SelfActorId(TActorId())
379
- , ElapsedTicks(0 )
380
- , ActivityType(activityType)
381
- , HandledEvents(0 ) {
382
- }
383
-
384
431
protected:
385
432
TActorCallbackBehaviour CImpl;
386
433
public:
@@ -389,29 +436,34 @@ namespace NActors {
389
436
// / @sa services.proto NKikimrServices::TActivity::EType
390
437
using EActorActivity = EInternalActorType;
391
438
using EActivityType = EActorActivity;
392
- ui32 ActivityType;
439
+ TActorActivityType ActivityType;
393
440
394
441
protected:
395
442
ui64 HandledEvents;
396
443
397
- template <typename EEnum = EActivityType, typename std::enable_if<std::is_enum<EEnum>::value, bool >::type v = true >
398
- IActor (const EEnum activityEnumType = EActivityType::OTHER)
399
- : IActor(TEnumProcessKey<TActorActivityTag, EEnum>::GetIndex(activityEnumType)) {
400
- }
444
+ IActor (TActorActivityType activityType = {})
445
+ : SelfActorId(TActorId())
446
+ , ElapsedTicks(0 )
447
+ , ActivityType(activityType)
448
+ , HandledEvents(0 )
449
+ {}
401
450
402
- IActor (TActorCallbackBehaviour&& cImpl, const ui32 activityType)
451
+ IActor (TActorCallbackBehaviour&& cImpl, TActorActivityType activityType = {} )
403
452
: SelfActorId(TActorId())
404
453
, ElapsedTicks(0 )
405
454
, CImpl(std::move(cImpl))
406
455
, ActivityType(activityType)
407
456
, HandledEvents(0 )
408
- {
409
- }
457
+ {}
410
458
411
- template <typename EEnum = EActivityType, typename std::enable_if<std::is_enum<EEnum>::value, bool >::type v = true >
412
- IActor (TActorCallbackBehaviour&& cImpl, const EEnum activityEnumType = EActivityType::OTHER)
413
- : IActor(std::move(cImpl), TEnumProcessKey<TActorActivityTag, EEnum>::GetIndex(activityEnumType)) {
414
- }
459
+ template <typename EEnum>
460
+ IActor (TActorCallbackBehaviour&& cImpl, EEnum activityType) requires (std::is_enum_v<EEnum>)
461
+ : IActor(std::move(cImpl), TActorActivityType::FromEnum(activityType))
462
+ {}
463
+
464
+ IActor (TActorCallbackBehaviour&& cImpl, TStringBuf activityName)
465
+ : IActor(std::move(cImpl), TActorActivityType::FromName(activityName))
466
+ {}
415
467
416
468
public:
417
469
template <class TEventBase >
@@ -463,10 +515,19 @@ namespace NActors {
463
515
virtual void PassAway ();
464
516
465
517
protected:
466
- void SetActivityType (ui32 activityType) {
518
+ void SetActivityType (TActorActivityType activityType) {
467
519
ActivityType = activityType;
468
520
}
469
521
522
+ template <typename EEnum>
523
+ void SetActivityType (EEnum activityType) requires (std::is_enum_v<EEnum>) {
524
+ ActivityType = TActorActivityType::FromEnum (activityType);
525
+ }
526
+
527
+ void SetActivityType (TStringBuf activityName) {
528
+ ActivityType = TActorActivityType::FromName (activityName);
529
+ }
530
+
470
531
public:
471
532
class TPassAwayGuard : TMoveOnly {
472
533
private:
@@ -531,7 +592,7 @@ namespace NActors {
531
592
void AddElapsedTicks (i64 ticks) {
532
593
ElapsedTicks += ticks;
533
594
}
534
- ui32 GetActivityType () const {
595
+ TActorActivityType GetActivityType () const {
535
596
return ActivityType;
536
597
}
537
598
ui64 GetHandledEvents () const {
@@ -639,18 +700,20 @@ namespace NActors {
639
700
return TLocalProcessKeyState<TActorActivityTag>::GetInstance ().GetNameByIndex (index);
640
701
}
641
702
703
+ inline TStringBuf GetActivityTypeName (TActorActivityType activityType) {
704
+ return activityType.GetName ();
705
+ }
706
+
642
707
class IActorCallback : public IActor {
643
708
protected:
644
- template <class TEnum = IActor::EActivityType>
645
- IActorCallback (TReceiveFunc stateFunc, const TEnum activityType = IActor::EActivityType::OTHER)
646
- : IActor(TActorCallbackBehaviour(stateFunc), activityType) {
647
-
648
- }
649
-
650
- IActorCallback (TReceiveFunc stateFunc, const ui32 activityType)
651
- : IActor(TActorCallbackBehaviour(stateFunc), activityType) {
709
+ IActorCallback (TReceiveFunc stateFunc)
710
+ : IActor(TActorCallbackBehaviour(stateFunc))
711
+ {}
652
712
653
- }
713
+ template <typename T>
714
+ IActorCallback (TReceiveFunc stateFunc, T&& activityType)
715
+ : IActor(TActorCallbackBehaviour(stateFunc), std::forward<T>(activityType))
716
+ {}
654
717
655
718
public:
656
719
template <typename T>
@@ -679,49 +742,32 @@ namespace NActors {
679
742
private:
680
743
using TDerivedReceiveFunc = void (TDerived::*)(TAutoPtr<IEventHandle>& ev);
681
744
682
- template <typename T, typename = const char *>
683
- struct HasActorName : std::false_type {};
684
- template <typename T>
685
- struct HasActorName <T, decltype ((void )T::ActorName, (const char *)nullptr )>: std::true_type {};
686
-
687
- template <typename T, typename = const char *>
688
- struct HasActorActivityType : std::false_type {};
689
- template <typename T>
690
- struct HasActorActivityType <T, decltype ((void )T::ActorActivityType, (const char *)nullptr )>: std::true_type {};
691
-
692
- static ui32 GetActivityTypeIndexImpl () {
693
- if constexpr (HasActorName<TDerived>::value) {
694
- return TLocalProcessKey<TActorActivityTag, TDerived::ActorName>::GetIndex ();
695
- } else if constexpr (HasActorActivityType<TDerived>::value) {
696
- using TActorActivity = decltype (((TDerived*)nullptr )->ActorActivityType ());
697
- static_assert (std::is_enum<TActorActivity>::value);
698
- return TEnumProcessKey<TActorActivityTag, TActorActivity>::GetIndex (TDerived::ActorActivityType ());
745
+ static TActorActivityType GetDefaultActivityTypeImpl () {
746
+ if constexpr (requires { TDerived::ActorName; }) {
747
+ return TActorActivityType::FromStaticName<TDerived::ActorName>();
748
+ } else if constexpr (requires { TDerived::ActorActivityType; }) {
749
+ return TActorActivityType::FromEnum (TDerived::ActorActivityType ());
699
750
} else {
700
- // 200 characters is limit for solomon metric tag length
701
- return TLocalProcessExtKey<TActorActivityTag, TDerived, 200 >::GetIndex ();
751
+ return TActorActivityType::FromTypeName<TDerived>();
702
752
}
703
753
}
704
754
705
- static ui32 GetActivityTypeIndex () {
706
- static const ui32 result = GetActivityTypeIndexImpl ();
755
+ static TActorActivityType GetDefaultActivityType () {
756
+ static const TActorActivityType result = GetDefaultActivityTypeImpl ();
707
757
return result;
708
758
}
709
759
710
760
protected:
711
761
// static constexpr char ActorName[] = "UNNAMED";
712
762
713
763
TActor (TDerivedReceiveFunc func)
714
- : IActorCallback(static_cast <TReceiveFunc>(func), GetActivityTypeIndex ()) {
715
- }
764
+ : IActorCallback(static_cast <TReceiveFunc>(func), GetDefaultActivityType ())
765
+ { }
716
766
717
- template <class TEnum = EActivityType>
718
- TActor (TDerivedReceiveFunc func, const TEnum activityEnumType = EActivityType::OTHER)
719
- : IActorCallback(static_cast <TReceiveFunc>(func), activityEnumType) {
720
- }
721
-
722
- TActor (TDerivedReceiveFunc func, const TString& actorName)
723
- : IActorCallback(static_cast <TReceiveFunc>(func), TLocalProcessKeyState<TActorActivityTag>::GetInstance().Register(actorName)) {
724
- }
767
+ template <typename T>
768
+ TActor (TDerivedReceiveFunc func, T&& activityType)
769
+ : IActorCallback(static_cast <TReceiveFunc>(func), std::forward<T>(activityType))
770
+ {}
725
771
726
772
public:
727
773
typedef TDerived TThis;
0 commit comments