Vlad GALU wrote:
        Hello. I have the following scenario: one process that creates a
message queue and goes through it in a loop, together with another process
that inserts various messages into the queue. What I wish is for the
'listening' process to be able to fully process the queue at a fixed
amount of time. In short, I'd like msgrcv() to iterate throught the queue
and visit every element in a single run. That set of operations being done
periodically.
        Do you find this possible ? I'm quite puzzled here. I first tried
inserting a sleep() call in my queue processing loop but then I noticed
that it had a bad effect. It's true that I haven't read the man page very
carefully the first time. I'll blame it on the hurry.

        However, while writing this message, an idea occured to me. What
if I write the processing loop as follows:

        -- cut here --
        int i;
        while (1) {
                i = 0;
                msgctl(queueid, IPC_STAT, &queuestat);
                while (i <= queuestat.msg_qnum) {
                        msgrcv(queueid, &message, sizeof(message), 0, 0);
                        process_message(message);
                        i++;
                }
                sleep(5);
        }
        -- and here --

        Does this look pheasible ? I'm expecting an injection of about
100k messages per second or even more. There'll be quite a lot of
unprocessed ones at the end of each run, I suppose. I'll measure the average time 
spent for
one run and decide on the sleep interval.


Did you try to grok what the msgrcv() call is supposed to return?
Specifically, read about -1/EAGAIN and IPC_NOWAIT. Then remove sleep().

> However, does anyone have a better design ?

Yes. Use sockets.

Obsolescent Unix IPC Methods
http://www.catb.org/~esr/writings/taoup/html/ch07s03.html#id2923376

--
Lev Walkin
[EMAIL PROTECTED]
_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to