int rtaComponent_PutMessage(PARCEventQueue *queue, TransportMessage *tm) { RtaConnection *conn = rtaConnection_GetFromTransport(tm); assertNotNull(conn, "Got null connection from transport message\n"); if (rtaConnection_GetState(conn) != CONN_CLOSED) { PARCEventBuffer *out = parcEventBuffer_GetQueueBufferOutput(queue); int res; rtaConnection_IncrementMessagesInQueue(conn); if (DEBUG_OUTPUT) { printf("%s queue %-12s tm %p\n", __func__, rtaProtocolStack_GetQueueName(rtaConnection_GetStack(conn), queue), (void *) tm); } res = parcEventBuffer_Append(out, (void *)&tm, sizeof(&tm)); assertTrue(res == 0, "%s parcEventBuffer_Append returned error\n", __func__); parcEventBuffer_Destroy(&out); return 1; } else { // should increment a drop counter (case 908) transportMessage_Destroy(&tm); return 0; } }
/** * @function metisStreamConnection_Send * @abstract Non-destructive send of the message. * @discussion * Send uses metisMessage_CopyToStreamBuffer, which is a non-destructive write. * The send may fail if there's no buffer space in the output queue. * * @param dummy is ignored. A stream has only one peer. * @return <#return#> */ static bool _metisStreamConnection_Send(MetisIoOperations *ops, const CPIAddress *dummy, MetisMessage *message) { assertNotNull(ops, "Parameter ops must be non-null"); assertNotNull(message, "Parameter message must be non-null"); _MetisStreamState *stream = (_MetisStreamState *) metisIoOperations_GetClosure(ops); bool success = false; if (stream->isUp) { PARCEventBuffer *buffer = parcEventBuffer_GetQueueBufferOutput(stream->bufferEventVector); size_t buffer_backlog = parcEventBuffer_GetLength(buffer); parcEventBuffer_Destroy(&buffer); if (buffer_backlog < OUTPUT_QUEUE_BYTES) { if (metisLogger_IsLoggable(stream->logger, MetisLoggerFacility_IO, PARCLogLevel_Debug)) { metisLogger_Log(stream->logger, MetisLoggerFacility_IO, PARCLogLevel_Debug, __func__, "connid %u Writing %zu bytes to buffer with backlog %zu bytes", stream->id, metisMessage_Length(message), buffer_backlog); } int failure = metisMessage_Write(stream->bufferEventVector, message); if (failure == 0) { success = true; } } else { if (metisLogger_IsLoggable(stream->logger, MetisLoggerFacility_IO, PARCLogLevel_Warning)) { metisLogger_Log(stream->logger, MetisLoggerFacility_IO, PARCLogLevel_Warning, __func__, "connid %u Writing to buffer backlog %zu bytes DROP MESSAGE", stream->id, buffer_backlog); } } } else { if (metisLogger_IsLoggable(stream->logger, MetisLoggerFacility_IO, PARCLogLevel_Error)) { metisLogger_Log(stream->logger, MetisLoggerFacility_IO, PARCLogLevel_Error, __func__, "connid %u tried to send to down connection (isUp %d isClosed %d)", stream->id, stream->isUp, stream->isClosed); } } return success; }