Oh man... It is not working correclty even with one client... Same problem with segmentation fault.
среда, 22 марта 2023 г. в 01:12:55 UTC+3, Dmitry Gorelov: > Hi All, > > please help to modify this peace of server code for bidirectional stream > in order to make it work correclty with *multiple clients* at one time. > Currently it crashes with segmentation fault in the proto_utils.h. > > class RouteGuideImpl final : public RouteGuide::CallbackService { > public: > explicit RouteGuideImpl(const std::string& db) { > routeguide::ParseDb(db, &feature_list_); > } > > grpc::ServerBidiReactor<RouteNote, RouteNote>* RouteChat( > CallbackServerContext* context) override { > class Chatter : public grpc::ServerBidiReactor<RouteNote, RouteNote> { > public: > Chatter(absl::Mutex* mu, std::vector<RouteNote>* received_notes) > : mu_(mu), received_notes_(received_notes) { > StartRead(¬e_); > } > > void OnDone() override { delete this; } > void OnReadDone(bool ok) override { > if (ok) { > // Unlike the other example in this directory that's not using > // the reactor pattern, we can't grab a local lock to secure the > // access to the notes vector, because the reactor will most > likely > // make us jump threads, so we'll have to use a different locking > // strategy. We'll grab the lock locally to build a copy of the > // list of nodes we're going to send, then we'll grab the lock > // again to append the received note to the existing vector. > mu_->Lock(); > std::copy_if(received_notes_->begin(), received_notes_->end(), > std::back_inserter(to_send_notes_), > [this](const RouteNote& note) { > return note.location().latitude() == > note_.location().latitude() && > note.location().longitude() == > note_.location().longitude(); > }); > mu_->Unlock(); > notes_iterator_ = to_send_notes_.begin(); > NextWrite(); > } else { > std::cout << "some client finished" << std::endl; > Finish(Status::OK); > } > } > void OnWriteDone(bool /*ok*/) override { NextWrite(); } > > private: > void NextWrite() { > if (notes_iterator_ != to_send_notes_.end()) { > StartWrite(&*notes_iterator_); > notes_iterator_++; > } else { > mu_->Lock(); > received_notes_->push_back(note_); > mu_->Unlock(); > StartRead(¬e_); > } > } > RouteNote note_; > absl::Mutex* mu_; > std::vector<RouteNote>* received_notes_; > std::vector<RouteNote> to_send_notes_; > std::vector<RouteNote>::iterator notes_iterator_; > }; > return new Chatter(&mu_, &received_notes_); > } > > private: > std::vector<Feature> feature_list_; > absl::Mutex mu_; > std::vector<RouteNote> received_notes_ ABSL_GUARDED_BY(mu_); > }; > -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to grpc-io+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/af0ecca3-eaa0-4005-92f0-8741e5583173n%40googlegroups.com.