Movatterモバイル変換


[0]ホーム

URL:


Stackable Continuation Queues

descriptionusagetodonewslicensesourcedownloadprojectsabout author

description

cqueues is a type of event loop for Lua,except it's not a classic event loop. It doesn't usecallbacks—neither as part of the API norinternally—but instead you communicate with anevent controller by the yielding and resumption ofLua coroutines using objects that adhere to a simpleinterface.

cqueues are also stackable. Eachinstantiatedcqueue is a pollable objectwhich can be polled from anothercqueue, oranother event loop system entirely. The design ismeant to be unintrusive, composable, and embeddablewithin existing applications—such as Apache orNginx—or used standalone. It maintains noglobal state and never blocks your thread ofexecution.

cqueues includes a sockets library withDNS, buffering, end-of-line translation, SSL/TLS,and descriptor passing support builtin. Domainquerying, connection establishment, and SSLnegotiation are handled transparently as part of astate machine entered with every I/O operation, sousers can read and write immediately uponinstantiating the object, as if opening a regularfile.

cqueues also includes modules for handlingsignals, threads, and file change notificationsusing native kernel facilities—such assignalfd on Linux, or Solaris PORT_SOURCE_FILE forfile events—and accessible through easy to useinterfaces which abstract the different kernelfacilities.

Additional modules include a light-weightuser-defined event system using the conditionvariable pattern, and a comprehensive interface forDNS querying.

cqueues is almost entirely self-contained,with the sole external dependencies being OpenSSLand, of course, Lua (Lua 5.2 or LuaJIT). However, itonly works on Linux, NetBSD, OpenBSD, FreeBSD,Solaris, OS X, and derivatives. The concept is notportable to Windows because Windows lacks an analogto the pollable event queues of modern Unix systems.Libraries which try to abstract the twoapproaches—event readiness signaling versusevent completion—invariably produce a pallidleast common denominator library suffering all theweaknesses and enjoying none of the strengths ofeach approach.

cqueues is presently being used inproduction for several high-traffic services.However, I try to "release early, release often".Caveat emptor.

usage

Comprehensive usage is documented in thecqueues Userguide PDF.For easy browsing use a PDF viewer with a side tabfor the table of contents, such as Preview.app on OSX.

See examples/ in the project tree for example scripts.

A simple client example showing SSL and cqueuecontroller nesting:

local cqueues = require("cqueues")local socket = require("cqueues.socket")local con = socket.connect("www.google.com", 443)con:starttls()local inner = cqueues.new()local outer = cqueues.new()inner:wrap(function()con:write("GET / HTTP/1.0\n")con:write("Host: www.google.com:443\n\n")for ln in con:lines() doprint(ln)endend)outer:wrap(function()assert(inner:loop())end)assert(outer:loop())

A simple multiplexing echo server:

local cqueues = require("cqueues")local socket = require("cqueues.socket")local srv = socket.listen("127.0.0.1", 8000)local loop = cqueues.new()loop:wrap(function()for con in srv:clients() doloop:wrap(function()for ln in con:lines("*L") docon:write(ln)endcon:shutdown("w")end)endend)assert(loop:loop())

todo

Add interfaces for handling HTTP chunked transferencoding, including when used simultaneously withmultipart message support. Example:socket:setchunk(1234). This will set a readbarrier--similar to how datagram support ishandled--which causes block- and line-buffered readsto complete early when the barrier is reached.

Add file globbing to notify module.

Add socket read mode which specifies a Lua stringpattern, e.g. "^%d+". Alternatively, finishLPegK work.

Integrate our timing wheel library for O(1)timeouts, replacing the LLRB implementation.

Employ O_EVTONLY on OS X so file change notificationsdon't prevent unmounting a drive.

Check PID in cqueues:step and reconstruct our kernelevent queue if the application forked.

Return unique ID as second return value fromcqueues:wrap and cqueues:attach. And return this IDfrom the cqueues:errors and similar interfaces soit's easier to detect and handle which coroutinefailed.

