* src/threads/lockword.cpp: New file.
[cacao.git] / src / threads / lock.cpp
1 /* src/threads/lock.cpp - lock implementation
2
3    Copyright (C) 1996-2005, 2006, 2007, 2008
4    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5
6    This file is part of CACAO.
7
8    This program is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2, or (at
11    your option) any later version.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23 */
24
25
26 #include "config.h"
27
28 #include <assert.h>
29 #include <stdint.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <sys/time.h>
33
34 #include "vm/types.h"
35
36 #include "mm/memory.h"
37
38 #include "native/llni.h"
39
40 #include "threads/atomic.hpp"
41 #include "threads/lock.hpp"
42 #include "threads/mutex.hpp"
43 #include "threads/threadlist.hpp"
44 #include "threads/thread.hpp"
45
46 #include "toolbox/list.hpp"
47
48 #include "vm/exceptions.hpp"
49 #include "vm/finalizer.h"
50 #include "vm/global.h"
51 #include "vm/options.h"
52 #include "vm/string.hpp"
53 #include "vm/vm.hpp"
54
55 #if defined(ENABLE_STATISTICS)
56 # include "vm/statistics.h"
57 #endif
58
59 #if defined(ENABLE_VMLOG)
60 #include <vmlog_cacao.h>
61 #endif
62
63 #if defined(ENABLE_JVMTI)
64 #include "native/jvmti/cacaodbg.h"
65 #endif
66
67 #if defined(ENABLE_GC_BOEHM)
68 # include "mm/boehm-gc/include/gc.h"
69 #endif
70
71
72 /* debug **********************************************************************/
73
74 #if !defined(NDEBUG)
75 # define DEBUGLOCKS(format) \
76     do { \
77         if (opt_DebugLocks) { \
78             log_println format; \
79         } \
80     } while (0)
81 #else
82 # define DEBUGLOCKS(format)
83 #endif
84
85
86 /******************************************************************************/
87 /* MACROS                                                                     */
88 /******************************************************************************/
89
90 /* number of lock records in the first pool allocated for a thread */
91 #define LOCK_INITIAL_LOCK_RECORDS 8
92
93 #define LOCK_INITIAL_HASHTABLE_SIZE  1613  /* a prime in the middle between 1024 and 2048 */
94
95
96 /******************************************************************************/
97 /* MACROS FOR THIN/FAT LOCKS                                                  */
98 /******************************************************************************/
99
100 /* We use a variant of the tasuki locks described in the paper
101  *     
102  *     Tamiya Onodera, Kiyokuni Kawachiya
103  *     A Study of Locking Objects with Bimodal Fields
104  *     Proceedings of the ACM OOPSLA '99, pp. 223-237
105  *     1999
106  *
107  * The underlying thin locks are a variant of the thin locks described in
108  * 
109  *     Bacon, Konuru, Murthy, Serrano
110  *     Thin Locks: Featherweight Synchronization for Java
111  *         Proceedings of the ACM Conference on Programming Language Design and 
112  *         Implementation (Montreal, Canada), SIGPLAN Notices volume 33, number 6,
113  *         June 1998
114  *
115  * In thin lock mode the lockword looks like this:
116  *
117  *     ,----------------------,-----------,---,
118  *     |      thread ID       |   count   | 0 |
119  *     `----------------------'-----------'---'
120  *
121  *     thread ID......the 'index' of the owning thread, or 0
122  *     count..........number of times the lock has been entered minus 1
123  *     0..............the shape bit is 0 in thin lock mode
124  *
125  * In fat lock mode it is basically a lock_record_t *:
126  *
127  *     ,----------------------------------,---,
128  *     |    lock_record_t * (without LSB) | 1 |
129  *     `----------------------------------'---'
130  *
131  *     1..............the shape bit is 1 in fat lock mode
132  */
133
134 /* global variables ***********************************************************/
135
136 /* hashtable mapping objects to lock records */
137 static lock_hashtable_t lock_hashtable;
138
139
140 /******************************************************************************/
141 /* PROTOTYPES                                                                 */
142 /******************************************************************************/
143
144 static void lock_hashtable_init(void);
145
146 static inline Lockword* lock_lockword_get(java_handle_t* o);
147 static void lock_record_enter(threadobject *t, lock_record_t *lr);
148 static void lock_record_exit(threadobject *t, lock_record_t *lr);
149 static bool lock_record_wait(threadobject *t, lock_record_t *lr, s8 millis, s4 nanos);
150 static void lock_record_notify(threadobject *t, lock_record_t *lr, bool one);
151
152
153 /*============================================================================*/
154 /* INITIALIZATION OF DATA STRUCTURES                                          */
155 /*============================================================================*/
156
157
158 /* lock_init *******************************************************************
159
160    Initialize global data for locking.
161
162 *******************************************************************************/
163
164 void lock_init(void)
165 {
166         /* initialize lock hashtable */
167
168         lock_hashtable_init();
169
170 #if defined(ENABLE_VMLOG)
171         vmlog_cacao_init_lock();
172 #endif
173 }
174
175
176 /* lock_record_new *************************************************************
177
178    Allocate a lock record.
179
180 *******************************************************************************/
181
182 static lock_record_t *lock_record_new(void)
183 {
184         lock_record_t *lr;
185
186         /* allocate the data structure on the C heap */
187
188         lr = NEW(lock_record_t);
189
190 #if defined(ENABLE_STATISTICS)
191         if (opt_stat)
192                 size_lock_record += sizeof(lock_record_t);
193 #endif
194
195         /* initialize the members */
196
197         lr->object  = NULL;
198         lr->owner   = NULL;
199         lr->count   = 0;
200         lr->waiters = new List<threadobject*>();
201
202 #if defined(ENABLE_GC_CACAO)
203         /* register the lock object as weak reference with the GC */
204
205         gc_weakreference_register(&(lr->object), GC_REFTYPE_LOCKRECORD);
206 #endif
207
208         // Initialize the mutex.
209         lr->mutex = new Mutex();
210
211         DEBUGLOCKS(("[lock_record_new   : lr=%p]", (void *) lr));
212
213         return lr;
214 }
215
216
217 /* lock_record_free ************************************************************
218
219    Free a lock record.
220
221    IN:
222        lr....lock record to free
223
224 *******************************************************************************/
225
226 static void lock_record_free(lock_record_t *lr)
227 {
228         DEBUGLOCKS(("[lock_record_free  : lr=%p]", (void *) lr));
229
230         // Destroy the mutex.
231         delete lr->mutex;
232
233 #if defined(ENABLE_GC_CACAO)
234         /* unregister the lock object reference with the GC */
235
236         gc_weakreference_unregister(&(lr->object));
237 #endif
238
239         // Free the waiters list.
240         delete lr->waiters;
241
242         /* Free the data structure. */
243
244         FREE(lr, lock_record_t);
245
246 #if defined(ENABLE_STATISTICS)
247         if (opt_stat)
248                 size_lock_record -= sizeof(lock_record_t);
249 #endif
250 }
251
252
253 /*============================================================================*/
254 /* HASHTABLE MAPPING OBJECTS TO LOCK RECORDS                                  */
255 /*============================================================================*/
256
257 /* lock_hashtable_init *********************************************************
258
259    Initialize the global hashtable mapping objects to lock records.
260
261 *******************************************************************************/
262
263 static void lock_hashtable_init(void)
264 {
265         lock_hashtable.mutex   = new Mutex();
266
267         lock_hashtable.size    = LOCK_INITIAL_HASHTABLE_SIZE;
268         lock_hashtable.entries = 0;
269         lock_hashtable.ptr     = MNEW(lock_record_t *, lock_hashtable.size);
270
271 #if defined(ENABLE_STATISTICS)
272         if (opt_stat)
273                 size_lock_hashtable += sizeof(lock_record_t *) * lock_hashtable.size;
274 #endif
275
276         MZERO(lock_hashtable.ptr, lock_record_t *, lock_hashtable.size);
277 }
278
279
280 /* lock_hashtable_grow *********************************************************
281
282    Grow the lock record hashtable to about twice its current size and
283    rehash the entries.
284
285 *******************************************************************************/
286
287 /* must be called with hashtable mutex locked */
288 static void lock_hashtable_grow(void)
289 {
290         u4 oldsize;
291         u4 newsize;
292         lock_record_t **oldtable;
293         lock_record_t **newtable;
294         lock_record_t *lr;
295         lock_record_t *next;
296         u4 i;
297         u4 h;
298         u4 newslot;
299
300         /* allocate a new table */
301
302         oldsize = lock_hashtable.size;
303         newsize = oldsize*2 + 1; /* XXX should use prime numbers */
304
305         DEBUGLOCKS(("growing lock hashtable to size %d", newsize));
306
307         oldtable = lock_hashtable.ptr;
308         newtable = MNEW(lock_record_t *, newsize);
309
310 #if defined(ENABLE_STATISTICS)
311         if (opt_stat)
312                 size_lock_hashtable += sizeof(lock_record_t *) * newsize;
313 #endif
314
315         MZERO(newtable, lock_record_t *, newsize);
316
317         /* rehash the entries */
318
319         for (i = 0; i < oldsize; i++) {
320                 lr = oldtable[i];
321                 while (lr) {
322                         next = lr->hashlink;
323
324                         h = heap_hashcode(lr->object);
325                         newslot = h % newsize;
326
327                         lr->hashlink = newtable[newslot];
328                         newtable[newslot] = lr;
329
330                         lr = next;
331                 }
332         }
333
334         /* replace the old table */
335
336         lock_hashtable.ptr  = newtable;
337         lock_hashtable.size = newsize;
338
339         MFREE(oldtable, lock_record_t *, oldsize);
340
341 #if defined(ENABLE_STATISTICS)
342         if (opt_stat)
343                 size_lock_hashtable -= sizeof(lock_record_t *) * oldsize;
344 #endif
345 }
346
347
348 /* lock_hashtable_cleanup ******************************************************
349
350    Removes (and frees) lock records which have a cleared object reference
351    from the hashtable. The locked object was reclaimed by the GC.
352
353 *******************************************************************************/
354
355 #if defined(ENABLE_GC_CACAO)
356 void lock_hashtable_cleanup(void)
357 {
358         threadobject  *t;
359         lock_record_t *lr;
360         lock_record_t *prev;
361         lock_record_t *next;
362         int i;
363
364         t = THREADOBJECT;
365
366         /* lock the hashtable */
367
368         Mutex_lock(lock_hashtable.mutex);
369
370         /* search the hashtable for cleared references */
371
372         for (i = 0; i < lock_hashtable.size; i++) {
373                 lr = lock_hashtable.ptr[i];
374                 prev = NULL;
375
376                 while (lr) {
377                         next = lr->hashlink;
378
379                         /* remove lock records with cleared references */
380
381                         if (lr->object == NULL) {
382
383                                 /* unlink the lock record from the hashtable */
384
385                                 if (prev == NULL)
386                                         lock_hashtable.ptr[i] = next;
387                                 else
388                                         prev->hashlink = next;
389
390                                 /* free the lock record */
391
392                                 lock_record_free(lr);
393
394                         } else {
395                                 prev = lr;
396                         }
397
398                         lr = next;
399                 }
400         }
401
402         /* unlock the hashtable */
403
404         Mutex_unlock(lock_hashtable.mutex);
405 }
406 #endif
407
408
409 /* lock_hashtable_get **********************************************************
410
411    Find the lock record for the given object.  If it does not exists,
412    yet, create it and enter it in the hashtable.
413
414    IN:
415           o....the object to look up
416
417    RETURN VALUE:
418       the lock record to use for this object
419
420 *******************************************************************************/
421
422 #if defined(ENABLE_GC_BOEHM)
423 static void lock_record_finalizer(void *object, void *p);
424 #endif
425
426 static lock_record_t *lock_hashtable_get(java_handle_t* o)
427 {
428         // This function is inside a critical section.
429         GCCriticalSection cs;
430
431         u4             slot;
432         lock_record_t *lr;
433
434         Lockword* lockword = lock_lockword_get(o);
435
436         if (lockword->is_fat_lock())
437                 return lockword->get_fat_lock();
438
439         // Lock the hashtable.
440         lock_hashtable.mutex->lock();
441
442         /* lookup the lock record in the hashtable */
443
444         slot = heap_hashcode(LLNI_DIRECT(o)) % lock_hashtable.size;
445         lr   = lock_hashtable.ptr[slot];
446
447         for (; lr != NULL; lr = lr->hashlink) {
448                 if (lr->object == LLNI_DIRECT(o))
449                         break;
450         }
451
452         if (lr == NULL) {
453                 /* not found, we must create a new one */
454
455                 lr = lock_record_new();
456
457                 lr->object = LLNI_DIRECT(o);
458
459 #if defined(ENABLE_GC_BOEHM)
460                 /* register new finalizer to clean up the lock record */
461
462                 GC_REGISTER_FINALIZER(LLNI_DIRECT(o), lock_record_finalizer, 0, 0, 0);
463 #endif
464
465                 /* enter it in the hashtable */
466
467                 lr->hashlink             = lock_hashtable.ptr[slot];
468                 lock_hashtable.ptr[slot] = lr;
469                 lock_hashtable.entries++;
470
471                 /* check whether the hash should grow */
472
473                 if (lock_hashtable.entries * 3 > lock_hashtable.size * 4) {
474                         lock_hashtable_grow();
475                 }
476         }
477
478         // Unlock the hashtable.
479         lock_hashtable.mutex->unlock();
480
481         /* return the new lock record */
482
483         return lr;
484 }
485
486
487 /* lock_hashtable_remove *******************************************************
488
489    Remove the lock record for the given object from the hashtable
490    and free it afterwards.
491
492    IN:
493        t....the current thread
494        o....the object to look up
495
496 *******************************************************************************/
497
498 static void lock_hashtable_remove(threadobject *t, java_handle_t *o)
499 {
500         lock_record_t *lr;
501         u4             slot;
502         lock_record_t *tmplr;
503
504         // Lock the hashtable.
505         lock_hashtable.mutex->lock();
506
507         /* get lock record */
508
509         Lockword* lockword = lock_lockword_get(o);
510
511         // Sanity check.
512         assert(lockword->is_fat_lock());
513
514         lr = lockword->get_fat_lock();
515
516         /* remove the lock-record from the hashtable */
517
518         slot  = heap_hashcode(LLNI_DIRECT(o)) % lock_hashtable.size;
519         tmplr = lock_hashtable.ptr[slot];
520
521         if (tmplr == lr) {
522                 /* special handling if it's the first in the chain */
523
524                 lock_hashtable.ptr[slot] = lr->hashlink;
525         }
526         else {
527                 for (; tmplr != NULL; tmplr = tmplr->hashlink) {
528                         if (tmplr->hashlink == lr) {
529                                 tmplr->hashlink = lr->hashlink;
530                                 break;
531                         }
532                 }
533
534                 assert(tmplr != NULL);
535         }
536
537         /* decrease entry count */
538
539         lock_hashtable.entries--;
540
541         // Unlock the hashtable.
542         lock_hashtable.mutex->unlock();
543
544         /* free the lock record */
545
546         lock_record_free(lr);
547 }
548
549
550 /* lock_record_finalizer *******************************************************
551
552    XXX Remove me for exact GC.
553
554 *******************************************************************************/
555
556 static void lock_record_finalizer(void *object, void *p)
557 {
558         java_handle_t *o;
559         classinfo     *c;
560
561         o = (java_handle_t *) object;
562
563 #if !defined(ENABLE_GC_CACAO) && defined(ENABLE_HANDLES)
564         /* XXX this is only a dirty hack to make Boehm work with handles */
565
566         o = LLNI_WRAP((java_object_t *) o);
567 #endif
568
569         LLNI_class_get(o, c);
570
571 #if !defined(NDEBUG)
572         if (opt_DebugFinalizer) {
573                 log_start();
574                 log_print("[finalizer lockrecord: o=%p p=%p class=", object, p);
575                 class_print(c);
576                 log_print("]");
577                 log_finish();
578         }
579 #endif
580
581         /* check for a finalizer function */
582
583         if (c->finalizer != NULL)
584                 finalizer_run(object, p);
585
586         /* remove the lock-record entry from the hashtable and free it */
587
588         lock_hashtable_remove(THREADOBJECT, o);
589 }
590
591
592 /*============================================================================*/
593 /* LOCKING ALGORITHM                                                          */
594 /*============================================================================*/
595
596
597 /* lock_lockword_get ***********************************************************
598
599    Get the lockword for the given object.
600
601    IN:
602       o............the object
603
604 *******************************************************************************/
605
606 static inline Lockword* lock_lockword_get(java_handle_t* o)
607 {
608 #if defined(ENABLE_GC_CACAO)
609         // Sanity check.
610         assert(GCCriticalSection::inside() == true);
611 #endif
612
613         return &(LLNI_DIRECT(o)->lockword);
614 }
615
616
617 /* lock_record_enter ***********************************************************
618
619    Enter the lock represented by the given lock record.
620
621    IN:
622       t.................the current thread
623           lr................the lock record
624
625 *******************************************************************************/
626
627 static inline void lock_record_enter(threadobject *t, lock_record_t *lr)
628 {
629         lr->mutex->lock();
630         lr->owner = t;
631 }
632
633
634 /* lock_record_exit ************************************************************
635
636    Release the lock represented by the given lock record.
637
638    IN:
639       t.................the current thread
640           lr................the lock record
641
642    PRE-CONDITION:
643       The current thread must own the lock represented by this lock record.
644           This is NOT checked by this function!
645
646 *******************************************************************************/
647
648 static inline void lock_record_exit(threadobject *t, lock_record_t *lr)
649 {
650         lr->owner = NULL;
651         lr->mutex->unlock();
652 }
653
654
655 /* lock_inflate ****************************************************************
656
657    Inflate the lock of the given object. This may only be called by the
658    owner of the monitor of the object.
659
660    IN:
661           o............the object of which to inflate the lock
662           lr...........the lock record to install. The current thread must
663                        own the lock of this lock record!
664
665    PRE-CONDITION:
666       The current thread must be the owner of this object's monitor AND
667           of the lock record's lock!
668
669 *******************************************************************************/
670
671 static void lock_inflate(java_handle_t *o, lock_record_t *lr)
672 {
673         Lockword* lockword = lock_lockword_get(o);
674         lockword->inflate(lr);
675 }
676
677
678 static void sable_flc_waiting(Lockword *lockword, threadobject *t, java_handle_t *o)
679 {
680         int32_t index;
681         threadobject *t_other;
682         int old_flc;
683
684         index = lockword->get_thin_lock_thread_index();
685         t_other = ThreadList::get_thread_by_index(index);
686
687         // The lockword could have changed during our way here.  If the
688         // thread index is zero, the lock got unlocked and we simply
689         // return.
690         if (t_other == NULL)
691 /*              failure, TODO: add statistics */
692                 return;
693
694         t_other->flc_lock->lock();
695         old_flc = t_other->flc_bit;
696         t_other->flc_bit = true;
697
698         DEBUGLOCKS(("thread %d set flc bit for lock-holding thread %d", t->index, t_other->index));
699
700         // Set FLC bit first, then read the lockword again.
701         Atomic::memory_barrier();
702
703         lockword = lock_lockword_get(o);
704
705         /* Lockword is still the way it was seen before */
706         if (lockword->is_thin_lock() && (lockword->get_thin_lock_thread_index() == index))
707         {
708                 /* Add tuple (t, o) to the other thread's FLC list */
709                 t->flc_object = o;
710                 t->flc_next = t_other->flc_list;
711                 t_other->flc_list = t;
712
713                 for (;;)
714                 {
715                         threadobject *current;
716
717                         // Wait until another thread sees the flc bit and notifies
718                         // us of unlocking.
719                         t->flc_cond->wait(t_other->flc_lock);
720
721                         /* Traverse FLC list looking if we're still there */
722                         current = t_other->flc_list;
723                         while (current && current != t)
724                                 current = current->flc_next;
725                         if (!current)
726                                 /* not in list anymore, can stop waiting */
727                                 break;
728
729                         /* We are still in the list -- the other thread cannot have seen
730                            the FLC bit yet */
731                         assert(t_other->flc_bit);
732                 }
733
734                 t->flc_object = NULL;   /* for garbage collector? */
735                 t->flc_next = NULL;
736         }
737         else
738                 t_other->flc_bit = old_flc;
739
740         t_other->flc_lock->unlock();
741 }
742
743 static void notify_flc_waiters(threadobject *t, java_handle_t *o)
744 {
745         threadobject *current;
746
747         t->flc_lock->lock();
748
749         current = t->flc_list;
750         while (current)
751         {
752                 if (current->flc_object != o)
753                 {
754                         /* The object has to be inflated so the other threads can properly
755                            block on it. */
756
757                         // Only if not already inflated.
758                         Lockword* lockword = lock_lockword_get(current->flc_object);
759                         if (lockword->is_thin_lock()) {
760                                 lock_record_t *lr = lock_hashtable_get(current->flc_object);
761                                 lock_record_enter(t, lr);
762
763                                 DEBUGLOCKS(("thread %d inflating lock of %p to lr %p",
764                                                         t->index, (void*) current->flc_object, (void*) lr));
765
766                                 lock_inflate(current->flc_object, lr);
767                         }
768                 }
769
770                 // Wake the waiting threads.
771                 current->flc_cond->broadcast();
772
773                 current = current->flc_next;
774         }
775
776         t->flc_list = NULL;
777         t->flc_bit = false;
778
779         t->flc_lock->unlock();
780 }
781
782 /* lock_monitor_enter **********************************************************
783
784    Acquire the monitor of the given object. If the current thread already
785    owns the monitor, the lock counter is simply increased.
786
787    This function blocks until it can acquire the monitor.
788
789    IN:
790       t............the current thread
791           o............the object of which to enter the monitor
792
793    RETURN VALUE:
794       true.........the lock has been successfully acquired
795           false........an exception has been thrown
796
797 *******************************************************************************/
798
799 bool lock_monitor_enter(java_handle_t *o)
800 {
801         // This function is inside a critical section.
802         GCCriticalSection cs;
803
804         if (o == NULL) {
805                 exceptions_throw_nullpointerexception();
806                 return false;
807         }
808
809         threadobject* t = thread_get_current();
810
811         uintptr_t thinlock = t->thinlock;
812
813 retry:
814         // Most common case: try to thin-lock an unlocked object.
815         Lockword* lockword = lock_lockword_get(o);
816         bool result = lockword->lock(thinlock);
817
818         if (result == true) {
819                 // Success, we locked it.
820                 // NOTE: The Java Memory Model requires an instruction barrier
821                 // here (because of the CAS above).
822                 Atomic::instruction_barrier();
823                 return true;
824         }
825
826         // Next common case: recursive lock with small recursion count.
827         // NOTE: We don't have to worry about stale values here, as any
828         // stale value will indicate another thread holding the lock (or
829         // an inflated lock).
830         if (lockword->get_thin_lock_without_count() == thinlock) {
831                 // We own this monitor.  Check the current recursion count.
832                 if (lockword->is_max_thin_lock_count() == false) {
833                         // The recursion count is low enough.
834                         lockword->increase_thin_lock_count();
835
836                         // Success, we locked it.
837                         return true;
838                 }
839                 else {
840                         // Recursion count overflow.
841                         lock_record_t* lr = lock_hashtable_get(o);
842                         lock_record_enter(t, lr);
843                         lock_inflate(o, lr);
844                         lr->count++;
845
846                         notify_flc_waiters(t, o);
847
848                         return true;
849                 }
850         }
851
852         // The lock is either contented or fat.
853         if (lockword->is_fat_lock()) {
854                 lock_record_t* lr = lockword->get_fat_lock();
855
856                 // Check for recursive entering.
857                 if (lr->owner == t) {
858                         lr->count++;
859                         return true;
860                 }
861
862                 // Acquire the mutex of the lock record.
863                 lock_record_enter(t, lr);
864
865                 // Sanity check.
866                 assert(lr->count == 0);
867                 return true;
868         }
869
870         /****** inflation path ******/
871
872 #if defined(ENABLE_JVMTI)
873         /* Monitor Contended Enter */
874         jvmti_MonitorContendedEntering(false, o);
875 #endif
876
877         sable_flc_waiting(lockword, t, o);
878
879 #if defined(ENABLE_JVMTI)
880         /* Monitor Contended Entered */
881         jvmti_MonitorContendedEntering(true, o);
882 #endif
883         goto retry;
884 }
885
886
887 /* lock_monitor_exit ***********************************************************
888
889    Decrement the counter of a (currently owned) monitor. If the counter
890    reaches zero, release the monitor.
891
892    If the current thread is not the owner of the monitor, an 
893    IllegalMonitorState exception is thrown.
894
895    IN:
896       t............the current thread
897           o............the object of which to exit the monitor
898
899    RETURN VALUE:
900       true.........everything ok,
901           false........an exception has been thrown
902
903 *******************************************************************************/
904
905 bool lock_monitor_exit(java_handle_t* o)
906 {
907         // This function is inside a critical section.
908         GCCriticalSection cs;
909
910         if (o == NULL) {
911                 exceptions_throw_nullpointerexception();
912                 return false;
913         }
914
915         threadobject* t = thread_get_current();
916
917         uintptr_t thinlock = t->thinlock;
918
919         // We don't have to worry about stale values here, as any stale
920         // value will indicate that we don't own the lock.
921         Lockword* lockword = lock_lockword_get(o);
922
923         // Most common case: we release a thin lock that we hold once.
924         if (lockword->get_thin_lock() == thinlock) {
925                 // Memory barrier for Java Memory Model.
926                 Atomic::write_memory_barrier();
927                 lockword->unlock();
928                 // Memory barrier for thin locking.
929                 Atomic::memory_barrier();
930
931                 /* check if there has been a flat lock contention on this object */
932
933                 if (t->flc_bit) {
934                         DEBUGLOCKS(("thread %d saw flc bit", t->index));
935
936                         /* there has been a contention on this thin lock */
937                         notify_flc_waiters(t, o);
938                 }
939
940                 return true;
941         }
942
943         // Next common case: we release a recursive lock, count > 0.
944         if (lockword->get_thin_lock_without_count() == thinlock) {
945                 lockword->decrease_thin_lock_count();
946                 return true;
947         }
948
949         // Either the lock is fat, or we don't hold it at all.
950         if (lockword->is_fat_lock()) {
951                 lock_record_t* lr = lockword->get_fat_lock();
952
953                 // Check if we own this monitor.
954                 // NOTE: We don't have to worry about stale values here, as
955                 // any stale value will be != t and thus fail this check.
956                 if (lr->owner != t) {
957                         exceptions_throw_illegalmonitorstateexception();
958                         return false;
959                 }
960
961                 /* { the current thread `t` owns the lock record `lr` on object `o` } */
962
963                 if (lr->count != 0) {
964                         // We had locked this one recursively.  Just decrement, it
965                         // will still be locked.
966                         lr->count--;
967                         return true;
968                 }
969
970                 // Unlock this lock record.
971                 lock_record_exit(t, lr);
972                 return true;
973         }
974
975         // Legal thin lock cases have been handled above, so this is an
976         // error.
977         exceptions_throw_illegalmonitorstateexception();
978
979         return false;
980 }
981
982
983 /* lock_record_add_waiter ******************************************************
984
985    Add a thread to the list of waiting threads of a lock record.
986
987    IN:
988       lr...........the lock record
989       thread.......the thread to add
990
991 *******************************************************************************/
992
993 static void lock_record_add_waiter(lock_record_t *lr, threadobject* t)
994 {
995         // Add the thread as last entry to waiters list.
996         lr->waiters->push_back(t);
997
998 #if defined(ENABLE_STATISTICS)
999         if (opt_stat)
1000                 size_lock_waiter += sizeof(threadobject*);
1001 #endif
1002 }
1003
1004
1005 /* lock_record_remove_waiter ***************************************************
1006
1007    Remove a thread from the list of waiting threads of a lock record.
1008
1009    IN:
1010       lr...........the lock record
1011       t............the current thread
1012
1013    PRE-CONDITION:
1014       The current thread must be the owner of the lock record.
1015    
1016 *******************************************************************************/
1017
1018 static void lock_record_remove_waiter(lock_record_t *lr, threadobject* t)
1019 {
1020         // Remove the thread from the waiters.
1021         lr->waiters->remove(t);
1022
1023 #if defined(ENABLE_STATISTICS)
1024         if (opt_stat)
1025                 size_lock_waiter -= sizeof(threadobject*);
1026 #endif
1027 }
1028
1029
1030 /* lock_record_wait ************************************************************
1031
1032    Wait on a lock record for a given (maximum) amount of time.
1033
1034    IN:
1035       t............the current thread
1036           lr...........the lock record
1037           millis.......milliseconds of timeout
1038           nanos........nanoseconds of timeout
1039
1040    RETURN VALUE:
1041       true.........we have been interrupted,
1042       false........everything ok
1043
1044    PRE-CONDITION:
1045       The current thread must be the owner of the lock record.
1046           This is NOT checked by this function!
1047    
1048 *******************************************************************************/
1049
1050 static bool lock_record_wait(threadobject *thread, lock_record_t *lr, s8 millis, s4 nanos)
1051 {
1052         s4   lockcount;
1053         bool wasinterrupted = false;
1054
1055         DEBUGLOCKS(("[lock_record_wait  : lr=%p, t=%p, millis=%lld, nanos=%d]",
1056                                 lr, thread, millis, nanos));
1057
1058         /* { the thread t owns the fat lock record lr on the object o } */
1059
1060         /* register us as waiter for this object */
1061
1062         lock_record_add_waiter(lr, thread);
1063
1064         /* remember the old lock count */
1065
1066         lockcount = lr->count;
1067
1068         /* unlock this record */
1069
1070         lr->count = 0;
1071         lock_record_exit(thread, lr);
1072
1073         /* wait until notified/interrupted/timed out */
1074
1075         threads_wait_with_timeout_relative(thread, millis, nanos);
1076
1077         /* re-enter the monitor */
1078
1079         lock_record_enter(thread, lr);
1080
1081         /* remove us from the list of waiting threads */
1082
1083         lock_record_remove_waiter(lr, thread);
1084
1085         /* restore the old lock count */
1086
1087         lr->count = lockcount;
1088
1089         /* We can only be signaled OR interrupted, not both. If both flags
1090            are set, reset only signaled and leave the thread in
1091            interrupted state. Otherwise, clear both. */
1092
1093         if (!thread->signaled) {
1094                 wasinterrupted = thread->interrupted;
1095                 thread->interrupted = false;
1096         }
1097
1098         thread->signaled = false;
1099
1100         /* return if we have been interrupted */
1101
1102         return wasinterrupted;
1103 }
1104
1105
1106 /* lock_monitor_wait ***********************************************************
1107
1108    Wait on an object for a given (maximum) amount of time.
1109
1110    IN:
1111       t............the current thread
1112           o............the object
1113           millis.......milliseconds of timeout
1114           nanos........nanoseconds of timeout
1115
1116    PRE-CONDITION:
1117       The current thread must be the owner of the object's monitor.
1118    
1119 *******************************************************************************/
1120
1121 static void lock_monitor_wait(threadobject *t, java_handle_t *o, s8 millis, s4 nanos)
1122 {
1123         lock_record_t *lr;
1124
1125         Lockword* lockword = lock_lockword_get(o);
1126
1127         // Check if we own this monitor.
1128         // NOTE: We don't have to worry about stale values here, as any
1129         // stale value will fail this check.
1130         if (lockword->is_fat_lock()) {
1131                 lr = lockword->get_fat_lock();
1132
1133                 if (lr->owner != t) {
1134                         exceptions_throw_illegalmonitorstateexception();
1135                         return;
1136                 }
1137         }
1138         else {
1139                 // It's a thin lock.
1140                 if (lockword->get_thin_lock_without_count() != t->thinlock) {
1141                         exceptions_throw_illegalmonitorstateexception();
1142                         return;
1143                 }
1144
1145                 // Get the lock-record.
1146                 lr = lock_hashtable_get(o);
1147                 lock_record_enter(t, lr);
1148
1149                 // Inflate this lock.
1150                 lockword->inflate(lr);
1151
1152                 notify_flc_waiters(t, o);
1153         }
1154
1155         /* { the thread t owns the fat lock record lr on the object o } */
1156
1157         if (lock_record_wait(t, lr, millis, nanos))
1158                 exceptions_throw_interruptedexception();
1159 }
1160
1161
1162 /* lock_record_notify **********************************************************
1163
1164    Notify one thread or all threads waiting on the given lock record.
1165
1166    IN:
1167       t............the current thread
1168           lr...........the lock record
1169           one..........if true, only notify one thread
1170
1171    PRE-CONDITION:
1172       The current thread must be the owner of the lock record.
1173           This is NOT checked by this function!
1174    
1175 *******************************************************************************/
1176
1177 static void lock_record_notify(threadobject *t, lock_record_t *lr, bool one)
1178 {
1179 #if defined(ENABLE_GC_CACAO)
1180         // Sanity check.
1181         assert(GCCriticalSection::inside() == false);
1182 #endif
1183
1184         // { The thread t owns the fat lock record lr on the object o }
1185
1186         for (List<threadobject*>::iterator it = lr->waiters->begin(); it != lr->waiters->end(); it++) {
1187                 threadobject* waiter = *it;
1188
1189                 // We must skip threads which have already been notified. They
1190                 // will remove themselves from the list.
1191                 if (waiter->signaled)
1192                         continue;
1193
1194                 // Enter the wait-mutex.
1195                 waiter->waitmutex->lock();
1196
1197                 DEBUGLOCKS(("[lock_record_notify: lr=%p, t=%p, waitingthread=%p, one=%d]", lr, t, waiter, one));
1198
1199                 // Signal the waiter.
1200                 waiter->waitcond->signal();
1201
1202                 // Mark the thread as signaled.
1203                 waiter->signaled = true;
1204
1205                 // Leave the wait-mutex.
1206                 waiter->waitmutex->unlock();
1207
1208                 // If we should only wake one thread, we are done.
1209                 if (one)
1210                         break;
1211         }
1212 }
1213
1214
1215 /* lock_monitor_notify *********************************************************
1216
1217    Notify one thread or all threads waiting on the given object.
1218
1219    IN:
1220       t............the current thread
1221           o............the object
1222           one..........if true, only notify one thread
1223
1224    PRE-CONDITION:
1225       The current thread must be the owner of the object's monitor.
1226    
1227 *******************************************************************************/
1228
1229 static void lock_monitor_notify(threadobject *t, java_handle_t *o, bool one)
1230 {
1231         lock_record_t* lr = NULL;
1232
1233         {
1234                 // This scope is inside a critical section.
1235                 GCCriticalSection cs;
1236
1237                 Lockword* lockword = lock_lockword_get(o);
1238
1239                 // Check if we own this monitor.
1240                 // NOTE: We don't have to worry about stale values here, as any
1241                 // stale value will fail this check.
1242
1243                 if (lockword->is_fat_lock()) {
1244                         lr = lockword->get_fat_lock();
1245
1246                         if (lr->owner != t) {
1247                                 exceptions_throw_illegalmonitorstateexception();
1248                                 return;
1249                         }
1250                 }
1251                 else {
1252                         // It's a thin lock.
1253                         if (lockword->get_thin_lock_without_count() != t->thinlock) {
1254                                 exceptions_throw_illegalmonitorstateexception();
1255                                 return;
1256                         }
1257
1258                         // No thread can wait on a thin lock, so there's nothing to do.
1259                         return;
1260                 }
1261         }
1262
1263         // { The thread t owns the fat lock record lr on the object o }
1264         lock_record_notify(t, lr, one);
1265 }
1266
1267
1268
1269 /*============================================================================*/
1270 /* INQUIRY FUNCIONS                                                           */
1271 /*============================================================================*/
1272
1273
1274 /* lock_is_held_by_current_thread **********************************************
1275
1276    Return true if the current thread owns the monitor of the given object.
1277
1278    IN:
1279           o............the object
1280
1281    RETURN VALUE:
1282       true, if the current thread holds the lock of this object.
1283    
1284 *******************************************************************************/
1285
1286 bool lock_is_held_by_current_thread(java_handle_t *o)
1287 {
1288         // This function is inside a critical section.
1289         GCCriticalSection cs;
1290
1291         // Check if we own this monitor.
1292         // NOTE: We don't have to worry about stale values here, as any
1293         // stale value will fail this check.
1294         threadobject* t = thread_get_current();
1295         Lockword* lockword = lock_lockword_get(o);
1296
1297         if (lockword->is_fat_lock()) {
1298                 // It's a fat lock.
1299                 lock_record_t* lr = lockword->get_fat_lock();
1300                 return (lr->owner == t);
1301         }
1302         else {
1303                 // It's a thin lock.
1304                 return (lockword->get_thin_lock_without_count() == t->thinlock);
1305         }
1306 }
1307
1308
1309
1310 /*============================================================================*/
1311 /* WRAPPERS FOR OPERATIONS ON THE CURRENT THREAD                              */
1312 /*============================================================================*/
1313
1314
1315 /* lock_wait_for_object ********************************************************
1316
1317    Wait for the given object.
1318
1319    IN:
1320           o............the object
1321           millis.......milliseconds to wait
1322           nanos........nanoseconds to wait
1323    
1324 *******************************************************************************/
1325
1326 void lock_wait_for_object(java_handle_t *o, s8 millis, s4 nanos)
1327 {
1328         threadobject *thread;
1329
1330         thread = THREADOBJECT;
1331
1332         lock_monitor_wait(thread, o, millis, nanos);
1333 }
1334
1335
1336 /* lock_notify_object **********************************************************
1337
1338    Notify one thread waiting on the given object.
1339
1340    IN:
1341           o............the object
1342    
1343 *******************************************************************************/
1344
1345 void lock_notify_object(java_handle_t *o)
1346 {
1347         threadobject *thread;
1348
1349         thread = THREADOBJECT;
1350
1351         lock_monitor_notify(thread, o, true);
1352 }
1353
1354
1355 /* lock_notify_all_object ******************************************************
1356
1357    Notify all threads waiting on the given object.
1358
1359    IN:
1360           o............the object
1361    
1362 *******************************************************************************/
1363
1364 void lock_notify_all_object(java_handle_t *o)
1365 {
1366         threadobject *thread;
1367
1368         thread = THREADOBJECT;
1369
1370         lock_monitor_notify(thread, o, false);
1371 }
1372
1373
1374 /*
1375  * These are local overrides for various environment variables in Emacs.
1376  * Please do not remove this and leave it at the end of the file, where
1377  * Emacs will automagically detect them.
1378  * ---------------------------------------------------------------------
1379  * Local variables:
1380  * mode: c++
1381  * indent-tabs-mode: t
1382  * c-basic-offset: 4
1383  * tab-width: 4
1384  * End:
1385  * vim:noexpandtab:sw=4:ts=4:
1386  */