broken lock API in gtk_main ()



currently,

gtk_main() behaves as follows:


1)
  /* gdk-lock locked by other thread */
  gtk_main (); /* wait for other thread to release lock, then acquire, operate */
  /* gdk-lock acquired */

2)
  /* gdk-lock released */
  gtk_main (); /* acquire, operate */
  /* gdk-lock acquired */

3)
  /* gdk-lock acquired by self */
  gtk_main (); /* operate */
  /* gdk-lock acquired */

the behaviour of (3) is fine for calling gtk_main() recursively (modal
dialogs).
(2) is what happens in main () { [...] gtk_main(); }, it actually works
just out of luck, that is, releasing a non acquired lock works on most
platforms nonetheless, while (1) is fundamentally broken.

cases (1) and (2) have asymetric lock behaviour (not locked by self upon
entry, locked by self upon return) and need to be fixed.
(2) could be hacked around (this is the common main() case) with
figuring lock state via g_mutex_trylock() upon entry and releasing
the lock upon return if FALSE was returned. that'll still maintain
(3) but unfortunately break (1) (note that (1) is broken already).

to ultimately fix all three cases, i.e. get:

1)
  /* gdk-lock locked by other thread */
  gtk_main (); /* wait for other thread to release lock, then acquire, operate */
  /* gdk-lock RELEASED */

2)
  /* gdk-lock released */
  gtk_main (); /* acquire, operate */
  /* gdk-lock RELEASED */

3)
  /* gdk-lock acquired by self */
  gtk_main (); /* operate */
  /* gdk-lock acquired */

we need to be able to check if the lock is acquired by self upon
entry.
sebastian, is anything to the extend of gboolean g_mutex_locked_by_self (m)
feasible to implement?

---
ciaoTJ





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