Guest User

deadlock in chained request

a guest
Aug 31st, 2016
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1.  
  2. #include <Wt/WServer>
  3. #include <Wt/WResource>
  4. #include <Wt/Http/Client>
  5. #include <Wt/Http/Response>
  6.  
  7. #include <memory>
  8. #include <atomic>
  9.  
  10. #include <Wt/Http/Client>
  11. #include <Wt/Http/Response>
  12. #include <atomic>
  13.  
  14. // $ while [ "$(curl -s 'http://localhost/TestCase')" == "done" ]; do   echo -n '.';   sleep 1; done
  15. class TestCase : public Wt::WResource {
  16. public:
  17.    TestCase (Wt::WServer& server) :server(server) { }
  18.    ~TestCase () { beingDeleted(); }
  19.  
  20.    void handleRequest (const Wt::Http::Request& request, Wt::Http::Response& response) override
  21.    {
  22.       const auto& parameterMap = request.getParameterMap();
  23.       auto send = parameterMap.find("secondCall") == parameterMap.end();
  24.  
  25.       if (send) {
  26.          SimulationOfSomeCalculationInAnExternalSystemThatConnectsBack();
  27.       }
  28.  
  29.       response.out().write("done", 4);
  30.    }
  31.  
  32. private:
  33.    Wt::WServer& server;
  34.  
  35.    void SimulationOfSomeCalculationInAnExternalSystemThatConnectsBack ()
  36.    {
  37.       std::atomic<bool> done = false;
  38.       auto client = std::make_unique<Wt::Http::Client>();
  39.  
  40.       client->done().connect([&] (boost::system::error_code err, const Http::Message& /*response*/, ...) {
  41.          if (err) server.log("error") << err.message();
  42.          done = true;
  43.       });
  44.  
  45.       //if (client->get("http://localhost/TestCase?secondCall=true")) {
  46.       if (client->get("http://localhost/TestCase2?secondCall=true")) {
  47.          while (!done) {
  48.             boost::this_thread::sleep_for(boost::chrono::milliseconds{20});
  49.          }
  50.       }
  51.       else {
  52.          server.log("error") << "something is wrong with the url";
  53.       }
  54.    }
  55. };
  56.  
  57.  
  58.  
  59. int main (int argc, char** argv)
  60. {
  61.    Wt::WServer wserver{argc, argv};
  62.  
  63.    TestCase testcase(wserver);
  64.    wserver.addResource(&testcase, "/TestCase");
  65.  
  66.    TestCase testcase2(wserver);
  67.    wserver.addResource(&testcase2, "/TestCase2");
  68.  
  69.    wserver.run();
  70.  
  71.    return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment