libhv_bindings.hpp 1.1 KB

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