news

2016-10-18

Support OpenSSL 1.1 API. (@daurnimator)

Support clock_gettime with macOS Sierra / XCode 8.0. (Reported by@ziazon)

Support accept4 and paccept for atomic O_CLOEXEC. (@daurnimator)

Remove assert which aborted process when attempting to resume a deadcoroutine as it doesn't necessarily signal process corruption.(@daurnimator)

Enable IPv6 AAAA queries in socket.connect.

Support passing Lua 5.3 integers as arguments to thread.start. (Reportedby and preliminary patch from @daurnimator)

Basic SOCK_SEQPACKET support. (@daurnimator)

Tagged release rel-20161018 (9e2a3bcce5fc916960958bfdd5d9364a36534ece).

2016-03-16

Allow yielding through cqueues:step. Patch by daurnimator.

Use SSLv23_server_method instead of SSLv3_server_method when guessingthe TLS handshake mode—server or client—as many OpenSSL forks havedeprecated or removed SSLv3-specific APIs. Fix from daurnimator.

Support SO_BROADCAST. Fix from daurnimator.

Fix v6only flag. Fix from daurnimator.

Tagged release rel-20160316 (b3705932920d7d597ad493f2810f47eda9e49322).

2015-09-07

Fix bugs with getsockname andgetpeername—AF_UNIX sockaddr length canvary considerably based on system call andoperating system. Report and fixes fromdaurnimator. See PORTING.md for extendeddescription of varying behavior.

Fix to socket.fdopen for regular files. Reportand fix from daurnimator.

Allow non-string error objects to bereturned from cqueues:step, et al. Fix fromdaurnimator.

Set contoller alert on cancellation toensure any controller polling on thatcontroller wakes up. Report by daurnimator.

Enhance accept to take an options argument.Fix from daurnimator.

Fix wrong order of parameters to fcntl insocket.dup.

Set errno when returning from BIO hooks asOpenSSL expects unrecoverable, generic errorvalues to be in errno. Report bydaurnimator.

Fix stack offsets in config:getlookup and config:getsearch. Report andfixes from tibboh.

2015-06-30

Replace remaining uses of strerror withour thread-safe cqs_strerror macro.

2015-06-29

Add autoflush support, enabled by default.When enabled, each logical read executesconcurrently with an opportunistic flush, asif each non-blocking read attempt within the:read method were proceeded by :flush(0).When initiating TLS, the output buffer isfully flushed before initiating TLS, as-if:flush were called before :starttls.

Add pushback support, enabled by default.The first call to :starttls pushes all datain the input buffer back to the socket layerso it's read as part of the TLS handshake.This prevents smuggling of data into thesecure phase of the session when upgradingto TLS, and also supports protocols whichpipeline TLS handshake data with commands,as with XMPP Quickstart.

Ignore EOPNOTSUPP when trying to reset SO_REUSEPORT.

2015-06-16

Add support for POLLPRI.

Fix Solaris Ports controller alerts.

Add support for eventfd for controller alerts.

Synchronize dns.c with upstream.

Various bug fixes.

2015-03-10

:step, :loop, and :errors now return additional error information.

2015-02-18

Use newproxy to detect object leaks in Lua5.1/LuaJIT because Lua 5.1 language doesn'tsupport __gc metamethods on tables.(daurnimator)

2015-01-19

Add IPV6_V6ONLY support.

Rename undocumented socket.fdopen to socket.dup, andadd socket.fdopen which takes ownership of the specified descriptor number.(Previously socket.fdopen would dup the descriptor.)

Use F_DUPFD_CLOEXEC, SOCK_CLOEXEC, and MSG_CMSG_CLOEXEC if available.

Wrap .sa_bind option of low-level socket library.

Optimize the way we put a controller in a ready state when signalinga condition variable.

Put a controller into a ready state whenwrapping a function or attaching a coroutine.

Support Lua 5.3.

