From owner-freebsd-hackers@FreeBSD.ORG Sun Apr 11 15:31:31 2004 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3E07A16A4CE for ; Sun, 11 Apr 2004 15:31:31 -0700 (PDT) Received: from diaspar.rdsnet.ro (diaspar.rdsnet.ro [213.157.165.224]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5CE1A43D5A for ; Sun, 11 Apr 2004 15:31:30 -0700 (PDT) (envelope-from dudu@diaspar.rdsnet.ro) Received: (qmail 35868 invoked by uid 89); 11 Apr 2004 22:31:16 -0000 Received: from unknown (HELO diaspar.rdsnet.ro) (213.157.165.224) by 0 with AES256-SHA encrypted SMTP; 11 Apr 2004 22:31:16 -0000 Date: Mon, 12 Apr 2004 01:31:14 +0300 (EEST) From: Vlad GALU To: freebsd-hackers@freebsd.org Message-ID: <20040412011216.P7661@qvnfcne.eqfarg.eb> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Subject: SYSV message queues X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: dudu@diaspar.rdsnet.ro List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Apr 2004 22:31:31 -0000 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. However, does anyone have a better design ? ---- If it's there, and you can see it, it's real. If it's not there, and you can see it, it's virtual. If it's there, and you can't see it, it's transparent. If it's not there, and you can't see it, you erased it.