static void dialog_init(ClipMachine * ClipMachineMemory) { if (!ClipMachineMemory->fullscreen) { static int dialog = 0; if (!dialog) { int r = _clip_init_tty(ClipMachineMemory); if (!r) dialog = 1; else { int l; char msg[256]; snprintf(msg, sizeof(msg), "\nrequest to switch into DIALOG mode failed: %s\n", ClipMachineMemory->syserr); l = strlen(msg); out_log(ClipMachineMemory, msg, l, 0); out_err(ClipMachineMemory, msg, l, 0); exit(2); } } /*_clip_restore_tty(ClipMachineMemory);*/ } }
void _clip_fullscreen(ClipMachine * ClipMachineMemory) { if (ClipMachineMemory->fullscreen) return; ClipMachineMemory->fullscreen = 1; _clip_init_tty(ClipMachineMemory); if (!ClipMachineMemory->screen) { char msg[256]; int l; ClipFrame *fp; snprintf(msg, sizeof(msg), "request to switch into FULLSCREEN mode failed: %s\n", ClipMachineMemory->syserr); l = strlen(msg); out_log(ClipMachineMemory, msg, l, 0); out_err(ClipMachineMemory, msg, l, 0); for (fp = ClipMachineMemory->fp; fp; fp = fp->ClipFrame_up_of_ClipFrame) { _clip_logg(0, "trace: file '%s' line %d", fp->filename_of_ClipFrame, fp->line_of_ClipFrame); fprintf(stderr, "trace: file '%s' line %d\n", fp->filename_of_ClipFrame, fp->line_of_ClipFrame); fflush(stderr); } exit(2); } /*clear_Screen(ClipMachineMemory->screen); */ }
/* * libvmmalloc_postfork_child -- (internal) child post-fork handler */ static void libvmmalloc_postfork_child(void) { LOG(3, NULL); if (Forkopt == 0) { /* do nothing */ return; } if (Private) { LOG(3, "pool mapped as private - do nothing"); } else { LOG(3, "close the original pool file"); (void) close(Fd); Fd = Fd_clone; void *addr = Vmp->addr; size_t size = Vmp->size; LOG(3, "mapping cloned pool file at %p", addr); Vmp = mmap(addr, size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, Fd, 0); if (Vmp == MAP_FAILED) { out_log(NULL, 0, NULL, 0, "Error (libvmmalloc): " "mapping failed\n"); abort(); } if (Vmp != addr) { out_log(NULL, 0, NULL, 0, "Error (libvmmalloc): " "wrong address\n"); abort(); } } /* XXX - open a new log file, with the new PID in the name */ }
int out_print(void *pf, const char *stm, ...) { char buf[1024 * 4]; char *p = buf; va_list arg; int done; va_start(arg, stm); done = vsnprintf(p, sizeof(buf), stm, arg); va_end(arg); out_log(buf); return done; }
static void libvmmalloc_init(void) { char *env_str; size_t size; /* * Register fork handlers before jemalloc initialization. * This provides the correct order of fork handlers execution. * Note that the first malloc() will trigger jemalloc init, so we * have to register fork handlers before the call to out_init(), * as it may indirectly call malloc() when opening the log file. */ if (pthread_atfork(libvmmalloc_prefork, libvmmalloc_postfork_parent, libvmmalloc_postfork_child) != 0) { perror("Error (libvmmalloc): pthread_atfork"); abort(); } out_init(VMMALLOC_LOG_PREFIX, VMMALLOC_LOG_LEVEL_VAR, VMMALLOC_LOG_FILE_VAR, VMMALLOC_MAJOR_VERSION, VMMALLOC_MINOR_VERSION); out_set_vsnprintf_func(je_vmem_navsnprintf); LOG(3, NULL); util_init(); /* set up jemalloc messages to a custom print function */ je_vmem_malloc_message = print_jemalloc_messages; Header_size = roundup(sizeof (VMEM), Pagesize); if ((Dir = getenv(VMMALLOC_POOL_DIR_VAR)) == NULL) { out_log(NULL, 0, NULL, 0, "Error (libvmmalloc): " "environment variable %s not specified", VMMALLOC_POOL_DIR_VAR); abort(); } if ((env_str = getenv(VMMALLOC_POOL_SIZE_VAR)) == NULL) { out_log(NULL, 0, NULL, 0, "Error (libvmmalloc): " "environment variable %s not specified", VMMALLOC_POOL_SIZE_VAR); abort(); } else { long long int v = atoll(env_str); if (v < 0) { out_log(NULL, 0, NULL, 0, "Error (libvmmalloc): negative %s", VMMALLOC_POOL_SIZE_VAR); abort(); } size = (size_t)v; } if (size < VMMALLOC_MIN_POOL) { out_log(NULL, 0, NULL, 0, "Error (libvmmalloc): " "%s value is less than minimum (%zu < %zu)", VMMALLOC_POOL_SIZE_VAR, size, VMMALLOC_MIN_POOL); abort(); } if ((env_str = getenv(VMMALLOC_FORK_VAR)) != NULL) { Forkopt = atoi(env_str); if (Forkopt < 0 || Forkopt > 3) { out_log(NULL, 0, NULL, 0, "Error (libvmmalloc): " "incorrect %s value (%d)", VMMALLOC_FORK_VAR, Forkopt); abort(); } LOG(4, "Fork action %d", Forkopt); } /* * XXX - vmem_create() could be used here, but then we need to * link vmem.o, including all the vmem API. */ Vmp = libvmmalloc_create(Dir, size); if (Vmp == NULL) { out_log(NULL, 0, NULL, 0, "!Error (libvmmalloc): " "vmem pool creation failed"); abort(); } LOG(2, "initialization completed"); }
/* * libvmmalloc_prefork -- (internal) prepare for fork() * * Clones the entire pool or remaps it with MAP_PRIVATE flag. */ static void libvmmalloc_prefork(void) { LOG(3, NULL); /* * There's no need to grab any locks here, as jemalloc pre-fork handler * is executed first, and it does all the synchronization. */ ASSERTne(Vmp, NULL); ASSERTne(Dir, NULL); void *addr = Vmp->addr; size_t size = Vmp->size; if (Private) { LOG(3, "already mapped as private - do nothing"); return; } switch (Forkopt) { case 3: /* clone the entire pool; if it fails - remap it as private */ LOG(3, "clone or remap"); case 2: LOG(3, "clone the entire pool file"); if (libvmmalloc_clone() != NULL) break; if (Forkopt == 2) { out_log(NULL, 0, NULL, 0, "Error (libvmmalloc): " "pool cloning failed\n"); abort(); } /* cloning failed; fall-thru to remapping */ case 1: LOG(3, "remap the pool file as private"); Vmp = mmap(addr, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, Fd, 0); if (Vmp == MAP_FAILED) { out_log(NULL, 0, NULL, 0, "Error (libvmmalloc): " "remapping failed\n"); abort(); } if (Vmp != addr) { out_log(NULL, 0, NULL, 0, "Error (libvmmalloc): " "wrong address\n"); abort(); } Private = 1; break; case 0: LOG(3, "do nothing"); break; default: FATAL("invalid fork action %d", Forkopt); } }