Tagged release rel-20150119 (56fd893388f592fa2e8f9cb91b99231b1ba8a23e).

2014-10-20

Allow :events methods to return event set as integer bitset.

Fix NULL-dereference when calling :connect method on a socket created using socket.pair or socket.fdopen.

Fix cqueues.poll when polling outside of a managed coroutine.

2014-09-30

Fix build dependency where M4 fails but thecommand line still creates the target. Onsubsequent invocations make thinks thetarget is satisfied.

Handle numeric hosts differently so thatsocket.listen doesn't try to build aresolver. On OS X when the network is notconnected /etc/resolv.conf doesn't exist, sobuilding a resolver results in an ENOENTerror. This prevented listening on theloopback, 0.0.0.0, or ::1 when the networkwas disconnected.

2014-09-23

Add TLS Server Name Indication (SNI)support. SNI is enabled by default, usingthe socket.connect host name. An explicithost name can be specified, or SNI can bedisabled, by setting the .sendname socketoption. See thecqueues UserguidePDF for more information.

2014-09-16

Fix out-of-bounds write when reading inotify events, reported by Timo Teräs.

2014-07-29

Fix compilation on NetBSD 5.1, which lacksconstant NAN definition.

Make promise.new function optional.

Fix :recvfd to handle no descriptor in message.

Document promise module.

Tag rel-20140729 (622b5baa1115f634408182660e668cb76a59d316).

2014-07-07

Add ability to pass functions as argumentsto thread start routine. For C functionsdladdr(3)+dlopen(3) is used to anchor thefunction in memory, in case the initiatingthread later unloads the module. This is thesame mechanism used when installing lockhandlers in OpenSSL.

2014-07-02

Pass on any additional arguments tocqueues:wrap when first resuming. Obviatesthe need to create an expensive closureevery time you want to execute a taskasynchronously.

Add promise module. Unlike JavaScript'spromise interface, it's simple as it doesn'tneed to supplement for the inability towrite logically synchronous code. It'smore similar to C++11's promise/futureinterface, with :set, :get, and :wait,plus __call and __tostring metamethods.

Add cqueues.auxlib module, including newyieldable tostring implementation. Movedcqueues.assert, cqueues.resume, andcqueues.wrap to auxlib. Add auxlib.assert3,.assert4, etc, for assertions which callerror() with a greater stack level. Addauxlib.filesresult, which converts thesocket API return protocol to Lua's file APIreturn protocol (specifically, error stringfollowed by system error number).

2014-06-27

Add maxerrs limit to catch unchecked errorloops. Unchecked error loops are more likelyto happen now that errors are repeated untilcleared.

Add :setmaxerrs method to changedefault unchecked error limit of 100.

2014-06-17

Add resolver pool module.

Fix SRV parsing bug in DNS library.

Update root nameserver hints within DNSlibrary.

2014-06-12

Don't abort process on assert(3) when callerimproperly calls dns_res_check afterdns_res_fetch, which happens when callingresolver:fetch multiple times.

2014-06-07

Add SO_REUSEPORT support.

2014-05-26

Text-mode block reads now should behave justlike C's stdio. That is, if 1024 bytes arerequested, then 1024 bytes are returned,which may have necessitated reading morethan 1024 bytes from the socket given anyEOL translations or to ensure a trailingcarriage return is not followed by alinefeed. Previously all block reads wereperformed as-if in binary mode, without anyEOL translation.

Add a read mode for MIME boundaries. Passinga string with the prefix of -- will readblocks of data up to the specified MIMEboundary. Any trailing CRLF or LF isstripped from the last block, regardless ofinput mode, as that's part of the boundarysyntax. If text mode is enabled then blocksof multiple, EOL-translated lines arereturned together, up to the maximumlimit set by the greater of :setbufsiz and:setmaxline, but usually less than that toavoid splitting lines unnecessarily. Inbinary mode blocks of a fixed sized arereturned (as specified by :setbufsiz),except for the last block, which might beless than the block size.

