Re: Is GObject threadsafe?!



On Wed, 2007-07-04 at 23:08 +0200, Tomasz Jankowski wrote:
Ok, so I can mix object implementation with GStaticRWLock and make
something like this:

static void
socket_set_property (GObject *object, guint prop_id, const GValue
*value, GParamSpec *pspec)
{
    g_return_if_fail (IS_SOCKET (object)); 
    
    SocketPrivate    *priv_data = SOCKET_PRIVATE (SOCKET (object));

    g_static_rw_lock_writer_unlock (priv_data->rw_mutex);
    switch (prop_id)    {
       /*...*/
    }
    g_static_rw_lock_writer_lock (priv_data->rw_mutex);
}

static void
socket_get_property (GObject *object, guint prop_id, GValue *value,
GParamSpec *pspec)
{
    g_return_if_fail (IS_SOCKET (object));

    SocketPrivate    *priv_data = SOCKET_PRIVATE (SOCKET (object));
    
    g_static_rw_lock_reader_unlock (priv_data->rw_mutex);
    switch (prop_id)    {
       /*...*/
    }
    g_static_rw_lock_reader_lock (priv_data->rw_mutex);

}


I add GStaticRWLock to object's private data. What do you think about
this idea? 

A number of points:

(a) You have your locks and unlocks the wrong way round
(b) The circumstances in which it is right to incur the overhead of a
read/write lock instead of using a plain mutex are very limited.
(c) Apart from that, if using a read/write lock instead of mutex you
would also need to look at the code which gets a property to make sure
it does not change any member data in any way (in other words, it
supports concurrent unlocked reads).  It probably doesn't change member
data, but you would need to check.
(d) Your scheme will only work (whether using a read/write lock or a
mutex) if on every occasion on which a property on the object is set or
read, it is done via your specialised functions and not the standard
GObject property functions.  I do not know enough about GObject to tell
you whether that is easily enforced or not, and whether you have chosen
the best way to do it.

Chris





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]