Skip to content

Commit 3740c6a

Browse files
Misc cleanup
1 parent 839bcad commit 3740c6a

1 file changed

Lines changed: 34 additions & 21 deletions

File tree

requests.c

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
@@ -507,6 +517,7 @@ void
507517
progress_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

608621
static void

0 commit comments

Comments
 (0)