[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: Question regarding handling lua strings inside C API
- From: Alexey Melnichuk <alexeymelnichuck@...>
- Date: Sun, 5 Apr 2015 11:11:13 +0400
> I understand that C code generally should not store the pointer to a
> string returned by lua_tostring beyond the lifetime of the C function
> call.(PIL says "The lua_tostring function returns a pointer to an
> internal copy of the string. Lua ensures that this pointer is valid as
> long as the corresponding value is in the stack. When a C function
> returns, Lua clears its stack; therefore, as a rule, you should never
> store pointers to Lua strings outside the function that got them.")
> However, is this restriction strictly true if I can guarantee - from
> my code flow - that the original string in lua will continue to be in
> reachable (that is, it is not garbage collected) when my C function
> call returns?
> Here is my actual scenario: Luaw HTTP server uses Lua coroutines to
> handle multiple connections simultaneously. While generating response
> a Lua coroutine calls a C function with Lua string that the C function
> is eventually supposed to write to socket. But since the socket write
> may block, the C function actually uses async write API (libuv to be
> specific) to write to the socket. The function then returns
> immediately and the Lua coroutine that called the C function yields to
> suspend itself. When the socket is ready for the actual write, libuv's
> async API invokes a C callback that writes the string on the socket
> and then resumes the suspended coroutine.
> Is it safe to not make a copy of a lua string in C function in this case?
I really do not think this is safe. e.g. `sok:write("HELLO " ..
"WORLD")`. Result string has no anchor. In my binding I just make
Lua reference to string and unref it in write callback .
Same thing works if you want write array of strings. You do not copy
data but make reference to array. And it works With Lua >= 5.1
Also for Lua 5.3 and if you use userdata to store write request you
can use UserValue associated with this request.
Это сообщение проверено на вирусы антивирусом Avast.