@@ -36,7 +36,6 @@ class WasmVm;
3636
3737using Pairs = std::vector<std::pair<string_view, string_view>>;
3838using PairsWithStringValues = std::vector<std::pair<string_view, std::string>>;
39- using CallOnThreadFunction = std::function<void (std::function<void ()>)>;
4039
4140struct BufferInterface {
4241 virtual ~BufferInterface () {}
@@ -50,9 +49,12 @@ struct BufferInterface {
5049 * @param size_ptr is the location in the VM address space to place the size of the newly
5150 * allocated memory block which contains the copied bytes (e.g. length).
5251 * @return true on success.
52+ * Length is guarantteed to be > 0 and the bounds have already been checked.
5353 */
54- virtual bool copyTo (WasmBase *wasm, size_t start, size_t length, uint64_t ptr_ptr,
55- uint64_t size_ptr) const = 0;
54+ virtual WasmResult copyTo (WasmBase *wasm, size_t start, size_t length, uint64_t ptr_ptr,
55+ uint64_t size_ptr) const = 0;
56+
57+ virtual WasmResult copyFrom (size_t start, size_t length, string_view data) = 0;
5658};
5759
5860// Opaque context object.
@@ -94,7 +96,7 @@ class ContextBase {
9496 uint32_t id () const { return id_; }
9597 bool isVmContext () const { return id_ == 0 ; }
9698 bool isRootContext () const { return root_context_id_ == 0 ; }
97- ContextBase *root_context () { return root_context_; }
99+ ContextBase *root_context () const { return root_context_; }
98100 string_view root_id () const { return isRootContext () ? root_id_ : plugin_->root_id_ ; }
99101 string_view log_prefix () const {
100102 return isRootContext () ? root_log_prefix_ : plugin_->log_prefix ();
@@ -104,76 +106,50 @@ class ContextBase {
104106 // Called before deleting the context.
105107 virtual void destroy ();
106108
107- //
108109 // VM level downcalls into the WASM code on Context(id == 0).
109- //
110110 virtual bool onStart (std::shared_ptr<PluginBase> plugin);
111111 virtual bool onConfigure (std::shared_ptr<PluginBase> plugin);
112112
113- //
113+ // Root Context downcalls into the WASM code Context(id != 0, root_context_id_ == 0);
114+ virtual void onTick ();
115+
114116 // Stream downcalls on Context(id > 0).
115117 //
116118 // General stream downcall on a new stream.
117119 virtual void onCreate (uint32_t root_context_id);
120+
118121 // Network
119- virtual FilterStatus onNetworkNewConnection () {
120- unimplemented ();
121- return FilterStatus::Continue;
122- }
123- virtual FilterStatus onDownstreamData (int /* data_length */ , bool /* end_of_stream */ ) {
124- unimplemented ();
125- return FilterStatus::Continue;
126- }
127- virtual FilterStatus onUpstreamData (int /* data_length */ , bool /* end_of_stream */ ) {
128- unimplemented ();
129- return FilterStatus::Continue;
130- }
122+ virtual FilterStatus onNetworkNewConnection ();
123+ virtual FilterStatus onDownstreamData (int data_length, bool end_of_stream);
124+ virtual FilterStatus onUpstreamData (int data_length, bool end_of_stream);
131125 enum class PeerType : uint32_t {
132126 Unknown = 0 ,
133127 Local = 1 ,
134128 Remote = 2 ,
135129 };
136- virtual void onDownstreamConnectionClose (PeerType) { unimplemented (); }
137- virtual void onUpstreamConnectionClose (PeerType) { unimplemented (); }
130+ virtual void onDownstreamConnectionClose (PeerType);
131+ virtual void onUpstreamConnectionClose (PeerType);
138132 // HTTP Filter Stream Request Downcalls.
139- virtual FilterHeadersStatus onRequestHeaders () {
140- unimplemented ();
141- return FilterHeadersStatus::Continue;
142- }
143- virtual FilterDataStatus onRequestBody (int /* body_buffer_length */ , bool /* end_of_stream */ ) {
144- unimplemented ();
145- return FilterDataStatus::Continue;
146- }
147- virtual FilterTrailersStatus onRequestTrailers () {
148- unimplemented ();
149- return FilterTrailersStatus::Continue;
150- }
151- virtual FilterMetadataStatus onRequestMetadata () {
152- unimplemented ();
153- return FilterMetadataStatus::Continue;
154- }
133+ virtual FilterHeadersStatus onRequestHeaders (uint32_t headers);
134+ virtual FilterDataStatus onRequestBody (uint32_t body_buffer_length, bool end_of_stream);
135+ virtual FilterTrailersStatus onRequestTrailers (uint32_t trailers);
136+ virtual FilterMetadataStatus onRequestMetadata (uint32_t elements);
155137 // HTTP Filter Stream Response Downcalls.
156- virtual FilterHeadersStatus onResponseHeaders () {
157- unimplemented ();
158- return FilterHeadersStatus::Continue;
159- }
160- virtual FilterDataStatus onResponseBody (int /* body_buffer_length */ , bool /* end_of_stream */ ) {
161- unimplemented ();
162- return FilterDataStatus::Continue;
163- }
164- virtual FilterTrailersStatus onResponseTrailers () {
165- unimplemented ();
166- return FilterTrailersStatus::Continue;
167- }
168- virtual FilterMetadataStatus onResponseMetadata () {
169- unimplemented ();
170- return FilterMetadataStatus::Continue;
171- }
138+ virtual FilterHeadersStatus onResponseHeaders (uint32_t headers);
139+ virtual FilterDataStatus onResponseBody (uint32_t body_buffer_length, bool end_of_stream);
140+ virtual FilterTrailersStatus onResponseTrailers (uint32_t trailers);
141+ virtual FilterMetadataStatus onResponseMetadata (uint32_t elements);
172142 // Async call response.
173- virtual void onHttpCallResponse (uint32_t /* token */ , uint32_t /* headers */ ,
174- uint32_t /* body_size */ , uint32_t /* trailers */ ) {}
143+ virtual void onHttpCallResponse (uint32_t token, uint32_t headers, uint32_t body_size,
144+ uint32_t trailers);
145+ // Grpc
146+ virtual void onGrpcReceiveInitialMetadata (uint32_t token, uint32_t elements);
147+ virtual void onGrpcReceiveTrailingMetadata (uint32_t token, uint32_t trailers);
148+ virtual void onGrpcReceive (uint32_t token, uint32_t response_size);
149+ virtual void onGrpcClose (uint32_t token, uint32_t status_code);
150+
175151 // Inter-VM shared queue message arrival.
176- virtual void onQueueReady (uint32_t /* token */ ) { unimplemented (); }
152+ virtual void onQueueReady (uint32_t /* token */ );
177153 // General stream downcall when the stream/vm has ended.
178154 virtual bool onDone ();
179155 // General stream downcall for logging. Occurs after onDone().
@@ -212,7 +188,7 @@ class ContextBase {
212188 }
213189
214190 // Buffer
215- virtual const BufferInterface *getBuffer (WasmBufferType /* type */ ) {
191+ virtual BufferInterface *getBuffer (WasmBufferType /* type */ ) {
216192 unimplemented ();
217193 return nullptr ;
218194 }
@@ -233,14 +209,16 @@ class ContextBase {
233209 // gRPC
234210 // Returns a token which will be used with the corresponding onGrpc and grpc calls.
235211 virtual WasmResult grpcCall (string_view /* grpc_service */ , string_view /* service_name */ ,
236- string_view /* method_name */ , string_view /* request */ ,
212+ string_view /* method_name */ , const Pairs & /* initial_metadata */ ,
213+ string_view /* request */ ,
237214 const optional<std::chrono::milliseconds> & /* timeout */ ,
238215 uint32_t * /* token_ptr */ ) {
239216 unimplemented ();
240217 return WasmResult::Unimplemented;
241218 }
242219 virtual WasmResult grpcStream (string_view /* grpc_service */ , string_view /* service_name */ ,
243- string_view /* method_name */ , uint32_t * /* token_ptr */ ) {
220+ string_view /* method_name */ , const Pairs & /* initial_metadata */ ,
221+ uint32_t * /* token_ptr */ ) {
244222 unimplemented ();
245223 return WasmResult::Unimplemented;
246224 }
@@ -342,7 +320,12 @@ class ContextBase {
342320protected:
343321 friend class WasmBase ;
344322
345- virtual void initializeRoot (WasmBase *wasm, std::shared_ptr<PluginBase> plugin);
323+ // NB: initializeRootBase is non-virtual and can be called in the constructor without ambiguity.
324+ void initializeRootBase (WasmBase *wasm, std::shared_ptr<PluginBase> plugin);
325+ // NB: initializeRoot is virtual and should be called only outside of the constructor.
326+ virtual void initializeRoot (WasmBase *wasm, std::shared_ptr<PluginBase> plugin) {
327+ initializeRootBase (wasm, plugin);
328+ }
346329 std::string makeRootLogPrefix (string_view vm_id) const ;
347330
348331 WasmBase *wasm_{nullptr };
0 commit comments