Merged revisions 7797-7917 via svnmerge from
[cacao.git] / src / vm / jit / i386 / linux / md-os.c
index bf5d64804d820b0756a62cbffe0b6b09d2284c0a..07dad897e36e3903d6233476c872da75bf612b09 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-os.c 7667 2007-04-05 00:16:05Z michi $
+   $Id: md-os.c 7918 2007-05-20 20:42:18Z michi $
 
 */
 
@@ -223,15 +223,30 @@ void md_signal_handler_sigusr2(int sig, siginfo_t *siginfo, void *_p)
 #endif
 
 
+/* md_critical_section_restart *************************************************
+
+   Search the critical sections tree for a matching section and set
+   the PC to the restart point, if necessary.
+
+*******************************************************************************/
+
 #if defined(ENABLE_THREADS)
-void thread_restartcriticalsection(ucontext_t *uc)
+void md_critical_section_restart(ucontext_t *_uc)
 {
-       void *critical;
+       mcontext_t    *_mc;
+       u1            *pc;
+       void          *npc;
 
-       critical = critical_find_restart_point((void *) uc->uc_mcontext.gregs[REG_EIP]);
+       _mc = &_uc->uc_mcontext;
 
-       if (critical)
-               uc->uc_mcontext.gregs[REG_EIP] = (ptrint) critical;
+       pc = (u1 *) _mc->gregs[REG_EIP];
+
+       npc = critical_find_restart_point(pc);
+
+       if (npc != NULL) {
+               log_println("md_critical_section_restart: pc=%p, npc=%p", pc, npc);
+               _mc->gregs[REG_EIP] = (ptrint) npc;
+       }
 }
 #endif