Add socket.debug.lua, which contains unittests and, in the future, auxiliaryinterfaces for debugging.

2014-05-07

Add wrappers to coroutine.resume andcoroutine.wrap, which support multilevelyielding on polling. This permits codeinside a user code coroutine to still pollI/O without interfering with theresume/yield protocol of the user code. Butthese wrappersare not monkeypatched into the current environment, sothey must be used explicitly, or manuallyassigned as replacements to coroutine.resumeand coroutine.wrap.

Tag rel-20140508 (3e322160ea3b0e2b4e7d5c188ec7cd869b0d338e).

2014-05-03

Add fast metatable checking to socketsmodule, to match controller and conditionvariable module implementations. The speedgain in validating userdata objects is onlyapproximately 30%, so it's probably notworth it to add this to any more modules asthe absolute cost is miniscule and they'renot called as heavily.

Add .type routine to controller, socket,thread, condition variable, signal listener,file notification, and dns modules.

Make sure all our pollable objects havethree :pollfd, :events, and :timeoutmethods.

Allow :pollfd to return a conditionvariable, allowing user objects to mimicother pollable objects.

2014-05-02

Don't return to buffered I/O callers anEPIPE received on input channel. Thatbehavior snuck in after various changes toerror and flow-control handling.

Make thrown socket errors include adescription of the socket's peer name.

2014-05-01

Add timeout capability to all buffered I/Oroutines through :settimeout. Buffered I/Oerrors are not preserved across calls untilexplicitly cleared with :clearerr, toprevent unsuspecting code dropping data ontransient errors, particularly timeouterrors.The behavior of :starttls hadto change for the sake of consistency. Itwill now poll until completion, rather thanreturn immediately.

2014-04-19

Add fast metatable checking to thecontroller code, and short circuit on socketobjects by calling straight into the socketlibrary C code for the polling parameters.

2014-03-30

Add chat server example.

2014-03-28

Add :peereid and :peerpid socket methods.

Fix endless loop bug when an AF_UNIX socketcould not be bound. The failure pathdepended on the SO_S_GETADDR iterator stateto try another socket name or return theerror. But the SO_S_GETADDR iterator stateisn't used for AF_UNIX sockets.

Fix linking on various platforms after werequired dlopen/dlsym in the threadingmodule.

Add socket:listen wrapper to simplify errordetection on listening sockets.

Silence some obnoxious compiler warnings onLinux and Solaris. They were totally bogus,but I finally relented because of the noise.

Tag rel-20140328 (52aec6d478cced10669254d90b6813a4c60ad602).

2014-03-22

Remove openssl module documention and moveto dedicated user guide under luaosslproject.

Add Lua 5.3 support.

Tag rel-20140322 (bd7b727a9a212d8582af0bc9fce413285da7ebaf).

2014-03-21

Add condition variable module, allowinglight-weight user-defined events.

Add socket:connect wrapper to simplifyexplicit connect-phase timeout management.

2014-02-20

Support primitve types other thanLUA_TSTRING when passing arguments to a newthread.

2014-01-30

Install OpenSSL mutexes when loading threadmodule.

Tag rel-20140130 (2d1f959d2c4ef82f4d0dcddd5812ed3803707648).

2013-12-09

Fix slurp mode, which only slurped until theinput bufsiz was filled. It resulted in aspurious EFAULT error being thrown (thedefault if errno == 0), because the codebehaved as if something failed.

Fix socket.connect documentation to matchthe actual code.

2013-12-06

Add openssl.rand.uniform() for generatingcryptographically strong, uniform randomintegers in the interval [0, N-1]. Themaximum interval is [0, 2^64-1], althoughfor Lua 5.1 and 5.2 you're restricted to theintegral range of your Lua VM number type,which is too narrow in most implementations.Lua 5.3 is expected to add a 64-bit integertype.

2013-12-05

