CL binding ripped out of the tree

This commit is contained in:
Martin Sustrik 2010-01-28 12:45:12 +01:00
parent 943125bd12
commit f17f0fa67b
18 changed files with 6 additions and 961 deletions

3
.gitignore vendored
View File

@ -13,6 +13,9 @@ autom4te.cache
*.lo
*.loT
*.la
*.html
*.pdf
*.ps
.*
src/platform.hpp
src/stamp-h1

View File

@ -10,10 +10,6 @@ if BUILD_RUBY
DIR_R = ruby
endif
if BUILD_CL
DIR_R = cl
endif
SUBDIRS = $(DIR_J) $(DIR_P) $(DIR_R) $(DIR_CL)
DIST_SUBDIRS = java python ruby cl
SUBDIRS = $(DIR_J) $(DIR_P) $(DIR_R)
DIST_SUBDIRS = java python ruby

View File

@ -1,9 +0,0 @@
sitedir=$(CLDIR)/../site/zeromq
zeromqasd=$(CLDIR)/zeromq.asd
install-data-local:
if test -d $(sitedir); then rm -rdf $(sitedir); fi
mkdir $(sitedir)
chown --reference=$(sitedir)/.. $(sitedir)
cp *.lisp *.asd $(sitedir)
ln -sf $(sitedir)/zeromq.asd $(zeromqasd)

View File

