/* A negative loopcount is nonsensical. */ if (loop_count < 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("repeat count size must be an integer value greater than or equal to zero")));
/* *Sincethistestsendsdatausingtheblockinginterfaces,itcannot *senddatatoitself.Therefore,aminimumof1workerisrequired.Of *course,anegativeworkercountisnonsensical.
*/ if (nworkers <= 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("number of workers must be an integer value greater than zero")));
/* Set up dynamic shared memory segment and background workers. */
test_shm_mq_setup(queue_size, nworkers, &seg, &outqh, &inqh);
/* Send the initial message. */
res = shm_mq_send(outqh, message_size, message_contents, false, true); if (res != SHM_MQ_SUCCESS)
ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("could not send message")));
/* *Receiveamessageandsenditbackoutagain.Dothisanumberof *timesequaltotheloopcount.
*/ for (;;)
{ /* Receive a message. */
res = shm_mq_receive(inqh, &len, &data, false); if (res != SHM_MQ_SUCCESS)
ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("could not receive message")));
/* If this is supposed to be the last iteration, stop here. */ if (--loop_count <= 0) break;
/* Send it back out. */
res = shm_mq_send(outqh, len, data, false, true); if (res != SHM_MQ_SUCCESS)
ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("could not send message")));
}
/* A negative loopcount is nonsensical. */ if (loop_count < 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("repeat count size must be an integer value greater than or equal to zero")));
/* *Usingthenonblockinginterfaces,wecanevensenddatatoourselves, *sotheminimumnumberofworkersforthistestiszero.
*/ if (nworkers < 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("number of workers must be an integer value greater than or equal to zero")));
/* Set up dynamic shared memory segment and background workers. */
test_shm_mq_setup(queue_size, nworkers, &seg, &outqh, &inqh);
/* Main loop. */ for (;;)
{ bool wait = true;
/* *Ifwehaven'tyetsentthemessagetherequisitenumberoftimes, *tryagaintosenditnow.Notethatwhenshm_mq_send()returns *SHM_MQ_WOULD_BLOCK,thenextcalltothatfunctionmustpassthe *samemessagesizeandcontents;that'snotanissueherebecause *we'resendingthesamemessageeverytime.
*/ if (send_count < loop_count)
{
res = shm_mq_send(outqh, message_size, message_contents, true, true); if (res == SHM_MQ_SUCCESS)
{
++send_count;
wait = false;
} elseif (res == SHM_MQ_DETACHED)
ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("could not send message")));
}
/* *Ifwehaven'tyetreceivedthemessagetherequisitenumberof *times,trytoreceiveitagainnow.
*/ if (receive_count < loop_count)
{
res = shm_mq_receive(inqh, &len, &data, true); if (res == SHM_MQ_SUCCESS)
{
++receive_count; /* Verifying every time is slow, so it's optional. */ if (verify)
verify_message(message_size, message_contents, len, data);
wait = false;
} elseif (res == SHM_MQ_DETACHED)
ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("could not receive message")));
} else
{ /* *Otherwise,we'vereceivedthemessageenoughtimes.This *shouldn'thappenunlesswe'vealsosentitenoughtimes.
*/ if (send_count != receive_count)
ereport(ERROR,
(errcode(ERRCODE_INTERNAL_ERROR),
errmsg("message sent %d times, but received %d times",
send_count, receive_count))); break;
}
if (wait)
{ /* first time, allocate or get the custom wait event */ if (we_message_queue == 0)
we_message_queue = WaitEventExtensionNew("TestShmMqMessageQueue");
if (origlen != newlen)
ereport(ERROR,
(errmsg("message corrupted"),
errdetail("The original message was %zu bytes but the final message is %zu bytes.",
origlen, newlen)));
for (i = 0; i < origlen; ++i) if (origdata[i] != newdata[i])
ereport(ERROR,
(errmsg("message corrupted"),
errdetail("The new and original messages differ at byte %zu of %zu.", i, origlen)));
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.17 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.