/usr/share/lua/5.1/cqueues/auxlib.lua is in lua-cqueues 20161214-2build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | local loader = function(loader, ...)
local cqueues = require"_cqueues"
local errno = require"_cqueues.errno"
local auxlib = require"_cqueues.auxlib"
local coroutine = require"coroutine"
--
-- auxlib.tostring
--
-- Yieldable tostring. Implemented in C for Lua 5.2 and above.
--
-- Lua 5.1 API doesn't allow us to implement a yieldable tostring
-- routine. Fortunately, LuaJIT's tostring permits yielding.
--
auxlib.tostring = auxlib.tostring or tostring
--
-- auxlib.resume
-- auxlib.wrap
--
-- Wrappers for multilevel coroutine management to allow I/O polling
-- of coroutine-wrapped code. The code checks for a special value
-- returned by cqueues.poll, and will propogate a yield on I/O.
-- Everything else should behave as usual.
--
local _POLL = cqueues._POLL -- magic internal value
local l_resume = coroutine.resume -- take reference to permit monkey patching
local l_yield = coroutine.yield
local function c_resume(co, ok, arg1, ...)
if ok and arg1 == _POLL then
return auxlib.resume(co, l_yield(_POLL, ...))
else
return ok, arg1, ...
end
end -- c_resume
function auxlib.resume(co, ...)
return c_resume(co, l_resume(co, ...))
end -- auxlib.resume
local function c_wrap(co, ok, ...)
if ok then
return ...
else
error((...), 0)
end
end -- c_wrap
function auxlib.wrap(f)
local co = coroutine.create(f)
return function(...)
return c_wrap(co, c_resume(co, l_resume(co, ...)))
end
end -- auxlib.wrap
--
-- auxlib.assert
--
-- If condition is false, locate and use the first non-false,
-- non-nil value as the reason. If an integer value, attempt to
-- convert to string using strerror.
--
-- RATIONALE: Many routines return only an integer error number.
-- Errors like EAGAIN are very common and constantly pushing a new
-- string on the stack from C would be inefficient.
--
-- Also, unlike the standard Lua idiom, the failure mode for some
-- routines will return multiple false or nil values preceding the
-- error number so user code doesn't need to use variable names like
-- "value_or_error" for routines which can be expected to fail
-- regularly in the normal course of operation and where simply
-- using the assert idiom would create spaghetti code.
--
local tostring = auxlib.tostring
local function findwhy(v, ...)
if v then
if type(v) == "number" then
-- return string and number for auxlib.fileresult
return (errno.strerror(v) or tostring(v)), v
else
return tostring(v), ...
end
elseif select("#", ...) > 0 then
return findwhy(...)
else
return
end
end
function auxlib.assert(c, ...)
if c then
return c, ...
end
return error(findwhy(...), 2)
end -- auxlib.assert
--
-- auxlib.assert[23456789]
--
-- Like auxlib.assert, but use error(message, level) where level is
-- the numeric suffix of the assert function name.
--
local function makeassert(level)
return function (c, ...)
if c then
return c, ...
end
return error(findwhy(...), level)
end
end
for n=2,9 do
auxlib[string.format("assert%d", n)] = makeassert(n)
end
--
-- auxlib.fileresult
--
function auxlib.fileresult(c, ...)
if c then
return c, ...
else
return c, findwhy(...)
end
end -- auxlib.fileresult
auxlib.loader = loader
return auxlib
end -- loader
return loader(loader, ...)
|