diff --git a/microscript/ILibDuktape_Helpers.c b/microscript/ILibDuktape_Helpers.c index 43c54d5..aca1c89 100644 --- a/microscript/ILibDuktape_Helpers.c +++ b/microscript/ILibDuktape_Helpers.c @@ -1155,6 +1155,12 @@ void Duktape_Console_Log_ChainEx(duk_context *ctx, ILibDuktape_LogTypes logType, case ILibDuktape_LogType_Warn: duk_get_prop_string(ctx, -1, "warn"); // [g][console][warn] break; + case ILibDuktape_LogType_Info1: + duk_get_prop_string(ctx, -1, "info1"); // [g][console][warn] + break; + case ILibDuktape_LogType_Info2: + duk_get_prop_string(ctx, -1, "info2"); // [g][console][warn] + break; default: duk_get_prop_string(ctx, -1, "log"); // [g][console][log] break; diff --git a/microscript/ILibDuktape_ReadableStream.c b/microscript/ILibDuktape_ReadableStream.c index d514265..bb69695 100644 --- a/microscript/ILibDuktape_ReadableStream.c +++ b/microscript/ILibDuktape_ReadableStream.c @@ -632,13 +632,16 @@ duk_ret_t ILibDuktape_readableStream_pipe(duk_context *ctx) int nargs = duk_get_top(ctx); duk_push_this(ctx); // [readable] + char *ID = Duktape_GetStringPropertyValue(ctx, -1, ILibDuktape_OBJID, "UNKNOWN"); duk_get_prop_string(ctx, -1, ILibDuktape_readableStream_RSPTRS); // [readable][ptrs] rstream = (ILibDuktape_readableStream*)Duktape_GetBuffer(ctx, -1, NULL); duk_pop_2(ctx); // ... ILibSpinLock_Lock(&(rstream->pipeLock)); - if (rstream->pipeInProgress != 0) + if (rstream->pipeInProgress != 0 && rstream->pipeInProgress_counter < 10) { + ++rstream->pipeInProgress_counter; + // We must YIELD and try again later, becuase there is an active dispatch going on rstream->pipeImmediate = ILibDuktape_Immediate(ctx, (void*[]) { rstream, duk_get_heapptr(ctx, 0), nargs > 1 ? duk_get_heapptr(ctx, 1) : NULL }, 1 + nargs, ILibDuktape_readableStream_pipe_later); duk_push_heapptr(ctx, rstream->pipeImmediate); // [immediate] @@ -655,6 +658,11 @@ duk_ret_t ILibDuktape_readableStream_pipe(duk_context *ctx) } else { + char tmpbuf[512]; + int len = sprintf_s(tmpbuf, sizeof(tmpbuf), "PIPE:%s [%d]", ID, rstream->pipeInProgress_counter); + if (len > 0) { Duktape_Console_Log(ctx, duk_ctx_chain(ctx), ILibDuktape_LogType_Info1, tmpbuf, len); } + rstream->pipeInProgress_counter = 0; + // No Active Dispatch, so while we hold this lock, we can setup/add the pipe duk_push_heapptr(ctx, rstream->pipeArray); // [pipeArray] duk_get_prop_string(ctx, -1, "push"); // [pipeArray][push] @@ -704,6 +712,8 @@ duk_ret_t ILibDuktape_readableStream_pipe(duk_context *ctx) duk_push_string(ctx, "pipe"); // [emit][this][pipe] duk_push_this(ctx); // [emit][this][pipe][readable] duk_call_method(ctx, 2); duk_pop(ctx); // ... + + if (rstream->paused != 0) { rstream->paused = 0; // Set state now, so nobody tries to resume before we can finish piping diff --git a/microscript/ILibDuktape_ReadableStream.h b/microscript/ILibDuktape_ReadableStream.h index b90a75e..c4528d5 100644 --- a/microscript/ILibDuktape_ReadableStream.h +++ b/microscript/ILibDuktape_ReadableStream.h @@ -54,6 +54,7 @@ typedef struct ILibDuktape_readableStream #endif int endRelayed; int pipeInProgress; + int pipeInProgress_counter; #ifdef WIN32 DWORD pipedThreadID; #else diff --git a/microstack/ILibWebRTC.c b/microstack/ILibWebRTC.c index 03160d0..6d73fae 100644 --- a/microstack/ILibWebRTC.c +++ b/microstack/ILibWebRTC.c @@ -3865,7 +3865,7 @@ void ILibStun_SctpResent(struct ILibStun_dTlsSession *obj) #ifdef _WEBRTCDEBUG if (obj->onT3RTX != NULL) { obj->onT3RTX(obj, "OnT3RTX", -1); } // Debug event informing of the T3RTX timer expiration #endif - + ILibRemoteLogging_printf(ILibChainGetLogger(obj->parent->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_3, "SCTP[%d]: T3TX Timer Expired", obj->sessionId); obj->senderCredits = ILibRUDP_StartMTU; // Set CWND to 1 MTU obj->SSTHRESH = MAX(obj->congestionWindowSize / 2, 4 * ILibRUDP_StartMTU); // Update Slow Start Threshold obj->congestionWindowSize = ILibRUDP_StartMTU; // Reset the size of the Congestion Window, so that we'll initialy only have one SCTP packet in flight @@ -3921,6 +3921,7 @@ void ILibStun_SctpResent(struct ILibStun_dTlsSession *obj) if (obj->onT3RTX != NULL) { obj->onT3RTX(obj, "OnT3RTX", obj->RTO); } // Debug event informing of the T3RTX timer expiration #endif } + ILibRemoteLogging_printf(ILibChainGetLogger(obj->parent->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_3, "SCTP[%d]: RESEND", obj->sessionId); ILibStun_SendSctpPacket(obj->parent, obj->sessionId, rpacket->Data - 12, rpacket->PacketSize); #ifdef _WEBRTCDEBUG //if (obj->onSendRetry != NULL) { obj->onSendRetry(obj, "OnSendRetry", ((unsigned short*)(rpacket->Data + sizeof(char*)))[0]); } @@ -3937,6 +3938,7 @@ void ILibStun_SctpResent(struct ILibStun_dTlsSession *obj) else { rpacket->PacketGAPCounter = 0xFF; // Mark for retransmit later (when CWND allows) + ILibRemoteLogging_printf(ILibChainGetLogger(obj->parent->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_3, "SCTP[%d]: MARK FOR RESEND", obj->sessionId); } } rpacket = rpacket->NextPacket; // Move to the next packet @@ -4630,8 +4632,10 @@ void ILibStun_ProcessSctpPacket(struct ILibStun_Module *obj, int session, char* o->maxOutStreams = MIN(ntohs(((unsigned short*)(buffer + ptr + 12))[0]), ILibSCTP_Stream_MaximumCount); o->maxInStreams = MIN(ntohs(((unsigned short*)(buffer + ptr + 12))[1]), ILibSCTP_Stream_MaximumCount); ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_1, "SCTP: %d received [INIT]", session); - ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_1, "...TSN/IN = %u", o->intsn); - ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_1, "...TSN/OUT = %u", o->outtsn); + ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_1, "...TSN/IN = %u", o->intsn); + ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_1, "...TSN/OUT = %u", o->outtsn); + ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_1, "...SenderCredits = %u", o->senderCredits); + // Optional/Variable Fields { int varLen = 0; @@ -5031,7 +5035,7 @@ void ILibStun_ProcessSctpPacket(struct ILibStun_Module *obj, int session, char* // Update the packet retry data rpacket->LastSentTimeStamp = o->lastSackTime; // Last time the packet was sent (Used for retry) - + ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_2, "Sending %u/%u bytes from Holding Queue", (rpacket->PacketSize - (12 + 16)), o->holdingByteCount); // Send the packet ILibStun_SendSctpPacket(obj, session, rpacket->Data - 12, rpacket->PacketSize); // Send the packet