本文整理汇总了C++中MONO_SEM_POST函数的典型用法代码示例。如果您正苦于以下问题:C++ MONO_SEM_POST函数的具体用法?C++ MONO_SEM_POST怎么用?C++ MONO_SEM_POST使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MONO_SEM_POST函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: inner_start_thread
static DWORD WINAPI
inner_start_thread (LPVOID arg)
{
ThreadStartInfo *start_info = arg;
void *t_arg = start_info->arg;
int post_result;
LPTHREAD_START_ROUTINE start_func = start_info->start_routine;
DWORD result;
gboolean suspend = start_info->suspend;
HANDLE suspend_event = start_info->suspend_event;
MonoThreadInfo *info;
info = mono_thread_info_attach (&result);
info->runtime_thread = TRUE;
info->create_suspended = suspend;
post_result = MONO_SEM_POST (&(start_info->registered));
g_assert (!post_result);
if (suspend) {
WaitForSingleObject (suspend_event, INFINITE); /* caller will suspend the thread before setting the event. */
CloseHandle (suspend_event);
}
result = start_func (t_arg);
mono_thread_info_detach ();
return result;
}
示例2: mono_thread_info_self_suspend
void
mono_thread_info_self_suspend (void)
{
gboolean ret;
MonoThreadInfo *info = mono_thread_info_current ();
if (!info)
return;
EnterCriticalSection (&info->suspend_lock);
THREADS_DEBUG ("self suspend IN COUNT %d\n", info->suspend_count);
g_assert (info->suspend_count == 0);
++info->suspend_count;
info->thread_state |= STATE_SELF_SUSPENDED;
ret = mono_threads_get_runtime_callbacks ()->thread_state_init_from_sigctx (&info->suspend_state, NULL);
g_assert (ret);
LeaveCriticalSection (&info->suspend_lock);
while (MONO_SEM_WAIT (&info->resume_semaphore) != 0) {
/*if (EINTR != errno) ABORT("sem_wait failed"); */
}
g_assert (!info->async_target); /*FIXME this should happen normally for suspend. */
MONO_SEM_POST (&info->finish_resume_semaphore);
}
示例3: mono_threads_notify_initiator_of_suspend
void
mono_threads_notify_initiator_of_suspend (MonoThreadInfo* info)
{
THREADS_SUSPEND_DEBUG ("[INITIATOR-NOTIFY-SUSPEND] %p\n", mono_thread_info_get_tid (info));
MONO_SEM_POST (&suspend_semaphore);
InterlockedIncrement (&suspend_posts);
}
示例4: mono_thread_info_suspend_sync
/*
The return value is only valid until a matching mono_thread_info_resume is called
*/
static MonoThreadInfo*
mono_thread_info_suspend_sync (MonoNativeThreadId tid, gboolean interrupt_kernel, const char **error_condition)
{
MonoThreadHazardPointers *hp = mono_hazard_pointer_get ();
MonoThreadInfo *info = mono_thread_info_lookup (tid); /*info on HP1*/
if (!info) {
*error_condition = "Thread not found";
return NULL;
}
MONO_SEM_WAIT_UNITERRUPTIBLE (&info->suspend_semaphore);
/*thread is on the process of detaching*/
if (mono_thread_info_run_state (info) > STATE_RUNNING) {
mono_hazard_pointer_clear (hp, 1);
*error_condition = "Thread is detaching";
return NULL;
}
THREADS_DEBUG ("suspend %x IN COUNT %d\n", tid, info->suspend_count);
if (info->suspend_count) {
++info->suspend_count;
mono_hazard_pointer_clear (hp, 1);
MONO_SEM_POST (&info->suspend_semaphore);
return info;
}
if (!mono_threads_core_suspend (info)) {
MONO_SEM_POST (&info->suspend_semaphore);
mono_hazard_pointer_clear (hp, 1);
*error_condition = "Could not suspend thread";
return NULL;
}
if (interrupt_kernel)
mono_threads_core_interrupt (info);
++info->suspend_count;
info->thread_state |= STATE_SUSPENDED;
MONO_SEM_POST (&info->suspend_semaphore);
return info;
}
示例5: mono_threads_core_resume
gboolean
mono_threads_core_resume (MonoThreadInfo *info)
{
MONO_SEM_POST (&info->resume_semaphore);
while (MONO_SEM_WAIT (&info->finish_resume_semaphore) != 0) {
/* g_assert (errno == EINTR); */
}
return TRUE;
}
示例6: mono_thread_info_core_resume
static gboolean
mono_thread_info_core_resume (MonoThreadInfo *info)
{
gboolean result;
MonoNativeThreadId tid = mono_thread_info_get_tid (info);
if (info->create_suspended) {
/* Have to special case this, as the normal suspend/resume pair are racy, they don't work if he resume is received before the suspend */
info->create_suspended = FALSE;
mono_threads_core_resume_created (info, tid);
return TRUE;
}
MONO_SEM_WAIT_UNITERRUPTIBLE (&info->suspend_semaphore);
THREADS_DEBUG ("resume %x IN COUNT %d\n", tid, info->suspend_count);
if (info->suspend_count <= 0) {
MONO_SEM_POST (&info->suspend_semaphore);
return FALSE;
}
/*
* The theory here is that if we manage to suspend the thread it means it did not
* start cleanup since it take the same lock.
*/
g_assert (mono_thread_info_get_tid (info));
if (--info->suspend_count == 0) {
if (mono_thread_info_suspend_state (info) == STATE_SELF_SUSPENDED) {
MONO_SEM_POST (&info->resume_semaphore);
MONO_SEM_WAIT_UNITERRUPTIBLE (&info->finish_resume_semaphore);
result = TRUE;
} else {
result = mono_threads_core_resume (info);
}
info->thread_state &= ~SUSPEND_STATE_MASK;
} else {
result = TRUE;
}
MONO_SEM_POST (&info->suspend_semaphore);
return result;
}
示例7: mono_thread_info_resume
gboolean
mono_thread_info_resume (MonoNativeThreadId tid)
{
gboolean result = TRUE;
MonoThreadHazardPointers *hp = mono_hazard_pointer_get ();
MonoThreadInfo *info = mono_thread_info_lookup (tid); /*info on HP1*/
if (!info)
return FALSE;
if (info->create_suspended) {
/* Have to special case this, as the normal suspend/resume pair are racy, they don't work if he resume is received before the suspend */
info->create_suspended = FALSE;
mono_threads_core_resume_created (info, tid);
return TRUE;
}
MONO_SEM_WAIT_UNITERRUPTIBLE (&info->suspend_semaphore);
THREADS_DEBUG ("resume %x IN COUNT %d\n",tid, info->suspend_count);
if (info->suspend_count <= 0) {
MONO_SEM_POST (&info->suspend_semaphore);
mono_hazard_pointer_clear (hp, 1);
return FALSE;
}
/*
* The theory here is that if we manage to suspend the thread it means it did not
* start cleanup since it take the same lock.
*/
g_assert (mono_thread_info_get_tid (info));
if (--info->suspend_count == 0)
result = mono_thread_info_resume_internal (info);
MONO_SEM_POST (&info->suspend_semaphore);
mono_hazard_pointer_clear (hp, 1);
mono_atomic_store_release (&mono_thread_info_current ()->inside_critical_region, FALSE);
return result;
}
示例8: threadpool_kill_idle_threads
static void
threadpool_kill_idle_threads (ThreadPool *tp)
{
gint n;
n = (gint) InterlockedCompareExchange (&tp->max_threads, 0, -1);
while (n) {
n--;
MONO_SEM_POST (&tp->new_job);
}
}
示例9: suspend_signal_handler
static void
suspend_signal_handler (int _dummy, siginfo_t *info, void *context)
{
MonoThreadInfo *current = mono_thread_info_current ();
gboolean ret;
if (current->syscall_break_signal) {
current->syscall_break_signal = FALSE;
return;
}
ret = mono_threads_get_runtime_callbacks ()->thread_state_init_from_sigctx (¤t->suspend_state, context);
/* thread_state_init_from_sigctx return FALSE if the current thread is detaching and suspend can't continue. */
current->suspend_can_continue = ret;
MONO_SEM_POST (¤t->begin_suspend_semaphore);
/* This thread is doomed, all we can do is give up and let the suspender recover. */
if (!ret)
return;
while (MONO_SEM_WAIT (¤t->resume_semaphore) != 0) {
/*if (EINTR != errno) ABORT("sem_wait failed"); */
}
if (current->async_target) {
#if MONO_ARCH_HAS_MONO_CONTEXT
MonoContext tmp = current->suspend_state.ctx;
mono_threads_get_runtime_callbacks ()->setup_async_callback (&tmp, current->async_target, current->user_data);
current->async_target = current->user_data = NULL;
mono_monoctx_to_sigctx (&tmp, context);
#else
g_error ("The new interruption machinery requires a working mono-context");
#endif
}
MONO_SEM_POST (¤t->finish_resume_semaphore);
}
示例10: mono_thread_info_resume_internal
static gboolean
mono_thread_info_resume_internal (MonoThreadInfo *info)
{
gboolean result;
if (mono_thread_info_suspend_state (info) == STATE_SELF_SUSPENDED) {
MONO_SEM_POST (&info->resume_semaphore);
MONO_SEM_WAIT_UNITERRUPTIBLE (&info->finish_resume_semaphore);
result = TRUE;
} else {
result = mono_threads_core_resume (info);
}
info->thread_state &= ~SUSPEND_STATE_MASK;
return result;
}
示例11: workers_wake_up
static void
workers_wake_up (int max)
{
int i;
for (i = 0; i < max; ++i) {
int num;
do {
num = workers_num_waiting;
if (num == 0)
return;
} while (InterlockedCompareExchange (&workers_num_waiting, num - 1, num) != num);
MONO_SEM_POST (&workers_waiting_sem);
}
}
示例12: mono_thread_info_resume_internal
static gboolean
mono_thread_info_resume_internal (MonoThreadInfo *info)
{
gboolean result;
if (mono_thread_info_suspend_state (info) == STATE_SELF_SUSPENDED) {
MONO_SEM_POST (&info->resume_semaphore);
while (MONO_SEM_WAIT (&info->finish_resume_semaphore) != 0) {
/* g_assert (errno == EINTR); */
}
result = TRUE;
} else {
result = mono_threads_core_resume (info);
}
info->thread_state &= ~SUSPEND_STATE_MASK;
return result;
}
示例13: workers_wait
static void
workers_wait (void)
{
State old_state, new_state;
gboolean post_done;
++stat_workers_num_waited;
do {
new_state = old_state = workers_state;
assert_working_or_nursery_collection (old_state);
--new_state.data.num_awake;
post_done = FALSE;
if (!new_state.data.num_awake && !new_state.data.num_posted) {
/* We are the last thread to go to sleep. */
if (old_state.data.state == STATE_WORKING)
new_state.data.state = STATE_NOT_WORKING;
new_state.data.post_done = 0;
if (old_state.data.post_done)
post_done = TRUE;
}
} while (!set_state (old_state, new_state));
if (post_done)
MONO_SEM_POST (&workers_done_sem);
MONO_SEM_WAIT (&workers_waiting_sem);
do {
new_state = old_state = workers_state;
SGEN_ASSERT (0, old_state.data.num_posted > 0, "How can we be awake without the semaphore having been posted?");
SGEN_ASSERT (0, old_state.data.num_awake < workers_num, "There are too many worker threads awake");
--new_state.data.num_posted;
++new_state.data.num_awake;
assert_working_or_nursery_collection (new_state);
} while (!set_state (old_state, new_state));
}
示例14: workers_wait
static void
workers_wait (void)
{
int num;
++stat_workers_num_waited;
do {
num = workers_num_waiting;
} while (InterlockedCompareExchange (&workers_num_waiting, num + 1, num) != num);
if (num + 1 == workers_num && !workers_gc_in_progress) {
/* Make sure the done semaphore is only posted once. */
int posted;
do {
posted = workers_done_posted;
if (posted)
break;
} while (InterlockedCompareExchange (&workers_done_posted, 1, 0) != 0);
if (!posted)
MONO_SEM_POST (&workers_done_sem);
}
MONO_SEM_WAIT (&workers_waiting_sem);
}
示例15: workers_wake_up
static void
workers_wake_up (int max)
{
int i;
for (i = 0; i < max; ++i) {
State old_state, new_state;
do {
old_state = new_state = workers_state;
/*
* We must not wake workers up once done has
* been posted.
*/
if (old_state.data.done_posted)
return;
if (old_state.data.num_waiting == 0)
return;
--new_state.data.num_waiting;
} while (!set_state (old_state, new_state));
MONO_SEM_POST (&workers_waiting_sem);
}
}