[Spice-devel] [PATCH] log: add not fatal spice_return function
Francois Gouget
fgouget at codeweavers.com
Fri Nov 20 07:26:22 PST 2015
On Thu, 19 Nov 2015, Frediano Ziglio wrote:
[...]
> > What do you mean by "100% compatible with the current code"? (why is
> > g_return_if-fail() not "100% compatible with the current code" ?)
>
> well... implementation is quite different. I didn't get all differences but
> - spice_logv use some environment SPICE_* specific (I doubt Glib does!);
> - Glib output on standard error or output based on level;
> - surely something I forgot!
Does it matter?
The client uses the g_return_xxx() functions already. Would it be a
problem if the server did too instead of going its separate way?
> Didn't investigate so deep to be able to tell all list but surely just
> with these I'm not comfortable to do a sed and release tomorrow...
Let me summarize. Currently we have:
1. Plain old and trustworthy assert().
Used by server/dispatcher.c.
2. g_return_if_fail() which does not log the way spice functions do.
Used by server/reds_stream.c and most of the client code.
3. spice_assert() which crashes the application.
Used by most of the server code but not by the client.
4. spice_return_if_fail() which claims to return but instead crashes the
application, exactly like spice_assert().
Also used in most of the server code but not by the client.
5. And you propose adding spice_return_if_fail_warning() to fix this mess.
I really don't see how adding more functions is going to make this less
confusing and error prone! Particularly if there is not a concerted
and swift effort to clean up the old code.
Not fixing spice_return_if_fail() does not make any sense either (yes, a
functions that crashes the application under the guise of returning to
the caller is *totally* buggy).
The code calling spice_return_if_fail() was written under the assumption
that it would return. So just switch the default
SPICE_ABORT_LEVEL_DEFAULT to SPICE_LOG_LEVEL_ERROR.
But it would also really help if the different Spice pieces like the
server and client could agree on whether to use glib functions or not.
Note that spice_error() needs to be fixed too. That name implies the
function logs an error just like spice_warning() logs a warning, not
that it crashes the application. spice_error() should be renamed to
spice_fatal(). For consistency it might make sense to rename
SPICE_LOG_LEVEL_ERROR to SPICE_LOG_LEVEL_FATAL.
Then there's memory handling where we see the same issues yet again:
1. malloc() & co.
Used in server/red_replay_qxl.c and some lz encoders.
2. spice_malloc() & co.
Used by most of the server code but not by the client.
3. g_malloc() & co.
Use by most of spice-gtk and but only a test file on the server!
This duplication of basic functionality needs to stop. It's confusing
and can only lead to bugs. Nobody wants to track for each pointer
whether it should be freed with free(), g_free() or the nonexistent
spice_free()!
> Calling spice_* functions instead of spice_* functions looks like 100% compatible :)
I'm not very impressed by this argument. Do you mean that, just because
they both start with 'spice_', spice_assert() and spice_strndup() are
interchangeable?
--
Francois Gouget <fgouget at codeweavers.com>
More information about the Spice-devel
mailing list