NOT-OMEGA commited on
Commit
137eca0
·
verified ·
1 Parent(s): 57717e8

Update include/Orderbook.h

Browse files
Files changed (1) hide show
  1. include/Orderbook.h +13 -21
include/Orderbook.h CHANGED
@@ -15,18 +15,6 @@
15
  #include "Types.h"
16
  #include "Order.h"
17
  #include "Trade.h"
18
- #include "MemoryPool.h"
19
-
20
- // GLOBAL MEMORY POOL (25M capacity)
21
- extern ObjectPool<Order, 25000000> g_OrderPool;
22
-
23
- // CUSTOM SPINLOCK (To avoid OS context switch)
24
- class SpinLock {
25
- std::atomic_flag flag = ATOMIC_FLAG_INIT;
26
- public:
27
- void lock() { while(flag.test_and_set(std::memory_order_acquire)) { /* spin */ } }
28
- void unlock() { flag.clear(std::memory_order_release); }
29
- };
30
 
31
  class Orderbook {
32
  public:
@@ -41,10 +29,12 @@ public:
41
  Orderbook(Orderbook&&) = delete;
42
  Orderbook& operator=(Orderbook&&) = delete;
43
 
 
44
  Trades AddOrder (OrderPointer order);
45
  void CancelOrder(OrderId orderId);
46
  Trades ModifyOrder(OrderModify order);
47
 
 
48
  std::size_t Size() const;
49
  bool HasOrder(OrderId) const;
50
  OrderbookSnapshot GetSnapshot() const;
@@ -53,14 +43,16 @@ public:
53
  Price MidPrice() const;
54
  Price Spread() const;
55
 
 
56
  uint64_t GetTotalOrders() const noexcept { return stats_.totalOrders.load(); }
57
  uint64_t GetTotalTrades() const noexcept { return stats_.totalTrades.load(); }
58
  uint64_t GetTotalCancels() const noexcept { return stats_.totalCancels.load(); }
59
  uint64_t GetTotalVolume() const noexcept { return stats_.totalVolume.load(); }
60
  uint64_t GetSequenceNumber() const noexcept { return stats_.seqNum.load(); }
61
 
62
- void SetOnTrade(OnTradeCallback cb) { onTrade_ = std::move(cb); }
63
- void SetOnOrderAdded(OnOrderCallback cb) { onAdded_ = std::move(cb); }
 
64
  void SetOnOrderCancelled(OnOrderCallback cb) { onCancelled_ = std::move(cb); }
65
 
66
  void CheckAndTriggerStops(Price lastTrade);
@@ -84,10 +76,7 @@ private:
84
  std::multimap<Price, OrderPointer> stopBuys_;
85
  std::multimap<Price, OrderPointer, std::greater<Price>> stopSells_;
86
 
87
- // USING SPINLOCK INSTEAD OF MUTEX
88
- mutable SpinLock ordersMutex_;
89
- std::mutex cvMutex_; // Only for sleep/CV
90
-
91
  std::thread pruneThread_;
92
  std::condition_variable shutdownCV_;
93
  std::atomic<bool> shutdown_{false};
@@ -110,6 +99,11 @@ private:
110
  void CancelOrdersInternal(const OrderIds& ids);
111
  void CancelOrderInternal (OrderId orderId);
112
 
 
 
 
 
 
113
  bool CanMatch (Side side, Price price) const;
114
  bool CanFullyFill (Side side, Price price, Quantity qty) const;
115
 
@@ -120,6 +114,4 @@ private:
120
  void OnOrderAdded (OrderPointer order);
121
  void OnOrderCancelled (OrderPointer order);
122
  void OnOrderMatched (Price price, Quantity qty, bool fullyFilled);
123
- };
124
-
125
- }
 
15
  #include "Types.h"
16
  #include "Order.h"
17
  #include "Trade.h"
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
  class Orderbook {
20
  public:
 
29
  Orderbook(Orderbook&&) = delete;
30
  Orderbook& operator=(Orderbook&&) = delete;
31
 
32
+ // ─── Core API ─────────────────────────────────────────────────────────────
33
  Trades AddOrder (OrderPointer order);
34
  void CancelOrder(OrderId orderId);
35
  Trades ModifyOrder(OrderModify order);
36
 
37
+ // ─── Query API ────────────────────────────────────────────────────────────
38
  std::size_t Size() const;
39
  bool HasOrder(OrderId) const;
40
  OrderbookSnapshot GetSnapshot() const;
 
43
  Price MidPrice() const;
44
  Price Spread() const;
45
 
46
+ // ─── Statistics ───────────────────────────────────────────────────────────
47
  uint64_t GetTotalOrders() const noexcept { return stats_.totalOrders.load(); }
48
  uint64_t GetTotalTrades() const noexcept { return stats_.totalTrades.load(); }
49
  uint64_t GetTotalCancels() const noexcept { return stats_.totalCancels.load(); }
50
  uint64_t GetTotalVolume() const noexcept { return stats_.totalVolume.load(); }
51
  uint64_t GetSequenceNumber() const noexcept { return stats_.seqNum.load(); }
52
 
53
+ // ─── Event Hooks ──────────────────────────────────────────────────────────
54
+ void SetOnTrade(OnTradeCallback cb) { onTrade_ = std::move(cb); }
55
+ void SetOnOrderAdded(OnOrderCallback cb) { onAdded_ = std::move(cb); }
56
  void SetOnOrderCancelled(OnOrderCallback cb) { onCancelled_ = std::move(cb); }
57
 
58
  void CheckAndTriggerStops(Price lastTrade);
 
76
  std::multimap<Price, OrderPointer> stopBuys_;
77
  std::multimap<Price, OrderPointer, std::greater<Price>> stopSells_;
78
 
79
+ mutable std::mutex ordersMutex_;
 
 
 
80
  std::thread pruneThread_;
81
  std::condition_variable shutdownCV_;
82
  std::atomic<bool> shutdown_{false};
 
99
  void CancelOrdersInternal(const OrderIds& ids);
100
  void CancelOrderInternal (OrderId orderId);
101
 
102
+ // BUG FIX: Internal add/match that assumes mutex is already held.
103
+ // Required to fix the deadlock in CheckAndTriggerStops and the race
104
+ // condition in ModifyOrder.
105
+ Trades AddOrderInternal(OrderPointer order);
106
+
107
  bool CanMatch (Side side, Price price) const;
108
  bool CanFullyFill (Side side, Price price, Quantity qty) const;
109
 
 
114
  void OnOrderAdded (OrderPointer order);
115
  void OnOrderCancelled (OrderPointer order);
116
  void OnOrderMatched (Price price, Quantity qty, bool fullyFilled);
117
+ };