@@ -117,11 +117,12 @@ handle_io_progress(Request *req)
117117{
118118 NPError err ;
119119 size_t bytesAvailable ;
120- int32_t writeSize ;
120+ int32_t bytesReady ;
121121 int32_t bytesConsumed ;
122122 uint8_t * dataPtr ;
123123
124124 assert (req -> source != REQ_SRC_UNSET );
125+ assert (req -> writePtr <= req -> writeSize );
125126
126127 if (req -> stream == NULL && !req -> failed ) {
127128 /* start streaming */
@@ -138,31 +139,40 @@ handle_io_progress(Request *req)
138139 }
139140 }
140141
142+ /*
143+ * Batch as many writes as the plugin will accept in a single trip,
144+ * to avoid worker/main round-trips per NPP_Write call.
145+ */
141146 bytesAvailable = req -> writeSize - req -> writePtr ;
142- if (req -> stream && bytesAvailable > 0 ) {
143- /* streaming in progress AND data available */
147+ while (req -> stream && !req -> failed && bytesAvailable > 0 ) {
144148 dbglogmsg ("> NPP_WriteReady %s %d\n" , req -> originalUrl , bytesAvailable );
145- writeSize = pluginFuncs .writeready (& npp , req -> stream );
146- if (writeSize > 0 ) {
147- writeSize = MIN (writeSize , bytesAvailable );
148- dbglogmsg ("> NPP_Write %s %d\n" , req -> originalUrl , writeSize );
149- dataPtr = req -> buf + req -> writePtr ;
150- bytesConsumed = pluginFuncs .write (& npp , req -> stream , req -> bytesWritten , writeSize , dataPtr );
151- if (bytesConsumed < 0 ) {
152- logmsg ("write error %d\n" , bytesConsumed );
153- cancel_request (req );
154- } else if ((uint32_t )bytesConsumed < writeSize ) {
155- logmsg ("not enough bytes consumed %d < %d\n" , bytesConsumed , writeSize );
156- cancel_request (req );
157- } else {
158- req -> bytesWritten += bytesConsumed ;
159- req -> writePtr += bytesConsumed ;
160- }
149+ bytesReady = pluginFuncs .writeready (& npp , req -> stream );
150+ if (bytesReady <= 0 ) {
151+ /* plugin says it's not ready; back off until next call */
152+ break ;
153+ }
154+ bytesReady = MIN (bytesReady , bytesAvailable );
155+ dbglogmsg ("> NPP_Write %s %d\n" , req -> originalUrl , bytesReady );
156+ dataPtr = req -> buf + req -> writePtr ;
157+ bytesConsumed = pluginFuncs .write (& npp , req -> stream , req -> bytesWritten , bytesReady , dataPtr );
158+ if (bytesConsumed < 0 ) {
159+ logmsg ("write error %d\n" , bytesConsumed );
160+ cancel_request (req );
161+ break ;
162+ } else if ((uint32_t )bytesConsumed < bytesReady ) {
163+ /* plugin promised it would consume offerSize via writeready */
164+ logmsg ("not enough bytes consumed %d < %d\n" , bytesConsumed , bytesReady );
165+ cancel_request (req );
166+ break ;
161167 }
168+ req -> bytesWritten += bytesConsumed ;
169+ req -> writePtr += bytesConsumed ;
170+ bytesAvailable -= bytesConsumed ;
162171 }
163172
164- if (req -> failed || (req -> done && bytesAvailable == 0 )) {
165- /* request is cancelled or complete */
173+ if (req -> done || req -> failed ) {
174+ assert (req -> failed || bytesAvailable == 0 );
175+
166176 if (req -> stream ) {
167177 logmsg ("> NPP_DestroyStream %s %d\n" , req -> originalUrl , req -> doneReason );
168178 err = pluginFuncs .destroystream (& npp , req -> stream , req -> doneReason );
507517progress_request (Request * req )
508518{
509519 assert (req -> source != REQ_SRC_UNSET );
520+ assert (req -> writePtr <= req -> writeSize );
510521
511522 if (req -> writePtr != req -> writeSize ) {
512523 /* waiting for plugin to consume bytes */
@@ -603,6 +614,8 @@ handle_request(PTP_CALLBACK_INSTANCE inst, void *reqArg, PTP_WORK work)
603614 }
604615 CloseHandle (req -> readyEvent );
605616 free (req );
617+
618+ CloseThreadpoolWork (work );
606619}
607620
608621static void
0 commit comments