static Scheme_Object *scheme_place_async_try_recv(Scheme_Place_Async_Channel *ch) { Scheme_Object *msg = NULL; void *msg_memory = NULL; mzrt_mutex_lock(ch->lock); { void *signaldescr; signaldescr = scheme_get_signal_handle(); ch->wakeup_signal = signaldescr; if (ch->count > 0) { /* GET MSG */ msg = ch->msgs[ch->out]; msg_memory = ch->msg_memory[ch->out]; ch->msgs[ch->out] = NULL; ch->msg_memory[ch->out] = NULL; --ch->count; ch->out = (++ch->out % ch->size); } } mzrt_mutex_unlock(ch->lock); if (msg) { return scheme_places_deserialize(msg, msg_memory); } return msg; }
static Scheme_Object *scheme_place_async_recv(Scheme_Place_Async_Channel *ch, void **msg_memory) { Scheme_Object *msg = NULL; while(1) { mzrt_mutex_lock(ch->lock); { if (ch->count > 0) { /* GET MSG */ msg = ch->msgs[ch->out]; *msg_memory = ch->msg_memory[ch->out]; ch->msgs[ch->out] = NULL; ch->msg_memory[ch->out] = NULL; --ch->count; ch->out = (++ch->out % ch->size); } } mzrt_mutex_unlock(ch->lock); if(msg) break; else { void *signaldescr; signaldescr = scheme_get_signal_handle(); ch->wakeup_signal = signaldescr; scheme_thread_block(0); scheme_block_until((Scheme_Ready_Fun) scheme_place_async_ch_ready, NULL, (Scheme_Object *) ch, 0); } } return msg; }
static int scheme_place_async_ch_ready(Scheme_Place_Async_Channel *ch) { int ready = 0; mzrt_mutex_lock(ch->lock); { void *signaldescr; signaldescr = scheme_get_signal_handle(); ch->wakeup_signal = signaldescr; if (ch->count > 0) ready = 1; } mzrt_mutex_unlock(ch->lock); return ready; }
static void MrEdSchemeMessages(char *msg, ...) { GC_CAN_IGNORE va_list args; scheme_start_atomic(); XFORM_HIDE_EXPR(va_start(args, msg)); if (!console_out) { AllocConsole(); console_out = GetStdHandle(STD_OUTPUT_HANDLE); if (!wx_in_terminal) { has_stdio = 1; waiting_sema = CreateSemaphore(NULL, 0, 1, NULL); orig_signal_handle = scheme_get_signal_handle(); orig_break_handle = scheme_get_main_thread_break_handle(); SetConsoleCtrlHandler(ConsoleHandler, TRUE); { HMODULE hm; gcw_proc gcw; hm = LoadLibrary("kernel32.dll"); if (hm) gcw = (gcw_proc)GetProcAddress(hm, "GetConsoleWindow"); else gcw = NULL; if (gcw) console_hwnd = gcw(); } if (console_hwnd) { EnableMenuItem(GetSystemMenu(console_hwnd, FALSE), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); RemoveMenu(GetSystemMenu(console_hwnd, FALSE), SC_CLOSE, MF_BYCOMMAND); } } } if (!msg) { char *s; intptr_t l, d; DWORD wrote; s = va_arg(args, char*); d = va_arg(args, intptr_t); l = va_arg(args, intptr_t); WriteConsole(console_out, s XFORM_OK_PLUS d, l, &wrote, NULL); } else {
static Scheme_Object *scheme_place_async_recv(Scheme_Place_Async_Channel *ch) { Scheme_Object *msg = NULL; while(1) { msg = scheme_place_async_try_recv(ch); if(msg) break; else { void *signaldescr; signaldescr = scheme_get_signal_handle(); ch->wakeup_signal = signaldescr; scheme_thread_block(0); scheme_block_until((Scheme_Ready_Fun) scheme_place_async_ch_ready, NULL, (Scheme_Object *) ch, 0); } } return msg; }
static Scheme_Object *scheme_place_wait(int argc, Scheme_Object *args[]) { Scheme_Place *place; place = (Scheme_Place *) args[0]; if (argc != 1) { scheme_wrong_count_m("place-wait", 1, 1, argc, args, 0); } if (!SAME_TYPE(SCHEME_TYPE(args[0]), scheme_place_type)) { scheme_wrong_type("place-wait", "place", 0, argc, args); } # ifdef MZ_PRECISE_GC { Scheme_Object *rc; mz_proc_thread *worker_thread; Scheme_Place *waiting_place; int *wake_fd; proc_thread_wait_data *wd; wd = (proc_thread_wait_data*) malloc(sizeof(proc_thread_wait_data)); wd->proc_thread = (mz_proc_thread *)place->proc_thread; wd->waiting_place = waiting_place; wake_fd = scheme_get_signal_handle(); wd->wake_fd = wake_fd; wd->ready = 0; worker_thread = mz_proc_thread_create(mz_proc_thread_wait_worker, wd); mz_proc_thread_detach(worker_thread); scheme_block_until(place_wait_ready, NULL, (Scheme_Object *) wd, 0); rc = scheme_make_integer((intptr_t)wd->rc); free(wd); return rc; } # else { void *rcvoid; rcvoid = mz_proc_thread_wait((mz_proc_thread *)place->proc_thread); return scheme_make_integer((intptr_t) rcvoid); } # endif }
static int main_after_stack(void *data) { int rval; int argc; MAIN_char **MAIN_argv; #ifdef WINDOWS_UNICODE_MAIN char **argv; #endif argc = ((Main_Args *)data)->argc; MAIN_argv = ((Main_Args *)data)->argv; #if defined(OSKIT) && !defined(OSKIT_TEST) && !KNIT oskit_prepare(&argc, &argv); #endif #ifdef WINDOWS_UNICODE_MAIN { char *a; int i, j, l; argv = (char **)malloc(sizeof(char*)*argc); for (i = 0; i < argc; i++) { for (j = 0; wargv[i][j]; j++) { } l = scheme_utf8_encode((unsigned int*)wargv[i], 0, j, NULL, 0, 1 /* UTF-16 */); a = malloc(l + 1); scheme_utf8_encode((unsigned int *)wargv[i], 0, j, (unsigned char *)a, 0, 1 /* UTF-16 */); a[l] = 0; argv[i] = a; } } #endif #if !defined(NO_USER_BREAK_HANDLER) || defined(DOS_FILE_SYSTEM) break_handle = scheme_get_main_thread_break_handle(); signal_handle = scheme_get_signal_handle(); # ifndef NO_USER_BREAK_HANDLER MZ_SIGSET(SIGINT, user_break_hit); # endif # ifdef DOS_FILE_SYSTEM SetConsoleCtrlHandler(ConsoleBreakHandler, TRUE); # endif #endif #ifdef PRE_FILTER_CMDLINE_ARGUMENTS pre_filter_cmdline_arguments(&argc, &MAIN_argv); #endif rval = run_from_cmd_line(argc, argv, scheme_basic_env, cont_run); #ifndef DEFER_EXPLICIT_EXIT scheme_immediate_exit(rval); /* shouldn't get here */ #endif return rval; }