libhv_bindings.hpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #pragma once
  2. #include "pocketpy.h"
  3. #include "http/HttpMessage.h"
  4. #include "base/hplatform.h"
  5. #include "pocketpy/common/name.h"
  6. extern "C" void pk__add_module_libhv();
  7. void libhv_HttpRequest_create(py_OutRef out, HttpRequestPtr ptr);
  8. py_Type libhv_register_HttpRequest(py_GlobalRef mod);
  9. py_Type libhv_register_HttpClient(py_GlobalRef mod);
  10. py_Type libhv_register_HttpServer(py_GlobalRef mod);
  11. py_Type libhv_register_WebSocketClient(py_GlobalRef mod);
  12. #include <deque>
  13. #include <atomic>
  14. #include <thread>
  15. template <typename T>
  16. class libhv_MQ {
  17. private:
  18. std::atomic<bool> lock;
  19. std::deque<T> queue;
  20. public:
  21. void push(T msg) {
  22. while(lock.exchange(true)) {
  23. std::this_thread::yield();
  24. }
  25. queue.push_back(msg);
  26. lock.store(false);
  27. }
  28. bool pop(T* msg) {
  29. while(lock.exchange(true)) {
  30. std::this_thread::yield();
  31. }
  32. if(queue.empty()) {
  33. lock.store(false);
  34. return false;
  35. }
  36. *msg = queue.front();
  37. queue.pop_front();
  38. lock.store(false);
  39. return true;
  40. }
  41. };
  42. enum class WsMessageType {
  43. onopen,
  44. onclose,
  45. onmessage,
  46. };