Obey SOCK_DGRAM semantics in input bufferingcode. Output buffering should work withoutchanges, provided the output modes aresane—no buffering, line buffering, orexplicit flushing when fully buffered.

Implement the "*a" slurp operation. Reads toEOF on SOCK_STREAM sockets, or the nextmessage for SOCK_DGRAM.

Add openssl.rand module, with bindings toOpenSSL RAND_bytes and RAND_status.

Add :setbufsiz and :setmaxline methods, soapplications can manipulate the internalsoft buffer sizes and hard line limits.

Add :errors iterator method on cqueuesobject, so looping over continuation errorsis made easier. Also add :loop method, tomake it easier for constructs which onlywant to loop until an error is encountered.

2013-10-23

Fix module preloading from threads to useloadstring on Lua 5.1/LuaJIT. Fix bug whichcleared the O_NONBLOCK flag on pipedescriptors used for thread joining.

2013-09-09

Refactored build system to be non-recursive,and to use new luapath script, enablingsimultaneous builds of both Lua 5.1 and Lua5.2 modules in a single invocation. I neededthis for work, plus it makes developmentmuch easier.

2013-03-14

Fixed bug in digest and HMAC modules whichleft the last argument to :updateunprocessed.

Added openssl.cipher module, which bindsOpenSSL EVP_CIPHER_CTX objects.

Moved the build to GNUmakefile. Now Makefileis a POSIX compatible stub using the special.DEFAULT target to forward to an invocation ofgmake. This allows simply invoking make(1)on all supported platforms, presuming gmakeis also installed.

2013-03-02

Fixed bug in *h and *H read modes.

Added example HTTP daemon.

2013-02-28

Added helper script to derive Luacompilation and installation paths. Simplypassing prefix="..." to make should find theproper headers, even if multiple versionsare installed, and select the properinstallation paths. luainclude, luapath,luacpath, and LUAC can still be explicitlyspecified.

2013-02-27

Changed the Make variables lua52include,lua52path, and lua52cpath to justluainclude, luapath, and luacpath.

2013-02-26

Added openssl.pubkey:sign andopenssl.pubkey:verify, which bind OpenSSLEVP_SignFinal andEVP_VerifyFinal.This allows constructing ad hoc signatureschemes in applications.

2013-01-31

Added openssl.digest and openssl.hmac modules.

2013-01-29

Wrap dns_res_stat as resolver:stat, whichreturns a table of transmission statistics.

Tag rel-20130129 (65e4bf06b2d97741043dd52f5ad691014c67e7a9).

2013-01-13

Added Makefile.debian, which was mistakenlyleft out of the tree previously.

2013-01-06

Added Debian dpkg build. make -fMakefile.debian will build a lua-cqueuesmodule.

2012-10-15

Added and documented new bindings forSSL connection instances, including anew socket:checktls() method.

2012-10-14

Added and documented DNS bindings.

Fixed OpenBSD build.

2012-10-11

Documented OpenSSL bindings in PDF userguide.

2012-10-10

Fixed LuaJIT compilation. No guarantees itwon't break, however. Certainly one must becareful not to hold an upvalue reference toa cqueue controller from a coroutine,otherwise neither will ever be collected.Use cqueues.running, instead, to get areference to the running controller.

2012-10-09

Added insanely comprehensive OpenSSLbindings in ext/, including Lua bindings formanipulating bignums, public keys, X.509certificates (names, altnames, chains,stores, etc), and SSL_CTX objects.

These bindings are similar to a X.509 PerlXS module I wrote several years ago and usedfor a CA which dynamically issuedcertificates to clients on an encryptedmultimedia streaming network. That Perlmodule was proprietary, unfortunately. But Ilike using Lua better, anyhow.

2012-09-25

Added a title page and examples to userguide, and tidied up some of the sections.

2012-09-24

Added file change notification modulesupporting all three kernelfacilities—Linux inotify, BSD EVFILT_VNODE,and Solaris PORT_SOURCE_FILE.

