SReadWriteChannel CHANNEL_PUBLIC create_duplex_named_pipe(const char* name,std::size_t bufferSize, uint8_t maxInstances) { return SReadWriteChannel(create_named_pipe(name, PIPE_ACCESS_DUPLEX, bufferSize, maxInstances)); }
int start() { /* This is the "starter process" for statistical profiling. * * Create output file for profiling data. Create named pipe to * synchronize with stopper process. Fork so the parent can exit. * Allocate memory for profiling data. Start profiling in kernel. * Complete detachment from terminal. Write known string to named * pipe, which blocks until read by stopper process. Redirect * stdout/stderr to the named pipe. Write profiling data to file. * Clean up. */ int log_fd; if (init_outfile() || create_named_pipe()) return 1; printf("Starting statistical profiling.\n"); if (fork() != 0) exit(0); if (alloc_mem()) return 1; if (sprofile(PROF_START, mem_size, freq, intr_type, &sprof_info, mem_ptr)) { perror("sprofile"); fprintf(stderr, "Error starting profiling.\n"); return 1; } detach(); /* Temporarily redirect to system log to catch errors. */ log_fd = open(DEV_LOG, O_WRONLY); dup2(log_fd, 1); dup2(log_fd, 2); if ((npipe_fd = open(NPIPE, O_WRONLY)) < 0) { fprintf(stderr, "Unable to open named pipe %s.\n", NPIPE); return 1; } else /* Synchronize with stopper process. */ write(npipe_fd, SYNCING, strlen(SYNCING)); /* Now redirect to named pipe. */ dup2(npipe_fd, 1); dup2(npipe_fd, 2); mem_used = sprof_info.mem_used; if (mem_used == -1) { fprintf(stderr, "WARNING: Profiling was stopped prematurely due to "); fprintf(stderr, "insufficient memory.\n"); fprintf(stderr, "Try increasing available memory using the -m switch.\n"); } if (write_outfile()) return 1; close(log_fd); close(npipe_fd); unlink(NPIPE); close(outfile_fd); free(mem_ptr); return 0; }