@ -1,59 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(in-package :zeromq)
(define-condition error-again (error)
((argument :reader error-again :initarg :argument))
(:report (lambda (condition stream)
(write-string (convert-from-foreign
(%strerror (error-again condition))
:string)
stream))))
(defmacro defcfun* (name-and-options return-type &body args)
(let* ((c-name (car name-and-options))
(l-name (cadr name-and-options))
(n-name (cffi::format-symbol t "%~A" l-name))
(name (list c-name n-name))
(docstring (when (stringp (car args)) (pop args)))
(ret (gensym)))
(loop with opt
for i in args
unless (consp i) do (setq opt t)
else
collect i into args*
and if (not opt) collect (car i) into names
else collect (car i) into opts
and collect (list (car i) 0) into opts-init
end
finally (return
`(progn
(defcfun ,name ,return-type
,@args*)
(defun ,l-name (,@names &optional ,@opts-init)
,docstring
(let ((,ret (,n-name ,@names ,@opts)))
(if ,(if (eq return-type :pointer)
`(zerop (pointer-address ,ret))
`(not (zerop ,ret)))
(cond
((eq *errno* isys:eagain) (error 'error-again :argument *errno*))
(t (error (convert-from-foreign (%strerror *errno*) :string))))
,ret))))))))

View File

@ -1,108 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(defpackage #:zeromq
(:nicknames :zmq)
(:use :cl :cffi)
(:shadow #:sleep #:close)
(:export
;; constants
#:affinity
#:delimiter
#:downstream
#:efsm
#:emthread
#:enocompatproto
#:hausnumero
#:hwm
#:identity
#:lwm
#:max-vsm-size
#:mcast-loop
#:noblock
#:noflush
#:p2p
#:poll
#:pollin
#:pollout
#:pub
#:rate
#:recovery-ivl
#:rep
#:req
#:sub
#:subscribe
#:swap
#:unsubscribe
#:upstream
#:vsm
#:events
;; structures
#:msg
#:pollitem
;; functions
#:bind
#:close
#:connect
#:flush
#:init
#:msg-close
#:msg-copy
#:msg-data-as-array
#:msg-data-as-is
#:msg-data-as-string
#:msg-init
#:msg-init-data
#:msg-init-size
#:msg-move
#:msg-size
#:msg-type
#:poll
#:pollitem-events
#:pollitem-fd
#:pollitem-revents
#:pollitem-socket
#:recv
#:send
#:setsockopt
#:sleep
#:socket
#:stopwatch-start
#:stopwatch-stop
#:strerror
#:term
;; macros
#:with-context
#:with-polls
#:with-socket
#:with-stopwatch
;; conditions
#:error-again))
(in-package :zeromq)
(eval-when (:compile-toplevel :load-toplevel :execute)
(define-foreign-library zeromq
(:unix (:or "libzmq.so.0.0.0" "libzmq.so"))
(t "libzmq")))
(use-foreign-library zeromq)

View File

@ -1,180 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(in-package :zeromq)
;; Stolen from CFFI. Uses custom allocator (alloc-fn) instead of foreign-alloc
(defun copy-lisp-string-octets (string alloc-fn &key (encoding cffi::*default-foreign-encoding*)
(null-terminated-p t) (start 0) end)
"Allocate a foreign string containing Lisp string STRING.
The string must be freed with FOREIGN-STRING-FREE."
(check-type string string)
(cffi::with-checked-simple-vector ((string (coerce string 'babel:unicode-string))
(start start) (end end))
(declare (type simple-string string))
(let* ((mapping (cffi::lookup-mapping cffi::*foreign-string-mappings* encoding))
(count (funcall (cffi::octet-counter mapping) string start end 0))
(length (if null-terminated-p
(+ count (cffi::null-terminator-len encoding))
count))
(ptr (funcall alloc-fn length)))
(funcall (cffi::encoder mapping) string start end ptr 0)
(when null-terminated-p
(dotimes (i (cffi::null-terminator-len encoding))
(setf (mem-ref ptr :char (+ count i)) 0)))
(values ptr length))))
(defclass msg ()
((raw :accessor msg-raw :initform nil)))
(defmethod initialize-instance :after ((inst msg) &key size data)
(let ((obj (foreign-alloc 'msg)))
(tg:finalize inst (lambda ()
(%msg-close obj)
(foreign-free obj)))
(cond (size (%msg-init-size obj size))
(data
(etypecase data
(string (copy-lisp-string-octets
data (lambda (sz)
(%msg-init-size obj sz)
(%msg-data obj))))
(array (progn
(%msg-init-size obj (length data))
(let ((ptr (%msg-data obj))
(i -1))
(map nil (lambda (x)
(setf (mem-aref ptr :uchar (incf i)) x))
data))))))
(t (msg-init obj)))
(setf (msg-raw inst) obj)))
(defclass pollitem ()
((raw :accessor pollitem-raw :initform nil)
(socket :accessor pollitem-socket :initform nil :initarg :socket)
(fd :accessor pollitem-fd :initform -1 :initarg :fd)
(events :accessor pollitem-events :initform 0 :initarg :events)
(revents :accessor pollitem-revents :initform 0)))
(defmethod initialize-instance :after ((inst pollitem) &key)
(let ((obj (foreign-alloc 'pollitem)))
(setf (pollitem-raw inst) obj)
(tg:finalize inst (lambda () (foreign-free obj)))))
(defun bind (s address)
(with-foreign-string (addr address)
(%bind s addr)))
(defun connect (s address)
(with-foreign-string (addr address)
(%connect s addr)))
(defmacro with-context ((context app-threads io-threads &optional flags) &body body)
`(let ((,context (init ,app-threads ,io-threads (or ,flags 0))))
,@body
(term ,context)))
(defmacro with-socket ((socket context type) &body body)
`(let ((,socket (socket ,context ,type)))
,@body
(close ,socket)))
(defmacro with-stopwatch (&body body)
(let ((watch (gensym)))
`(with-foreign-object (,watch :long 2)
(setq ,watch (stopwatch-start))
,@body
(stopwatch-stop ,watch))))
(defun msg-data-as-is (msg)
(%msg-data (msg-raw msg)))
(defun msg-data-as-string (msg)
(let ((data (%msg-data (msg-raw msg))))
(unless (zerop (pointer-address data))
(convert-from-foreign data :string))))
(defun msg-data-as-array (msg)
(let ((data (%msg-data (msg-raw msg))))
(unless (zerop (pointer-address data))
(let* ((len (msg-size msg))
(arr (make-array len :element-type '(unsigned-byte))))
(dotimes (i len)
(setf (aref arr i) (mem-aref data :uchar i)))
arr))))
(defun send (s msg &optional flags)
(%send s (msg-raw msg) (or flags 0)))
(defun recv (s msg &optional flags)
(%recv s (msg-raw msg) (or flags 0)))
(defun msg-init-size (msg size)
(%msg-init-size (msg-raw msg) size))
(defun msg-close (msg)
(%msg-close (msg-raw msg)))
(defun msg-size (msg)
(%msg-size (msg-raw msg)))
(defun msg-move (dst src)
(%msg-move (msg-raw dst) (msg-raw src)))
(defun msg-copy (dst src)
(%msg-copy (msg-raw dst) (msg-raw src)))
(defun setsockopt (socket option value)
(etypecase value
(string (with-foreign-string (string value)
(%setsockopt socket option string (length value))))
(integer (with-foreign-object (int :long 2)
(setf (mem-aref int :long 0) value)
(%setsockopt socket option int (foreign-type-size :long))))))
(defun poll (items &optional (timeout -1))
(let ((len (length items)))
(with-foreign-object (%items 'pollitem len)
(dotimes (i len)
(let ((item (nth i items))
(%item (mem-aref %items 'pollitem i)))
(with-foreign-slots ((socket fd events revents) %item pollitem)
(setf socket (pollitem-socket item)
fd (pollitem-fd item)
events (pollitem-events item)))))
(let ((ret (%poll %items len timeout)))
(cond
((zerop ret) nil)
((> ret 0)
(loop for i below len
for revent = (foreign-slot-value (mem-aref %items 'pollitem i)
'pollitem
'revents)
collect (setf (pollitem-revents (nth i items)) revent)))
(t (error (convert-from-foreign (%strerror *errno*) :string))))))))
(defmacro with-polls (list &body body)
`(let ,(loop for (name . polls) in list
collect `(,name
(list
,@(loop for (socket . events) in polls
collect `(make-instance 'pollitem
:socket ,socket
:events ,events)))))
,@body))
;

View File

@ -1,38 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(cl:eval-when (:load-toplevel :execute)
(asdf:operate 'asdf:load-op :cffi)
(asdf:operate 'asdf:load-op :trivial-garbage)
(asdf:operate 'asdf:load-op :iolib.syscalls))
(defpackage #:zeromq-asd
(:use :cl :asdf))
(in-package #:zeromq-asd)
(defsystem zeromq
:name "zeromq"
:version "0.1"
:author "Vitaly Mayatskikh <v.mayatskih@gmail.com>"
:licence "LGPLv3"
:description "Zero MQ 2 bindings"
:serial t
:components ((:file "package")
(:file "meta")
(:file "zeromq")
(:file "zeromq-api")))

View File

@ -1,250 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(in-package :zeromq)
(defcvar "errno" :int)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 0MQ errors.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconstant hausnumero 156384712)
;; On Windows platform some of the standard POSIX errnos are not defined.
;; #ifndef ENOTSUP
;; #define ENOTSUP (ZMQ_HAUSNUMERO + 1)
;; #endif
;; #ifndef EPROTONOSUPPORT
;; #define EPROTONOSUPPORT (ZMQ_HAUSNUMERO + 2)
;; #endif
;; #ifndef ENOBUFS
;; #define ENOBUFS (ZMQ_HAUSNUMERO + 3)
;; #endif
;; #ifndef ENETDOWN
;; #define ENETDOWN (ZMQ_HAUSNUMERO + 4)
;; #endif
;; #ifndef EADDRINUSE
;; #define EADDRINUSE (ZMQ_HAUSNUMERO + 5)
;; #endif
;; #ifndef EADDRNOTAVAIL
;; #define EADDRNOTAVAIL (ZMQ_HAUSNUMERO + 6)
;; #endif
;; Native 0MQ error codes.
(defconstant emthread (+ hausnumero 50))
(defconstant efsm (+ hausnumero 51))
(defconstant enocompatproto (+ hausnumero 52))
(defcfun ("zmq_strerror" %strerror) :pointer
(errnum :int))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 0MQ message definition.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconstant max-vsm-size 30)
;; Message types. These integers may be stored in 'content' member of the
;; message instead of regular pointer to the data.
(defconstant delimiter 31)
(defconstant vsm 32)
(defcstruct (msg)
(content :pointer)
(shared :uchar)
(vsm-size :uchar)
(vsm-data :uchar :count 30)) ;; FIXME max-vsm-size
(defcfun ("zmq_msg_init" msg-init) :int
(msg msg))
(defcfun* ("zmq_msg_init_size" %msg-init-size) :int
(msg msg)
(size :long))
(defcallback zmq-free :void ((ptr :pointer) (hint :pointer))
(declare (ignorable hint))
(foreign-free ptr))
(defcfun ("zmq_msg_init_data" msg-init-data) :int
(msg msg)
(data :pointer)
(size :long)
(ffn :pointer) ; zmq_free_fn
(hint :pointer))
(defcfun* ("zmq_msg_close" %msg-close) :int
(msg msg))
(defcfun ("zmq_msg_move" %msg-move) :int
(dest msg)
(src msg))
(defcfun ("zmq_msg_copy" %msg-copy) :int
(dest msg)
(src msg))
(defcfun ("zmq_msg_data" %msg-data) :pointer
(msg msg))
(defcfun ("zmq_msg_size" %msg-size) :int
(msg msg))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 0MQ infrastructure (a.k.a. context) initialisation & termination.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconstant poll 1)
(defcfun* ("zmq_init" init) :pointer
(app-threads :int)
(io-threads :int)
(flags :int))
(defcfun ("zmq_term" term) :int
(context :pointer))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 0MQ socket definition.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Creating a 0MQ socket.
;; **********************
(defconstant p2p 0)
(defconstant pub 1)
(defconstant sub 2)
(defconstant req 3)
(defconstant rep 4)
(defconstant xreq 5)
(defconstant xrep 6)
(defconstant upstream 7)
(defconstant downstream 8)
(defcfun* ("zmq_socket" socket) :pointer
(context :pointer)
(type :int))
;; Destroying the socket.
;; **********************
(defcfun ("zmq_close" close) :int
(s :pointer))
;; Manipulating socket options.
;; ****************************
;; Available socket options, their types and default values.
(defconstant hwm 1)
(defconstant lwm 2)
(defconstant swap 3)
(defconstant affinity 4)
(defconstant identity 5)
(defconstant subscribe 6)
(defconstant unsubscribe 7)
(defconstant rate 8)
(defconstant recovery-ivl 9)
(defconstant mcast-loop 10)
(defconstant sndbuf 11)
(defconstant rcvbuf 12)
(defcfun* ("zmq_setsockopt" %setsockopt) :int
(s :pointer)
(option :int)
(optval :pointer)
(optvallen :long))
;; Creating connections.
;; *********************
;; Addresses are composed of the name of the protocol to use followed by ://
;; and a protocol-specific address. Available protocols:
;;
;; tcp - the address is composed of IP address and port delimited by colon
;; sign (:). The IP address can be a hostname (with 'connect') or
;; a network interface name (with 'bind'). Examples "tcp://eth0:5555",
;; "tcp://192.168.0.1:20000", "tcp://hq.mycompany.com:80".
;;
;; pgm & udp - both protocols have same address format. It's network interface
;; to use, semicolon (;), multicast group IP address, colon (:) and
;; port. Examples: "pgm://eth2;224.0.0.1:8000",
;; "udp://192.168.0.111;224.1.1.1:5555".
(defcfun* ("zmq_bind" %bind) :int
(s :pointer)
(addr :pointer :char))
(defcfun* ("zmq_connect" %connect) :int
(s :pointer)
(addr :pointer :char))
;; Sending and receiving messages.
;; *******************************
(defconstant noblock 1)
(defconstant noflush 2)
(defcfun* ("zmq_send" %send) :int
(s :pointer)
(msg msg)
:optional
(flags :int))
(defcfun* ("zmq_flush" flush) :int
(s :pointer))
(defcfun* ("zmq_recv" %recv) :int
(s :pointer)
(msg msg)
:optional
(flags :int))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; I/O multiplexing.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconstant pollin 1)
(defconstant pollout 2)
(defcstruct pollitem
(socket :pointer)
(fd :int)
(events :short)
(revents :short))
(defcfun ("zmq_poll" %poll) :int
(items :pointer)
(nitems :int)
(timeout :long))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Helper functions.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Helper functions used by perf tests so that they don't have to care
;; about minutiae of time-related functions on different OS platforms.
(defcfun ("zmq_stopwatch_start" stopwatch-start) :pointer)
(defcfun ("zmq_stopwatch_stop" stopwatch-stop) :ulong
(watch :pointer))
(defcfun ("zmq_sleep" sleep) :void
(seconds :int))

View File

@ -392,21 +392,6 @@ else
JAR=true
fi
# Common Lisp
cldir=""
AC_ARG_WITH([cl], [AS_HELP_STRING([--with-cl],
[build Common Lisp language binding and install it into specified ASDF central registry [default=no]])],
[cldir="$withval";clzmq="yes"], [clzmq="no"])
if test "x$clzmq" = "xyes"; then
if test "x$cldir" = "xyes"; then
AC_MSG_ERROR([Please, specify ASDF central registry path])
fi
CLDIR=${cldir}
AC_SUBST([CLDIR])
fi
# PGM extension
pgm2_ext="no"
@ -563,7 +548,6 @@ AM_CONDITIONAL(BUILD_JAVA, test "x$jzmq" = "xyes")
AM_CONDITIONAL(BUILD_PYTHON, test "x$pyzmq" = "xyes")
AM_CONDITIONAL(BUILD_RUBY, test "x$rbzmq" = "xyes")
AM_CONDITIONAL(BUILD_C, test "x$czmq" = "xyes")
AM_CONDITIONAL(BUILD_CL, test "x$clzmq" = "xyes")
AM_CONDITIONAL(BUILD_CPP, test "x$cppzmq" = "xyes")
AM_CONDITIONAL(BUILD_PGM2, test "x$pgm2_ext" = "xyes")
AM_CONDITIONAL(BUILD_NO_PGM, test "x$pgm2_ext" = "xno")
@ -591,7 +575,6 @@ AC_CHECK_FUNCS(perror gettimeofday memset socket getifaddrs freeifaddrs)
AC_OUTPUT(Makefile src/Makefile man/Makefile bindings/python/Makefile \
bindings/python/setup.py bindings/ruby/Makefile \
bindings/cl/Makefile perf/cl/Makefile \
bindings/java/Makefile perf/Makefile perf/c/Makefile perf/cpp/Makefile \
perf/python/Makefile perf/ruby/Makefile perf/java/Makefile src/libzmq.pc \
devices/Makefile devices/zmq_forwarder/Makefile \
@ -612,10 +595,6 @@ AC_MSG_RESULT([ 0MQ install dir: $prefix])
AC_MSG_RESULT([ Language bindings:])
AC_MSG_RESULT([ C: $czmq])
AC_MSG_RESULT([ C++: $cppzmq])
AC_MSG_RESULT([ Common Lisp: $clzmq])
if test "x$clzmq" = "xyes"; then
AC_MSG_RESULT([ ASDF central registry: $cldir])
fi
AC_MSG_RESULT([ Java: $jzmq])
AC_MSG_RESULT([ Python: $pyzmq])
AC_MSG_RESULT([ Ruby: $rbzmq])

View File

@ -20,4 +20,4 @@ endif
SUBDIRS = $(PERF_DIR_C) $(PERF_DIR_CPP) $(PERF_DIR_P) \
$(PERF_DIR_J) $(PERF_DIR_R)
DIST_SUBDIRS = c cpp python java ruby cl
DIST_SUBDIRS = c cpp python java ruby

View File

@ -1,2 +0,0 @@
dist_noinst_CL = local-lat.lisp local-lat-poll.lisp remote-lat.lisp \
lat-parms.lisp local-thr.lisp remote-thr.lisp thr-params.lisp

View File

@ -1,22 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(in-package :zeromq-test)
(defvar *address* "tcp://127.0.0.1:5555/")
(defvar *roundtrip-count* 1000)
(defvar *message-size* 32)

View File

@ -1,43 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(asdf:oos 'asdf:load-op :zeromq)
(defpackage :zeromq-test
(:use :cl))
(in-package :zeromq-test)
(load "lat-parms")
(zmq:with-context (ctx 1 1 zmq:poll)
(zmq:with-socket (s ctx zmq:rep)
(zmq:bind s *address*)
(let ((msg (make-instance 'zmq:msg)))
(zmq:with-polls ((poll-in . ((s . zmq:pollin)))
(poll-out . ((s . zmq:pollout))))
(dotimes (i *roundtrip-count*)
(zmq:poll poll-in)
(zmq:recv s msg zmq:noblock)
(zmq:poll poll-out)
(zmq:send s msg zmq:noblock))))))
(tg:gc)
#+sbcl (sb-ext:quit)
#+clisp (ext:quit)
;

View File

@ -1,52 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(asdf:oos 'asdf:load-op :zeromq)
(defpackage :zeromq-test
(:use :cl))
(in-package :zeromq-test)
(load "lat-parms")
(zmq:with-context (ctx 1 1)
(zmq:with-socket (s ctx zmq:rep)
(zmq:bind s *address*)
(let ((msg (make-instance 'zmq:msg)))
(dotimes (i *roundtrip-count*)
;; non-blocking recv
#+nil
(tagbody retry
(handler-case
(progn
(zmq:recv s msg zmq:noblock)
(format t "size ~d, ~a~%" (zmq:msg-size msg) (zmq:msg-data-as-array msg)))
(zmq:error-again (c)
(declare (ignore c))
(sleep 0.01)
(go retry))))
;; blocking recv
(zmq:recv s msg)
(zmq:send s msg)))
(zmq:sleep 1)))
(tg:gc)
#+sbcl (sb-ext:quit)
#+clisp (ext:quit)
;

View File

@ -1,54 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(asdf:oos 'asdf:load-op :zeromq)
(defpackage :zeromq-test
(:use :cl))
(in-package :zeromq-test)
(load "thr-parms")
(defvar *elapsed* nil)
(defvar *throughput* nil)
(defvar *megabits* nil)
(zmq::with-context (ctx 1 1)
(zmq:with-socket (s ctx zmq:sub)
(zmq:setsockopt s zmq:subscribe "")
(zmq:setsockopt s zmq:rate *rate*)
(zmq:bind s *bind-address*)
(let ((msg (make-instance 'zmq:msg)))
(zmq:recv s msg)
(setf *elapsed*
(zmq:with-stopwatch
(dotimes (i (1- *message-count*))
(zmq:recv s msg))))))
(setq *throughput* (* (/ *message-count* *elapsed*) 1e6)
*megabits* (/ (* *throughput* *message-count* 8) 1e6))
(format t "message size: ~d [B]~%" *message-size*)
(format t "message count: ~d~%" *message-count*)
(format t "mean throughput: ~d [msg/s]~%" (round *throughput*))
(format t "mean throughput: ~,3f [Mb/s]~%" *megabits*))
(tg:gc)
#+sbcl (sb-ext:quit)
#+clisp (ext:quit)
;

View File

@ -1,50 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(asdf:oos 'asdf:load-op :zeromq)
(defpackage :zeromq-test
(:use :cl))
(in-package :zeromq-test)
(load "lat-parms")
(defvar *elapsed* nil)
(defvar *latency* nil)
(zmq::with-context (ctx 1 1)
(zmq:with-socket (s ctx zmq:req)
(zmq:connect s *address*)
(let ((msg (make-instance 'zmq:msg :size *message-size*)))
(setf *elapsed*
(zmq:with-stopwatch
(dotimes (i *roundtrip-count*)
(zmq:send s msg)
(zmq:recv s msg)))))
(zmq:sleep 1)))
(setf *latency* (/ *elapsed* (* 2 *roundtrip-count*)))
(format t "message size: ~d [B]~%" *message-size*)
(format t "roundtrip count: ~d~%" *roundtrip-count*)
(format t "average latency: ~f [us]~%" *latency*)
(tg:gc)
#+sbcl (sb-ext:quit)
#+clisp (ext:quit)
;

View File

@ -1,41 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(asdf:oos 'asdf:load-op :zeromq)
(defpackage :zeromq-test
(:use :cl))
(in-package :zeromq-test)
(load "thr-parms")
(zmq::with-context (ctx 1 1)
(zmq:with-socket (s ctx zmq:pub)
(zmq:setsockopt s zmq:rate *rate*)
(zmq:connect s *connect-address*)
(let ((msg (make-instance 'zmq:msg)))
(dotimes (i *message-count*)
(zmq:msg-init-size msg *message-size*)
(zmq:send s msg)
(zmq:msg-close msg))
(zmq:sleep 10))))
(tg:gc)
#+sbcl (sb-ext:quit)
#+clisp (ext:quit)
;

View File

@ -1,25 +0,0 @@
;; Copyright (c) 2009 Vitaly Mayatskikh <v.mayatskih@gmail.com>
;;
;; This file is part of 0MQ.
;;
;; 0MQ is free software; you can redistribute it and/or modify it under
;; the terms of the Lesser GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; 0MQ is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; Lesser GNU General Public License for more details.
;;
;; You should have received a copy of the Lesser GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
(in-package :zeromq-test)
;(defvar *address* "pgm://lo;224.0.0.1:8000")
(defvar *bind-address* "tcp://lo:8000")
(defvar *connect-address* "tcp://localhost:8000")
(defvar *message-count* 1000)
(defvar *message-size* 256)
(defvar *rate* 256)