Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Feb 2011 18:47:27 +0300
From:      Dmitry Krivenok <krivenok.dmitry@gmail.com>
To:        freebsd-hackers@freebsd.org
Subject:   mtx_init/lock_init and uninitialized struct mtx
Message-ID:  <AANLkTimGkjDLO7LCgPMKyDGeWTqKZzzFk=bPzkBCfUn6@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Hello Hackers,

Is it allowed to call mtx_init on a mutex defined as an auto variable
and not initialized explicitly, i.e.:

static int foo()
{
   struct mtx m;  // Uninitialized auto variable, so it's value is undefine=
d.
   mtx_init(&m, "my_mutex", NULL, MTX_DEF);
   =85
   // Do something
   ...
   mtx_destroy(&m);
   return 0;
}

I encountered a problem with such code on a kernel compiled with
INVARIANTS option.
The problem is that mtx_init calls lock_init(&m->lock_object) and
lock_init, in turn, calls:

 79         /* Check for double-init and zero object. */
 80         KASSERT(!lock_initalized(lock), ("lock \"%s\" %p already
initialized",
 81             name, lock));

lock_initialized() just checks that a bit is set in lo_flags field of
struct lock_object:

178 #define lock_initalized(lo)     ((lo)->lo_flags & LO_INITIALIZED)

However, the structure containing this field is never initialized
(neither in mtx_init nor in lock_init).
So, assuming that the mutex was defined as auto variable, the content
of lock_object field of struct mtx
is also undefined:

 37 struct mtx {
 38         struct lock_object      lock_object;    /* Common lock
properties. */
 39         volatile uintptr_t      mtx_lock;       /* Owner and flags. */
 40 };

In some cases, the initial value of lo_flags _may_ have the
"initialized" bit set and KASSERT will call panic.

Is it user's responsibility to properly (how exactly?) initialize
struct mtx, e.g.
memset(&m, '\0', sizeof(struct mtx));

Or should mtx_init() explicitly initialize all fields of struct mtx?

Thanks in advance!

--=20
Sincerely yours, Dmitry V. Krivenok
e-mail: krivenok.dmitry@gmail.com
skype: krivenok_dmitry
jabber: krivenok_dmitry@jabber.ru
icq: 242-526-443



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTimGkjDLO7LCgPMKyDGeWTqKZzzFk=bPzkBCfUn6>