On Wed, 13 Apr 2011 16:40:55, Ori Berger wrote:
>
> > A full fledged queue would force the consuming process (process A) to
> > read and process all data written by the producing process (process M)
> > even when process A needs only the most recent value whenever it reads
> > process M's data.
>
> I forgot how this scheme is called, but assuming you have some shared
> memory between the processes, what you do is:
>
> have value variable (e.g. "value") and counter variable ("counter")
> also shadow_value and shadow_counter
>
> initialize counter to 0 (any even number will do)
>
> in process M:
>
> atomic_increase counter; (or follow with memory_barrier())
> write value;
> atomic_increase counter; (or follow with memory_barrier())
>
> in process A:
>
> pre_counter = atomic_read counter; (or precede with memory_barrier())
> new_value = read value;
> post_counter = atomic_read counter; (or precede with memory_barrier())
>
> if (pre_counter == post_counter) && (pre_counter%2 == 0), new_value has
> been safely read; write it to "shadow_value", use that as value, (and
> for good measure store pre_counter in "shadow_counter").
>
> if pre_counter != post_counter, use "shadow_value" - and be aware that
> your value is actually up to date only for "shadow_counter".This scheme has some flows as Omer has noted. Let me propose somewhat different scheme based on the same principle that I think will work. Use shared memory segment that include: an index (byte or word) First array of N (N >= 2) values to pass. Second array of N (N >= 2) values to pass. Process A (the sending process) write the K (K=0...N-1) value to the 1st and 2nd array than it updates the index to K. Process B does: Reads the index save it (I). Reads the value I from the 1st array and save it (V1). Reads the value I from the 2nd array and save it (V2). Reads the index again (I2). if V1 = V2 and I = I2, use the value, otherwise redo from the top. This process ensures that B never gets a wrong value, but if A is too fast, B will never get a value. Ehud. -- Ehud Karni Tel: +972-3-7966-561 /"\ Mivtach - Simon Fax: +972-3-7976-561 \ / ASCII Ribbon Campaign Insurance agencies (USA) voice mail and X Against HTML Mail http://www.mvs.co.il FAX: 1-815-5509341 / \ GnuPG: 98EA398D <http://www.keyserver.net/> Better Safe Than Sorry _______________________________________________ Linux-il mailing list [email protected] http://mailman.cs.huji.ac.il/mailman/listinfo/linux-il
