| 203 | |
| 204 | public: |
| 205 | THandleRef Request(const TRequest& request) override { |
| 206 | TIntrusivePtr<TRequestSupervisor> rs(new TRequestSupervisor(request, this)); |
| 207 | THandleRef h; |
| 208 | try { |
| 209 | rs->Ref(); |
| 210 | h = NNeh::Request(request.Msg, rs.Get()); |
| 211 | //accurately handle race when processing new request event |
| 212 | //(we already can receive response (call OnNotify) before we schedule info about new request here) |
| 213 | } catch (...) { |
| 214 | rs->UnRef(); |
| 215 | throw; |
| 216 | } |
| 217 | rs->OnMakeRequest(h); |
| 218 | ScheduleRequest(rs, h, request.Deadline); |
| 219 | return h; |
| 220 | } |
| 221 | |
| 222 | bool Wait(TEvent& ev, const TInstant deadline_ = TInstant::Max()) override { |
| 223 | while (!Interrupt_) { |