@@ -16,39 +16,37 @@ namespace node {
1616// Forward declarations
1717class StreamBase ;
1818
19- template < class Req >
19+ template < typename Base >
2020class StreamReq {
2121 public:
22- typedef void (*DoneCb)(Req* req, int status);
23-
24- explicit StreamReq (DoneCb cb) : cb_(cb) {
22+ explicit StreamReq (StreamBase* stream) : stream_(stream) {
2523 }
2624
2725 inline void Done (int status, const char * error_str = nullptr ) {
28- Req * req = static_cast <Req *>(this );
26+ Base * req = static_cast <Base *>(this );
2927 Environment* env = req->env ();
3028 if (error_str != nullptr ) {
3129 req->object ()->Set (env->error_string (),
3230 OneByteString (env->isolate (), error_str));
3331 }
3432
35- cb_ ( req, status);
33+ req-> OnDone ( status);
3634 }
3735
36+ inline StreamBase* stream () const { return stream_; }
37+
3838 private:
39- DoneCb cb_ ;
39+ StreamBase* const stream_ ;
4040};
4141
4242class ShutdownWrap : public ReqWrap <uv_shutdown_t >,
4343 public StreamReq<ShutdownWrap> {
4444 public:
4545 ShutdownWrap (Environment* env,
4646 v8::Local<v8::Object> req_wrap_obj,
47- StreamBase* wrap,
48- DoneCb cb)
47+ StreamBase* stream)
4948 : ReqWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_SHUTDOWNWRAP),
50- StreamReq<ShutdownWrap>(cb),
51- wrap_ (wrap) {
49+ StreamReq<ShutdownWrap>(stream) {
5250 Wrap (req_wrap_obj, this );
5351 }
5452
@@ -60,27 +58,22 @@ class ShutdownWrap : public ReqWrap<uv_shutdown_t>,
6058 return ContainerOf (&ShutdownWrap::req_, req);
6159 }
6260
63- inline StreamBase* wrap () const { return wrap_; }
6461 size_t self_size () const override { return sizeof (*this ); }
6562
66- private:
67- StreamBase* const wrap_;
63+ inline void OnDone (int status); // Just calls stream()->AfterShutdown()
6864};
6965
70- class WriteWrap : public ReqWrap <uv_write_t >,
71- public StreamReq<WriteWrap> {
66+ class WriteWrap : public ReqWrap <uv_write_t >,
67+ public StreamReq<WriteWrap> {
7268 public:
7369 static inline WriteWrap* New (Environment* env,
7470 v8::Local<v8::Object> obj,
75- StreamBase* wrap,
76- DoneCb cb,
71+ StreamBase* stream,
7772 size_t extra = 0 );
7873 inline void Dispose ();
7974 inline char * Extra (size_t offset = 0 );
8075 inline size_t ExtraSize () const ;
8176
82- inline StreamBase* wrap () const { return wrap_; }
83-
8477 size_t self_size () const override { return storage_size_; }
8578
8679 static WriteWrap* from_req (uv_write_t * req) {
@@ -91,24 +84,22 @@ class WriteWrap: public ReqWrap<uv_write_t>,
9184
9285 WriteWrap (Environment* env,
9386 v8::Local<v8::Object> obj,
94- StreamBase* wrap,
95- DoneCb cb)
87+ StreamBase* stream)
9688 : ReqWrap(env, obj, AsyncWrap::PROVIDER_WRITEWRAP),
97- StreamReq<WriteWrap>(cb),
98- wrap_ (wrap),
89+ StreamReq<WriteWrap>(stream),
9990 storage_size_ (0 ) {
10091 Wrap (obj, this );
10192 }
10293
94+ inline void OnDone (int status); // Just calls stream()->AfterWrite()
95+
10396 protected:
10497 WriteWrap (Environment* env,
10598 v8::Local<v8::Object> obj,
106- StreamBase* wrap,
107- DoneCb cb,
99+ StreamBase* stream,
108100 size_t storage_size)
109101 : ReqWrap(env, obj, AsyncWrap::PROVIDER_WRITEWRAP),
110- StreamReq<WriteWrap>(cb),
111- wrap_(wrap),
102+ StreamReq<WriteWrap>(stream),
112103 storage_size_(storage_size) {
113104 Wrap (obj, this );
114105 }
@@ -129,7 +120,6 @@ class WriteWrap: public ReqWrap<uv_write_t>,
129120 // WriteWrap. Ensure this never happens.
130121 void operator delete (void * ptr) { UNREACHABLE (); }
131122
132- StreamBase* const wrap_;
133123 const size_t storage_size_;
134124};
135125
@@ -151,7 +141,7 @@ class StreamResource {
151141 void * ctx;
152142 };
153143
154- typedef void (*AfterWriteCb)(WriteWrap* w, void * ctx);
144+ typedef void (*AfterWriteCb)(WriteWrap* w, int status, void * ctx);
155145 typedef void (*AllocCb)(size_t size, uv_buf_t * buf, void * ctx);
156146 typedef void (*ReadCb)(ssize_t nread,
157147 const uv_buf_t * buf,
@@ -176,9 +166,9 @@ class StreamResource {
176166 virtual void ClearError ();
177167
178168 // Events
179- inline void OnAfterWrite (WriteWrap* w) {
169+ inline void OnAfterWrite (WriteWrap* w, int status ) {
180170 if (!after_write_cb_.is_empty ())
181- after_write_cb_.fn (w, after_write_cb_.ctx );
171+ after_write_cb_.fn (w, status, after_write_cb_.ctx );
182172 }
183173
184174 inline void OnAlloc (size_t size, uv_buf_t * buf) {
@@ -208,14 +198,12 @@ class StreamResource {
208198 inline Callback<ReadCb> read_cb () { return read_cb_; }
209199 inline Callback<DestructCb> destruct_cb () { return destruct_cb_; }
210200
211- private :
201+ protected :
212202 Callback<AfterWriteCb> after_write_cb_;
213203 Callback<AllocCb> alloc_cb_;
214204 Callback<ReadCb> read_cb_;
215205 Callback<DestructCb> destruct_cb_;
216206 uint64_t bytes_read_;
217-
218- friend class StreamBase ;
219207};
220208
221209class StreamBase : public StreamResource {
@@ -253,6 +241,10 @@ class StreamBase : public StreamResource {
253241 v8::Local<v8::Object> buf,
254242 v8::Local<v8::Object> handle);
255243
244+ // These are called by the respective {Write,Shutdown}Wrap class.
245+ virtual void AfterShutdown (ShutdownWrap* req, int status);
246+ virtual void AfterWrite (WriteWrap* req, int status);
247+
256248 protected:
257249 explicit StreamBase (Environment* env) : env_(env), consumed_(false ) {
258250 }
@@ -263,10 +255,6 @@ class StreamBase : public StreamResource {
263255 virtual AsyncWrap* GetAsyncWrap () = 0;
264256 virtual v8::Local<v8::Object> GetObject ();
265257
266- // Libuv callbacks
267- static void AfterShutdown (ShutdownWrap* req, int status);
268- static void AfterWrite (WriteWrap* req, int status);
269-
270258 // JS Methods
271259 int ReadStart (const v8::FunctionCallbackInfo<v8::Value>& args);
272260 int ReadStop (const v8::FunctionCallbackInfo<v8::Value>& args);
0 commit comments