[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 2/3] glib: add g_thread_new() compat function
From: |
Michael Tokarev |
Subject: |
Re: [Qemu-devel] [PATCH 2/3] glib: add g_thread_new() compat function |
Date: |
Fri, 02 May 2014 16:30:38 +0400 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.4.0 |
02.05.2014 15:08, Peter Maydell wrote:
> On 2 May 2014 12:01, Daniel P. Berrange <address@hidden> wrote:
>> On Fri, May 02, 2014 at 02:52:23PM +0400, Michael Tokarev wrote:
>>> Stefan Hajnoczi:
>>>> +#if !GLIB_CHECK_VERSION(2, 31, 0)
>>>> +static inline GThread *g_thread_new(const gchar *unused,
>>>> + GThreadFunc func,
>>>> + gpointer data)
>>>> +{
>>>> + GThread *thread = g_thread_create(func, data, TRUE, NULL);
>>>> + if (!thread) {
>>>> + g_error("g_thread_create failed");
>>>> + }
>>>> + return thread;
>>>> +}
>>>> +#endif
>>>
>>> About g_error():
>>>
>>> "This function will result in a core dump; don't use it for errors you
>>> expect.
>>> Using this function indicates a bug in your program, i.e. an assertion
>>> failure."
>>>
>>> I'm not sure if this is like an assertion failure, probably yes. But we
>>> should
>>> not, I think, dump core in this situation. Is there a glib function that
>>> does
>>> (fatal) error reporting but does NOT dump core?
>>
>> I think that's what g_critical is intended for. It is more severe than
>> g_warning, but won't exit or abort the process.
>
> I'm not convinced we should be emitting any kind of
> warning message here anyway -- surely it's up to the
> caller to handle thread creation failure? The glib
> warning/error functions presumably print to stderr,
> which has all the usual issues with possibly messing
> up guest output.
Actually the whole point is moot. Here's what g_thread_new() does (in 2.31+):
GThread *
g_thread_new (const gchar *name,
GThreadFunc func,
gpointer data)
{
GError *error = NULL;
GThread *thread;
thread = g_thread_new_internal (name, g_thread_proxy, func, data, 0, &error);
if G_UNLIKELY (thread == NULL)
g_error ("creating thread '%s': %s", name ? name : "", error->message);
return thread;
}
So that's what we should use in our g_thread_new() impl,
and this is what Stefan used, in a slightly less complex way.
I'll add this to my wrapper too.
Thanks,
/mjt