#!/usr/bin/newlisp
# prodcons.newlisp - benchmark Producer/consumer
# newLISP v.8.3.0 or later required
# Note that newLISP does not use Pthreads but classic UNIX/fork() processes
# therefore no mutexes amd condition variables but semaphores and shared memory
(constant 'wait -1 'sig 1)
(define (consumer n)
(set 'i 0)
(while (< i n)
(semaphore cons-sem wait)
(set 'i (share data))
(share consumed (+ (share consumed) 1))
(semaphore prod-sem sig))
(exit))
(define (producer n)
(for (i 1 n)
(semaphore prod-sem wait)
(share data i)
(share produced (+ (share produced) 1))
(semaphore cons-sem sig))
(exit))
(define (main n)
(set 'produced (share)) ; get shared mem addresses
(set 'consumed (share))
(set 'data (share))
(share produced 0) ; init shared memory
(share consumed 0)
(share data 0)
(set 'prod-sem (semaphore)) ; get semaphores
(set 'cons-sem (semaphore))
(set 'prod-pid (fork (producer n))) ; start processes
(set 'cons-pid (fork (consumer n)))
(semaphore prod-sem sig) ; get producer started
(wait-pid prod-pid) ; wait for processe to finish
(wait-pid cons-pid)
(semaphore cons-sem 0) ; release semaphore
(semaphore prod-sem 0) ; release semaphore
(println (share produced) " " (share consumed)))
(main (integer (last (main-args))))
(exit)
syntax highlighting with newLISP and syntax.cgi