void* mono_shared_area (void) { int fd; int pid = getpid (); /* we should allow the user to configure the size */ int size = mono_pagesize (); char buf [128]; void *res; SAreaHeader *header; if (shared_area_disabled ()) { if (!malloced_shared_area) malloced_shared_area = malloc_shared_area (0); /* get the pid here */ return malloced_shared_area; } /* perform cleanup of segments left over from dead processes */ mono_shared_area_instances_helper (NULL, 0, TRUE); g_snprintf (buf, sizeof (buf), "/mono.%d", pid); fd = shm_open (buf, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP); if (fd == -1 && errno == EEXIST) { /* leftover */ shm_unlink (buf); fd = shm_open (buf, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP); } /* in case of failure we try to return a memory area anyway, * even if it means the data can't be read by other processes */ if (fd == -1) return malloc_shared_area (pid); if (ftruncate (fd, size) != 0) { shm_unlink (buf); close (fd); } BEGIN_CRITICAL_SECTION; res = mmap (NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); END_CRITICAL_SECTION; if (res == MAP_FAILED) { shm_unlink (buf); close (fd); return malloc_shared_area (pid); } /* we don't need the file descriptor anymore */ close (fd); header = (SAreaHeader *) res; header->size = size; header->pid = pid; header->stats_start = sizeof (SAreaHeader); header->stats_end = sizeof (SAreaHeader); mono_atexit (mono_shared_area_remove); return res; }
MonoBoolean ves_icall_System_ConsoleDriver_TtySetup (MonoString *keypad, MonoString *teardown, MonoArray **control_chars, int **size) { int dims; dims = terminal_get_dimensions (); if (dims == -1){ int cols = 0, rows = 0; const char *str = g_getenv ("COLUMNS"); if (str != NULL) cols = atoi (str); str = g_getenv ("LINES"); if (str != NULL) rows = atoi (str); if (cols != 0 && rows != 0) cols_and_lines = (cols << 16) | rows; else cols_and_lines = -1; } else { cols_and_lines = dims; } *size = &cols_and_lines; /* 17 is the number of entries set in set_control_chars() above. * NCCS is the total size, but, by now, we only care about those 17 values*/ mono_gc_wbarrier_generic_store (control_chars, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.byte_class, 17)); if (tcgetattr (STDIN_FILENO, &initial_attr) == -1) return FALSE; mono_attr = initial_attr; mono_attr.c_lflag &= ~(ICANON); mono_attr.c_iflag &= ~(IXON|IXOFF); mono_attr.c_cc [VMIN] = 1; mono_attr.c_cc [VTIME] = 0; #ifdef VDSUSP /* Disable C-y being used as a suspend character on OSX */ mono_attr.c_cc [VDSUSP] = 255; #endif if (tcsetattr (STDIN_FILENO, TCSANOW, &mono_attr) == -1) return FALSE; set_control_chars (*control_chars, mono_attr.c_cc); /* If initialized from another appdomain... */ if (setup_finished) return TRUE; keypad_xmit_str = keypad != NULL ? mono_string_to_utf8 (keypad) : NULL; console_set_signal_handlers (); setup_finished = TRUE; if (!atexit_called) { if (teardown != NULL) teardown_str = mono_string_to_utf8 (teardown); mono_atexit (tty_teardown); } return TRUE; }