Tag rel-20120924 (dc930e4b0408556601b1bf78a26213f6387fee8b).

2012-09-18

NetBSD 5.1 also has a brokenpselect—neither pending nor unblockedsignals are delivered insidepselect—so use internalimplementation.

Added thread.start and accompanying threadmodule. On FreeBSD and NetBSD, if using thelua command-line interpreter it must belinked with pthreads, otherwise thread.startwill hang.

2012-09-17

Added pselect for OpenBSD and Apple usingsigpending to predict interrupts before thesignal swap and kqueue EVFILT_SIGNAL todetect interrupts after the swap.

2012-09-14

Added socket.connect{} and socket.listen{},which allow passing socket options as wellas specifying a UNIX domain socket pathinstead of host/port pair. See README fordocumentation.

Added socket:uncork, for disabling theTCP_NOPUSH or TCP_CORK option set in theconnect options table.

Added socket:close, for explicit andimmediate closure of socket resources.

2012-09-11

Added *h and *H read modes for reading MIMEheaders. Returns nil when a compliantheader—field name, optional blanks, andcolon—cannot be scanned from the head ofthe buffer.

2012-09-09

Added socket.onerror and socket:onerror,which allow specifying per-socket errorhandlers. The handler receives atuple—self, method-string, error-integer.It should either return an error-integer orthrow an error.

By default EPIPE and ETIMEDOUT are returneddirectly; everything else thrown. EAGAIN isonly ever returned from the semi-privateinternal methods, which always return socketerrors directly.

Error codes are now always returned asinteger values, unless thrown as formattedexception strings. Previously, some werereturned as strings.

2012-08-25

Added socket.pack and socket.unpack, forbuffered network byte order bit packing.

2012-08-22

POSIX threading work is mostly done, exceptfor some magic which will allow copyingcqueues modules into the new Lua VM. Thiswill allow creating and running threadswhile inside a chroot jail. Access to otherLua modules could then be arranged via IPCor some other mechanism, with at leastcqueues and the standard Lua modulesavailable for use.

2012-08-13

Added descriptor passing with socket.sendmsgand socket.recvmsg. Both bypass normalbuffering. sendmsg sends Lua files, cqueuessockets, or integer descriptors. recvmsgalways returns a cqueues socket object.

2012-08-12

Add cqueues.cancel and cqueue:cancel, whichallow explicit removal of a descriptor frompolling queues, in preparation for allowingexplicit early closure of descriptors.

Add cqueues.running, which returns thetop-most cqueue currently executing, if any.The second return value is a boolean, trueonly if the calling coroutine is the onewhich the cqueue resumed.

Add a new cqueues.signal module. Signaldisposition can be manipulated withsignal.ignore, signal.default,signal.discard, signal.block, andsignal.unblock. Each takes a series ofsignal number parameters, e.g.signal.SIGTERM, signal.SIGHUP, etc.

Add support for BSD EVFILT_SIGNAL and Linuxsignalfd. To create a new signal listener,dolocal sl = signal.listen(signal.SIGTERM).To poll for a signal call sl:wait([timeout]), whichreturns the signal number, or nil ontimeout.

Solaris has nothing comparable toEVFILT_SIGNAL or signalfd, so Solaris uses asmall timeout. For immediate response tosignals for simple process management, asimple pattern using the new cqueue:pauseroutine can be used. cqueue:pause is awrapper around pselect, which allowsatomically changing a signal mask whenpolling on a descriptor. Seeexamples/signal.pause for an example of thepattern.

I elected not to implement any hacks tohandle signal retrieval from the main loop.Most event loops set a global handler whichwrites to a global pipe. But cqueues isintended to be embeddable, and automaticallymucking around with global process state isto be avoided.

2012-08-06

Add socket.pair binding to the socketpairsyscall. Takes one optional argument, either"stream" or "dgram". On success returns twosocket objects bound to each other,otherwise returns two nils and an errornumber.

