poller_actor.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #pragma once
  2. #include "events_local.h"
  3. #include "poller.h"
  4. #include <library/cpp/actors/core/actor.h>
  5. namespace NActors {
  6. struct TEvPollerRegister : TEventLocal<TEvPollerRegister, ui32(ENetwork::EvPollerRegister)> {
  7. const TIntrusivePtr<TSharedDescriptor> Socket; // socket to watch for
  8. const TActorId ReadActorId; // actor id to notify about read availability
  9. const TActorId WriteActorId; // actor id to notify about write availability; may be the same as the ReadActorId
  10. TEvPollerRegister(TIntrusivePtr<TSharedDescriptor> socket, const TActorId& readActorId, const TActorId& writeActorId)
  11. : Socket(std::move(socket))
  12. , ReadActorId(readActorId)
  13. , WriteActorId(writeActorId)
  14. {}
  15. };
  16. // poller token is sent in response to TEvPollerRegister; it allows requesting poll when read/write returns EAGAIN
  17. class TPollerToken : public TThrRefBase {
  18. class TImpl;
  19. std::unique_ptr<TImpl> Impl;
  20. friend class TPollerActor;
  21. TPollerToken(std::unique_ptr<TImpl> impl);
  22. public:
  23. ~TPollerToken();
  24. void Request(bool read, bool write);
  25. using TPtr = TIntrusivePtr<TPollerToken>;
  26. };
  27. struct TEvPollerRegisterResult : TEventLocal<TEvPollerRegisterResult, ui32(ENetwork::EvPollerRegisterResult)> {
  28. TIntrusivePtr<TSharedDescriptor> Socket;
  29. TPollerToken::TPtr PollerToken;
  30. TEvPollerRegisterResult(TIntrusivePtr<TSharedDescriptor> socket, TPollerToken::TPtr pollerToken)
  31. : Socket(std::move(socket))
  32. , PollerToken(std::move(pollerToken))
  33. {}
  34. };
  35. struct TEvPollerReady : TEventLocal<TEvPollerReady, ui32(ENetwork::EvPollerReady)> {
  36. TIntrusivePtr<TSharedDescriptor> Socket;
  37. const bool Read, Write;
  38. TEvPollerReady(TIntrusivePtr<TSharedDescriptor> socket, bool read, bool write)
  39. : Socket(std::move(socket))
  40. , Read(read)
  41. , Write(write)
  42. {}
  43. };
  44. IActor* CreatePollerActor();
  45. inline TActorId MakePollerActorId() {
  46. char x[12] = {'I', 'C', 'P', 'o', 'l', 'l', 'e', 'r', '\xDE', '\xAD', '\xBE', '\xEF'};
  47. return TActorId(0, TStringBuf(std::begin(x), std::end(x)));
  48. }
  49. }