X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmono-threads-state-machine.c;h=32491a4ca225229e622799504f8d7cc6012c031c;hb=1e764e5c292c6af5c4ac5f6f6235725813e98fd3;hp=098e02c7ee32e1a558cd6c103ac6a8a03e70a486;hpb=0c56887d08d2f4a31145f116c21fb01fce246c51;p=mono.git diff --git a/mono/utils/mono-threads-state-machine.c b/mono/utils/mono-threads-state-machine.c index 098e02c7ee3..32491a4ca22 100644 --- a/mono/utils/mono-threads-state-machine.c +++ b/mono/utils/mono-threads-state-machine.c @@ -113,7 +113,7 @@ retry_state_change: trace_state_change ("ATTACH", info, raw_state, STATE_RUNNING, 0); break; default: - g_error ("Cannot transition current thread from %s with ATTACH", state_name (cur_state)); + mono_fatal_with_history ("Cannot transition current thread from %s with ATTACH", state_name (cur_state)); } } @@ -148,7 +148,7 @@ STATE_BLOCKING: This is a bug in the coop code that forgot to do a finish blocki STATE_BLOCKING_AND_SUSPENDED: This is a bug in coop x suspend that resulted the thread in an undetachable state. */ default: - g_error ("Cannot transition current thread %p from %s with DETACH", info, state_name (cur_state)); + mono_fatal_with_history ("Cannot transition current thread %p from %s with DETACH", info, state_name (cur_state)); } } @@ -190,7 +190,7 @@ STATE_BLOCKING_AND_SUSPENDED: Self suspension cannot be started when the thread If this turns to be an issue we can introduce a new suspend request state for when both have been requested. */ default: - g_error ("Cannot transition thread %p from %s with SUSPEND_REQUEST", mono_thread_info_get_tid (info), state_name (cur_state)); + mono_fatal_with_history ("Cannot transition thread %p from %s with SUSPEND_REQUEST", mono_thread_info_get_tid (info), state_name (cur_state)); } } @@ -202,6 +202,7 @@ Returns one of the following values: - AsyncSuspendInitSuspend: Thread suspend requested, async suspend needs to be done. - AsyncSuspendAlreadySuspended: Thread already suspended, nothing to do. - AsyncSuspendWait: Self suspend in progress, asked it to notify us. Caller must add target to the notification set. +- AsyncSuspendBlocking: Thread in blocking state */ MonoRequestAsyncSuspendResult mono_threads_transition_request_async_suspension (MonoThreadInfo *info) @@ -241,7 +242,7 @@ retry_state_change: if (InterlockedCompareExchange (&info->thread_state, build_thread_state (cur_state, suspend_count + 1), raw_state) != raw_state) goto retry_state_change; trace_state_change ("ASYNC_SUSPEND_REQUESTED", info, raw_state, cur_state, 1); - return AsyncSuspendAlreadySuspended; //A thread in the blocking state has its state saved so we can treat it as suspended. + return AsyncSuspendBlocking; //A thread in the blocking state has its state saved so we can treat it as suspended. /* @@ -251,7 +252,7 @@ The expected behavior is that the target should poll its state very soon so the STATE_ASYNC_SUSPEND_REQUESTED: Since there can only be one async suspend in progress and it must finish, it should not be possible to witness this. */ default: - g_error ("Cannot transition thread %p from %s with ASYNC_SUSPEND_REQUESTED", mono_thread_info_get_tid (info), state_name (cur_state)); + mono_fatal_with_history ("Cannot transition thread %p from %s with ASYNC_SUSPEND_REQUESTED", mono_thread_info_get_tid (info), state_name (cur_state)); } return (MonoRequestAsyncSuspendResult) FALSE; } @@ -300,7 +301,7 @@ STATE_BLOCKING: STATE_BLOCKING_AND_SUSPENDED: Pool is a local state transition. No VM activities are allowed while in blocking mode. */ default: - g_error ("Cannot transition thread %p from %s with STATE_POLL", mono_thread_info_get_tid (info), state_name (cur_state)); + mono_fatal_with_history ("Cannot transition thread %p from %s with STATE_POLL", mono_thread_info_get_tid (info), state_name (cur_state)); } } @@ -400,7 +401,7 @@ If this turns to be a problem we should either implement [2] or make this an inv */ default: - g_error ("Cannot transition thread %p from %s with REQUEST_RESUME", mono_thread_info_get_tid (info), state_name (cur_state)); + mono_fatal_with_history ("Cannot transition thread %p from %s with REQUEST_RESUME", mono_thread_info_get_tid (info), state_name (cur_state)); } } @@ -436,7 +437,7 @@ STATE_SELF_SUSPEND_REQUESTED: When self suspend and async suspend happen togethe STATE_BLOCKING: Async suspend only begins if a transition to async suspend requested happened. Blocking would have put us into blocking with positive suspend count if it raced with async finish. */ default: - g_error ("Cannot transition thread %p from %s with FINISH_ASYNC_SUSPEND", mono_thread_info_get_tid (info), state_name (cur_state)); + mono_fatal_with_history ("Cannot transition thread %p from %s with FINISH_ASYNC_SUSPEND", mono_thread_info_get_tid (info), state_name (cur_state)); } } @@ -480,7 +481,7 @@ STATE_BLOCKING_AND_SUSPENDED STATE_SELF_SUSPEND_REQUESTED: All those are invalid end states of a sucessfull finish async suspend */ default: - g_error ("Cannot transition thread %p from %s with COMPENSATE_FINISH_ASYNC_SUSPEND", mono_thread_info_get_tid (info), state_name (cur_state)); + mono_fatal_with_history ("Cannot transition thread %p from %s with COMPENSATE_FINISH_ASYNC_SUSPEND", mono_thread_info_get_tid (info), state_name (cur_state)); } } @@ -525,7 +526,7 @@ STATE_BLOCKING: STATE_BLOCKING_AND_SUSPENDED: Blocking is not nestabled */ default: - g_error ("Cannot transition thread %p from %s with DO_BLOCKING", mono_thread_info_get_tid (info), state_name (cur_state)); + mono_fatal_with_history ("Cannot transition thread %p from %s with DO_BLOCKING", mono_thread_info_get_tid (info), state_name (cur_state)); } } @@ -573,7 +574,7 @@ STATE_SELF_SUSPEND_REQUESTED: A blocking operation must not be done while trying STATE_BLOCKING_AND_SUSPENDED: This an exit state of done blocking */ default: - g_error ("Cannot transition thread %p from %s with DONE_BLOCKING", mono_thread_info_get_tid (info), state_name (cur_state)); + mono_fatal_with_history ("Cannot transition thread %p from %s with DONE_BLOCKING", mono_thread_info_get_tid (info), state_name (cur_state)); } } @@ -623,7 +624,7 @@ STATE_SELF_SUSPEND_REQUESTED: A blocking operation must not be done while trying STATE_BLOCKING_AND_SUSPENDED: This is an exit state of done blocking, can't happen here. */ default: - g_error ("Cannot transition thread %p from %s with DONE_BLOCKING", mono_thread_info_get_tid (info), state_name (cur_state)); + mono_fatal_with_history ("Cannot transition thread %p from %s with DONE_BLOCKING", mono_thread_info_get_tid (info), state_name (cur_state)); } }