This is in preparation for adding proc.forkand thread.start. Each will return a socketobject to use for IPC with the new processor thread. I will also need to addsocket:sendmsg so descriptors can be sent,as well.

2012-08-05

Merged SIGPIPE suppression and/etc/nsswitch.conf support into dns.c.The work was done in this tree, but see thedns.c project pagefor a description.

Tag rel-20120805 (6d673b77209e1a5e4b1d37c25ec8600e73e3af5c).

2012-08-04

Fix Solaris port_getn usage bug triggered bysignal interruption.

2012-07-13

Change Solaris build to use native SunPro bydefault. Fix SunPro warnings aboutunsupported GCC attributes originally usedjust to silence GCC and (especially) clangwarnings. SunPro seems to have a brokendiagnostic pass confused by macroized calls,resulting in erroneous "argument mismatch"warnings.

NetBSD's kevent definition uses intptr_tinstead of void * for the .udata member. Fixconversion warnings by casting totypeof(.udata).

Add cqueues.VERSION, cqueues.VENDOR, andcqueues.COMMIT to identify different libraryversions.

Tagged release rel-20120713 (99cae0d736239a910c1dfc901335a7cc5fcf7f3d).

2012-07-12

Add yielding socket:accept() withsocket:clients() iterator. Add examplescript, echo.srv, to show usage.

Add cqueues.monotime, which returnsthe system's monotonic clock time.

Unbreak FreeBSD after fixing Solaris byteorder issue in dns.h. FreeBSD also defines_BIG_ENDIAN, but the semantics are likeBYTE_ORDER/BIG_ENDIAN, not the booleanbehavior on Solaris.

Use esyscmd when generating errno tablebecause NetBSD's M4 implementation hadflushing issues and divert/undivert wouldn'twork to solve it. Solaris lacks esyscmd, sostick with syscmd, which didn't exhibitflushing issues.

Tagged release rel-20120712 (b8deeb0e663d163d567c24adb5fd1291e1b6e8ae).

At this time, rel-20120712 is known to build and run on NetBSD 5.1,FreeBSD 9.0, Ubuntu Linux 12.04, Solaris 11, OS X10.7.4, and OpenBSD 5.1.

2012-07-11

Tagged release rel-20120711 (e0f6fbbb05cb7aa5d95becd6251417155987205e).

2012-07-10

Tagged release rel-20120710.

license

Copyright (c) 2012-2017William Ahern
Copyright (c) 2014-2017Daurnimator

Permission is hereby granted, free of charge, to anyperson obtaining a copy of this software andassociated documentation files (the "Software"), todeal in the Software without restriction, includingwithout limitation the rights to use, copy, modify,merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons towhom the Software is furnished to do so, subject tothe following conditions:

The above copyright notice and this permissionnotice shall be included in all copies orsubstantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTYOF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOTLIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE ANDNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS ORCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGESOR OTHER LIABILITY, WHETHER IN AN ACTION OFCONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF ORIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHERDEALINGS IN THE SOFTWARE.

source

git clone http://25thandClement.com/~william/projects/cqueues.git

Orvisit the GitHub mirror

download

cqueues-20171014.tgz

cqueues-20161215.tgz

cqueues-20161018.tgz

cqueues-20160316.tgz

cqueues-20150907.tgz

cqueues-20150119.tgz

cqueues-20140729.tgz

cqueues-20140508.tgz

cqueues-20140328.tgz

cqueues-20140322.tgz

cqueues-20140130.tgz

cqueues-20130129.tgz

cqueues-20120924.tgz

other projects

airctl |bsdauth |cnippets |libarena |libevnet |authldap |streamlocal |libnostd |zoned |dns.c |delegate.c |llrb.h |lpegk |json.c |cqueues |siphash.h |hexdump.c |timeout.c |luapath |luaossl |lunix |phf |runlua |autoguess |tarsum |prosody-openbsd |AnonNet

[8]ページ先頭

©2009-2025 Movatter.jp