int buffer_mmapread(buffer* b,const char* filename) { if (!(b->x=mmap_read(filename,&b->n))) return -1; b->p=0; b->a=b->n; b->fd=-1; b->op=op; b->deinit=buffer_munmap; return 0; }
int rawdv_read_frame(dv_t *dv, uint8_t *buf ) { int n = 0; if(dv->mmap_region == NULL) { n = read( dv->fd, dv->buf, dv->size ); memcpy( buf, dv->buf, dv->size ); } else { n = mmap_read( dv->mmap_region, dv->offset, dv->size, buf ); } return n; }
int main(int argc, char* argv[]) { int optarg; for(optarg = 1; optarg < argc; ++optarg) { char *dll, *filename, *dll_name; size_t dllsz; uint32 i, *name_rvas, nexp, num_entries; pe_data_directory *datadir; pe_export_directory* expdata; pe32_opt_header* opt_hdr_32; pe_type type; filename = argv[optarg]; dll = mmap_read(filename, &dllsz); if(dll == NULL) return 1; dll_name = str_basename(filename); opt_hdr_32 = pe_header_opt(dll); type = uint16_get(&opt_hdr_32->magic); datadir = pe_get_datadir(dll, &num_entries); if(num_entries < 1) /* no exports */ return 1; expdata = pe_rva2ptr(dll, uint32_get(&datadir->virtual_address)); nexp = uint32_get(&expdata->number_of_names); name_rvas = pe_rva2ptr(dll, uint32_get(&expdata->address_of_names)); buffer_puts(buffer_1, "EXPORTS\n"); (void)dll_name; /* buffer_putm_3(buffer_1, "LIBRARY ", dll_name, "\n"); */ for(i = 0; i < nexp; i++) { buffer_putm_3(buffer_1, " ", pe_rva2ptr(dll, uint32_get(&name_rvas[i])), " @ "); buffer_putulong(buffer_1, 1 + i); buffer_putnlflush(buffer_1); } mmap_unmap(dll, dllsz); } return 0; }
int main(int argc,char* argv[]) { static size_t x; x=23; atomic_add(&x,3); printf("%u\n",x); printf("%u\n",atomic_add_return(&x,-3)); printf("%u\n",compare_and_swap(&x,26,17)); printf("%u\n",compare_and_swap(&x,23,17)); #if 0 atomic_add(&x,3); printf("%u\n",x); x=23; atomic_add(&x,3); assert(x==26); atomic_or(&x,1); assert(x==27); atomic_and(&x,-2); assert(x==26); #endif #if 0 iarray a; char* c; iarray_init(&a,sizeof(io_entry)); printf("15 -> %p\n",c=iarray_allocate(&a,15)); printf("23 -> %p\n",c=iarray_allocate(&a,23)); printf("1234567 -> %p\n",c=iarray_allocate(&a,1234567)); printf("23 -> %p\n",iarray_get(&a,23)); #endif #if 0 io_batch* b=iob_new(1234); int64 fd=open("t.c",0); iob_addbuf(b,"fnord",5); iob_addfile_close(b,fd,0,7365); iob_write(1,b,writecb); #endif #if 0 char dest[1024]; unsigned long len; scan_urlencoded2("libstdc++.tar.gz",dest,&len); buffer_putmflush(buffer_1,dest,"\n"); #endif #if 0 static stralloc sa; stralloc_copym(&sa,"foo ","bar ","baz.\n"); write(1,sa.s,sa.len); #endif #if 0 buffer_putmflush(buffer_1,"foo ","bar ","baz.\n"); #endif #if 0 char* c="fnord"; int fd=open_read(c); errmsg_iam(argv[0]); carp("could not open file `",c,"'"); diesys(23,"could not open file `",c,"'"); #endif #if 0 errmsg_warn("could not open file `",c,"'",0); errmsg_warnsys("could not open file `",c,"'",0); #endif #if 0 char buf[100]="/usr/bin/sh"; int len=str_len(buf); assert(byte_rchr(buf,len,'/')==8); assert(byte_rchr(buf,len,'@')==len); assert(byte_rchr(buf,len,'h')==len-1); printf("%d\n",byte_rchr("x",1,'x')); #endif #if 0 char buf[IP6_FMT+100]; int i; char ip[16]; uint32 scope_id; char* s="fec0::1:220:e0ff:fe69:ad92%eth0/64"; char blubip[16]="\0\0\0\0\0\0\0\0\0\0\xff\xff\x7f\0\0\001"; i=scan_ip6if(s,ip,&scope_id); assert(s[i]=='/'); buffer_put(buffer_1,buf,fmt_ip6if(buf,ip,scope_id)); buffer_putnlflush(buffer_1); buffer_put(buffer_1,buf,fmt_ip6ifc(buf,blubip,scope_id)); buffer_putnlflush(buffer_1); scan_ip6("2001:7d0:0:f015:0:0:0:1",ip); buffer_put(buffer_1,buf,fmt_ip6(buf,ip)); buffer_putnlflush(buffer_1); #endif #if 0 char buf[100]; int i; printf("%d\n",i=fmt_pad(buf,"fnord",5,7,10)); buf[i]=0; puts(buf); #endif #if 0 char ip[16]; char buf[32]; printf("%d (expect 2)\n",scan_ip6("::",ip)); printf("%d (expect 3)\n",scan_ip6("::1",ip)); printf("%d (expect 16)\n",scan_ip6("fec0:0:0:ffff::1/0",ip)); printf("%.*s\n",fmt_ip6(buf,ip),buf); #endif #if 0 static stralloc s,t; stralloc_copys(&s,"fnord"); stralloc_copys(&t,"abc"); printf("%d\n",stralloc_diff(&s,&t)); stralloc_copys(&t,"fnor"); printf("%d\n",stralloc_diff(&s,&t)); stralloc_copys(&t,"fnord"); printf("%d\n",stralloc_diff(&s,&t)); stralloc_copys(&t,"fnordh"); printf("%d\n",stralloc_diff(&s,&t)); stralloc_copys(&t,"hausen"); printf("%d\n",stralloc_diff(&s,&t)); #endif #if 0 static stralloc s; stralloc_copys(&s,"fnord"); printf("%d\n",stralloc_diffs(&s,"abc")); printf("%d\n",stralloc_diffs(&s,"fnor")); printf("%d\n",stralloc_diffs(&s,"fnord")); printf("%d\n",stralloc_diffs(&s,"fnordh")); printf("%d\n",stralloc_diffs(&s,"hausen")); #endif #if 0 printf("%d\n",case_starts("fnordhausen","FnOrD")); printf("%d\n",case_starts("fnordhausen","blah")); #endif #if 0 char buf[]="FnOrD"; case_lowers(buf); puts(buf); #endif #if 0 char buf[100]="foo bar baz"; printf("%d (expect 7)\n",byte_rchr(buf,11,' ')); #endif #if 0 unsigned long size; char* buf=mmap_read(argv[1],&size); if (buf) { unsigned int x=fmt_yenc(0,buf,size); unsigned int y; char* tmp=malloc(x+1); y=fmt_yenc(tmp,buf,size); write(1,tmp,x); } #endif #if 0 char buf[100]; char buf2[100]; unsigned int len,len2; buf[fmt_yenc(buf,"http://localhost/~fefe",22)]=0; buffer_puts(buffer_1,buf); buffer_putsflush(buffer_1,"\n"); if ((buf[len2=scan_yenc(buf,buf2,&len)])!='\n') { buffer_putsflush(buffer_2,"parse error!\n"); return 1; } buffer_put(buffer_1,buf2,len2); buffer_putsflush(buffer_1,"\n"); return 0; #endif #if 0 char buf[100]; char buf2[100]; unsigned int len,len2; buf[fmt_base64(buf,"foo:bar",7)]=0; buffer_puts(buffer_1,buf); buffer_putsflush(buffer_1,"\n"); if ((buf[len2=scan_base64(buf,buf2,&len)])!=0) { buffer_putsflush(buffer_2,"parse error!\n"); return 1; } buffer_put(buffer_1,buf2,len2); buffer_putsflush(buffer_1,"\n"); return 0; #endif #if 0 unsigned long size; char* buf=mmap_read(argv[1],&size); if (buf) { unsigned int x=fmt_uuencoded(0,buf,size); unsigned int y; char* tmp=malloc(x+1); y=fmt_uuencoded(tmp,buf,size); write(1,tmp,x); } #endif #if 0 char buf[]="00000000000000000000000000000001"; char ip[16]; if (scan_ip6_flat(buf,ip) != str_len(buf)) buffer_putsflush(buffer_2,"parse error!\n"); #endif #if 0 int fd=open_read("t.c"); buffer b; char buf[1024]; char line[20]; int i; buffer_init(&b,read,fd,buf,1024); i=buffer_getline(&b,line,19); buffer_puts(buffer_1,"getline returned "); buffer_putulong(buffer_1,i); buffer_puts(buffer_1,"\n"); buffer_puts(buffer_1,line); buffer_flush(buffer_1); #endif #if 0 buffer_putulong(buffer_1,23); // buffer_putspace(buffer_1); buffer_putsflush(buffer_1,"\n"); // buffer_flush(buffer_1); #endif #if 0 long a,b,c; char buf[4096]; char buf2[4096]; memcpy(buf,buf2,4096); byte_copy(buf,4096,buf2); rdtscl(a); memcpy(buf,buf2,4096); rdtscl(b); byte_copy(buf,4096,buf2); rdtscl(c); printf("memcpy: %d - byte_copy: %d\n",b-a,c-b); #endif #if 0 char ip[16]; int i; if ((i=scan_ip6(argv[1],ip))) { char buf[128]; buf[fmt_ip6(buf,ip)]=0; puts(buf); } #endif #if 0 char buf[100]; strcpy(buf,"foobarbaz"); buf[fmt_fill(buf,3,5,100)]=0; printf("\"%s\"\n",buf); #endif #if 0 unsigned long len; char *c=mmap_read("/etc/passwd",&len); printf("got map %p of len %lu\n",c,len); #endif #if 0 char c; printf("%d\n",buffer_getc(buffer_0,&c)); printf("%c\n",c); #endif #if 0 char buf[100]="01234567890123456789012345678901234567890123456789"; long a,b,c; #endif #if 0 buf[ip4_fmt(buf,ip4loopback)]=0; buffer_puts(buffer_1small,buf); buffer_flush(buffer_1small); #endif #if 0 buf[0]=0; buf[fmt_8long(buf,0)]=0; puts(buf); rdtscl(a); c=str_len(buf); rdtscl(b); /*byte_zero_djb(buf,j); */ // printf("\n%lu %d\n",b-a,c); #endif #if 0 buffer_puts(buffer_1small,"hello, world\n"); buffer_flush(buffer_1small); #endif #if 0 int s=socket_tcp4(); char ip[4]={127,0,0,1}; int t=socket_connect4(s,ip,80); #endif #if 0 char buf[100]="foo bar baz fnord "; char buf2[100]="foo braz fnord"; long a,b,c; long i=0,j=0,k=0; double d; uint32 l,m,n; stralloc sa={0}; stralloc_copys(&sa,"fnord"); stralloc_catlong0(&sa,-23,5); stralloc_append(&sa,"\n"); printf("%d %d\n",str_equal("fnord","fnord1"),str_equal("fnord1","fnord")); write(1,sa.s,sa.len); printf("%d %d\n",stralloc_starts(&sa,"fnord"),stralloc_starts(&sa,"fnord\na")); l=0xdeadbeef; uint32_pack_big((char*)&m,l); uint32_unpack_big((char*)&m,&n); printf("%x %x %x\n",l,m,n); rdtscl(a); /* i=scan_double("3.1415",&d); */ rdtscl(b); /*byte_zero_djb(buf,j); */ rdtscl(c); printf("%lu %lu\n",b-a,c-b); #endif #if 0 size_t size; char* buf=mmap_read(argv[1],&size); if (buf) { unsigned int x=fmt_urlencoded2(0,buf,size,"x"); unsigned int y; char* tmp=malloc(x+1); y=fmt_urlencoded2(tmp,buf,size,"x"); write(1,tmp,x); } #endif #if 0 printf("%d %d\n",strcmp("foo","bar"),str_diff("foo","bar")); printf("%d %d\n",strcmp("foo","üar"),str_diff("foo","üar")); #endif #if 0 { int16 a; int32 b; int64 c; assert(imult16(4,10000,&a)==0); assert(imult16(-4,10000,&a)==0); assert(imult16(5,10,&a)==1 && a==50); assert(imult16(-3,10000,&a)==1 && a==-30000); assert(imult32(0x40000000,2,&b)==0); assert(imult32(0x3fffffff,2,&b)==1 && b==0x7ffffffe); assert(imult64(0x4000000000000000ll,2,&c)==0); assert(imult64(0x3fffffffffffffffll,2,&c)==1 && c==0x7ffffffffffffffell); } #endif #if 0 stralloc a; printf("%d\n",stralloc_copym(&a,"fnord",", ","foo")); #endif return 0; }
static void thread_func(void *userdata) { struct userdata *u = userdata; int write_type = 0, read_type = 0; short revents = 0; pa_assert(u); pa_log_debug("Thread starting up"); if (u->core->realtime_scheduling) pa_make_realtime(u->core->realtime_priority); pa_thread_mq_install(&u->thread_mq); for (;;) { int ret; /* pa_log("loop"); */ if (PA_UNLIKELY(u->sink && u->sink->thread_info.rewind_requested)) pa_sink_process_rewind(u->sink, 0); /* Render some data and write it to the dsp */ if (u->sink && PA_SINK_IS_OPENED(u->sink->thread_info.state) && ((revents & POLLOUT) || u->use_mmap || u->use_getospace)) { if (u->use_mmap) { if ((ret = mmap_write(u)) < 0) goto fail; revents &= ~POLLOUT; if (ret > 0) continue; } else { ssize_t l; pa_bool_t loop = FALSE, work_done = FALSE; l = (ssize_t) u->out_fragment_size; if (u->use_getospace) { audio_buf_info info; if (ioctl(u->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { pa_log_info("Device doesn't support SNDCTL_DSP_GETOSPACE: %s", pa_cstrerror(errno)); u->use_getospace = FALSE; } else { l = info.bytes; /* We loop only if GETOSPACE worked and we * actually *know* that we can write more than * one fragment at a time */ loop = TRUE; } } /* Round down to multiples of the fragment size, * because OSS needs that (at least some versions * do) */ l = (l/(ssize_t) u->out_fragment_size) * (ssize_t) u->out_fragment_size; /* Hmm, so poll() signalled us that we can read * something, but GETOSPACE told us there was nothing? * Hmm, make the best of it, try to read some data, to * avoid spinning forever. */ if (l <= 0 && (revents & POLLOUT)) { l = (ssize_t) u->out_fragment_size; loop = FALSE; } while (l > 0) { void *p; ssize_t t; if (u->memchunk.length <= 0) pa_sink_render(u->sink, (size_t) l, &u->memchunk); pa_assert(u->memchunk.length > 0); p = pa_memblock_acquire(u->memchunk.memblock); t = pa_write(u->fd, (uint8_t*) p + u->memchunk.index, u->memchunk.length, &write_type); pa_memblock_release(u->memchunk.memblock); /* pa_log("wrote %i bytes of %u", t, l); */ pa_assert(t != 0); if (t < 0) { if (errno == EINTR) continue; else if (errno == EAGAIN) { pa_log_debug("EAGAIN"); revents &= ~POLLOUT; break; } else { pa_log("Failed to write data to DSP: %s", pa_cstrerror(errno)); goto fail; } } else { u->memchunk.index += (size_t) t; u->memchunk.length -= (size_t) t; if (u->memchunk.length <= 0) { pa_memblock_unref(u->memchunk.memblock); pa_memchunk_reset(&u->memchunk); } l -= t; revents &= ~POLLOUT; work_done = TRUE; } if (!loop) break; } if (work_done) continue; } } /* Try to read some data and pass it on to the source driver. */ if (u->source && PA_SOURCE_IS_OPENED(u->source->thread_info.state) && ((revents & POLLIN) || u->use_mmap || u->use_getispace)) { if (u->use_mmap) { if ((ret = mmap_read(u)) < 0) goto fail; revents &= ~POLLIN; if (ret > 0) continue; } else { void *p; ssize_t l; pa_memchunk memchunk; pa_bool_t loop = FALSE, work_done = FALSE; l = (ssize_t) u->in_fragment_size; if (u->use_getispace) { audio_buf_info info; if (ioctl(u->fd, SNDCTL_DSP_GETISPACE, &info) < 0) { pa_log_info("Device doesn't support SNDCTL_DSP_GETISPACE: %s", pa_cstrerror(errno)); u->use_getispace = FALSE; } else { l = info.bytes; loop = TRUE; } } l = (l/(ssize_t) u->in_fragment_size) * (ssize_t) u->in_fragment_size; if (l <= 0 && (revents & POLLIN)) { l = (ssize_t) u->in_fragment_size; loop = FALSE; } while (l > 0) { ssize_t t; size_t k; pa_assert(l > 0); memchunk.memblock = pa_memblock_new(u->core->mempool, (size_t) -1); k = pa_memblock_get_length(memchunk.memblock); if (k > (size_t) l) k = (size_t) l; k = (k/u->frame_size)*u->frame_size; p = pa_memblock_acquire(memchunk.memblock); t = pa_read(u->fd, p, k, &read_type); pa_memblock_release(memchunk.memblock); pa_assert(t != 0); /* EOF cannot happen */ /* pa_log("read %i bytes of %u", t, l); */ if (t < 0) { pa_memblock_unref(memchunk.memblock); if (errno == EINTR) continue; else if (errno == EAGAIN) { pa_log_debug("EAGAIN"); revents &= ~POLLIN; break; } else { pa_log("Failed to read data from DSP: %s", pa_cstrerror(errno)); goto fail; } } else { memchunk.index = 0; memchunk.length = (size_t) t; pa_source_post(u->source, &memchunk); pa_memblock_unref(memchunk.memblock); l -= t; revents &= ~POLLIN; work_done = TRUE; } if (!loop) break; } if (work_done) continue; } } /* pa_log("loop2 revents=%i", revents); */ if (u->rtpoll_item) { struct pollfd *pollfd; pa_assert(u->fd >= 0); pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); pollfd->events = (short) (((u->source && PA_SOURCE_IS_OPENED(u->source->thread_info.state)) ? POLLIN : 0) | ((u->sink && PA_SINK_IS_OPENED(u->sink->thread_info.state)) ? POLLOUT : 0)); } /* Hmm, nothing to do. Let's sleep */ if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) goto fail; if (ret == 0) goto finish; if (u->rtpoll_item) { struct pollfd *pollfd; pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); if (pollfd->revents & ~(POLLOUT|POLLIN)) { pa_log("DSP shutdown."); goto fail; } revents = pollfd->revents; } else revents = 0; } fail: /* If this was no regular exit from the loop we have to continue * processing messages until we received PA_MESSAGE_SHUTDOWN */ pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); finish: pa_log_debug("Thread shutting down"); }
static int __cmd_record(int argc, const char **argv) { int i, counter; struct stat st; pid_t pid = 0; int flags; int err; unsigned long waking = 0; page_size = sysconf(_SC_PAGE_SIZE); nr_cpus = sysconf(_SC_NPROCESSORS_ONLN); assert(nr_cpus <= MAX_NR_CPUS); assert(nr_cpus >= 0); atexit(sig_atexit); signal(SIGCHLD, sig_handler); signal(SIGINT, sig_handler); if (!stat(output_name, &st) && st.st_size) { if (!force && !append_file) { fprintf(stderr, "Error, output file %s exists, use -A to append or -f to overwrite.\n", output_name); exit(-1); } } else { append_file = 0; } flags = O_CREAT|O_RDWR; if (append_file) file_new = 0; else flags |= O_TRUNC; output = open(output_name, flags, S_IRUSR|S_IWUSR); if (output < 0) { perror("failed to create output file"); exit(-1); } session = perf_session__new(output_name, O_WRONLY, force); if (session == NULL) { pr_err("Not enough memory for reading perf file header\n"); return -1; } if (!file_new) { err = perf_header__read(&session->header, output); if (err < 0) return err; } if (raw_samples) { perf_header__set_feat(&session->header, HEADER_TRACE_INFO); } else { for (i = 0; i < nr_counters; i++) { if (attrs[i].sample_type & PERF_SAMPLE_RAW) { perf_header__set_feat(&session->header, HEADER_TRACE_INFO); break; } } } atexit(atexit_header); if (!system_wide) { pid = target_pid; if (pid == -1) pid = getpid(); open_counters(profile_cpu, pid); } else { if (profile_cpu != -1) { open_counters(profile_cpu, target_pid); } else { for (i = 0; i < nr_cpus; i++) open_counters(i, target_pid); } } if (file_new) { err = perf_header__write(&session->header, output, false); if (err < 0) return err; } if (!system_wide) event__synthesize_thread(pid, process_synthesized_event); else event__synthesize_threads(process_synthesized_event); if (target_pid == -1 && argc) { pid = fork(); if (pid < 0) die("failed to fork"); if (!pid) { if (execvp(argv[0], (char **)argv)) { perror(argv[0]); exit(-1); } } else { /* * Wait a bit for the execv'ed child to appear * and be updated in /proc * FIXME: Do you know a less heuristical solution? */ usleep(1000); event__synthesize_thread(pid, process_synthesized_event); } child_pid = pid; } if (realtime_prio) { struct sched_param param; param.sched_priority = realtime_prio; if (sched_setscheduler(0, SCHED_FIFO, ¶m)) { pr_err("Could not set realtime priority.\n"); exit(-1); } } for (;;) { int hits = samples; for (i = 0; i < nr_cpu; i++) { for (counter = 0; counter < nr_counters; counter++) { if (mmap_array[i][counter].base) mmap_read(&mmap_array[i][counter]); } } if (hits == samples) { if (done) break; err = poll(event_array, nr_poll, -1); waking++; } if (done) { for (i = 0; i < nr_cpu; i++) { for (counter = 0; counter < nr_counters; counter++) ioctl(fd[i][counter], PERF_EVENT_IOC_DISABLE); } } } fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking); /* * Approximate RIP event size: 24 bytes. */ fprintf(stderr, "[ perf record: Captured and wrote %.3f MB %s (~%lld samples) ]\n", (double)bytes_written / 1024.0 / 1024.0, output_name, bytes_written / 24); return 0; }
static int __cmd_record(int argc, const char **argv) { int i, counter; struct stat st; pid_t pid = 0; int flags; int ret; unsigned long waking = 0; page_size = sysconf(_SC_PAGE_SIZE); nr_cpus = sysconf(_SC_NPROCESSORS_ONLN); assert(nr_cpus <= MAX_NR_CPUS); assert(nr_cpus >= 0); atexit(sig_atexit); signal(SIGCHLD, sig_handler); signal(SIGINT, sig_handler); if (!stat(output_name, &st) && st.st_size) { if (!force && !append_file) { fprintf(stderr, "Error, output file %s exists, use -A to append or -f to overwrite.\n", output_name); exit(-1); } } else { append_file = 0; } flags = O_CREAT|O_RDWR; if (append_file) file_new = 0; else flags |= O_TRUNC; output = open(output_name, flags, S_IRUSR|S_IWUSR); if (output < 0) { perror("failed to create output file"); exit(-1); } if (!file_new) header = perf_header__read(output); else header = perf_header__new(); if (raw_samples) { read_tracing_data(attrs, nr_counters); } else { for (i = 0; i < nr_counters; i++) { if (attrs[i].sample_type & PERF_SAMPLE_RAW) { read_tracing_data(attrs, nr_counters); break; } } } atexit(atexit_header); if (!system_wide) { pid = target_pid; if (pid == -1) pid = getpid(); open_counters(profile_cpu, pid); } else { if (profile_cpu != -1) { open_counters(profile_cpu, target_pid); } else { for (i = 0; i < nr_cpus; i++) open_counters(i, target_pid); } } if (file_new) perf_header__write(header, output); if (!system_wide) { pid_t tgid = pid_synthesize_comm_event(pid, 0); pid_synthesize_mmap_samples(pid, tgid); } else synthesize_all(); if (target_pid == -1 && argc) { pid = fork(); if (pid < 0) perror("failed to fork"); if (!pid) { if (execvp(argv[0], (char **)argv)) { perror(argv[0]); exit(-1); } } child_pid = pid; } if (realtime_prio) { struct sched_param param; param.sched_priority = realtime_prio; if (sched_setscheduler(0, SCHED_FIFO, ¶m)) { printf("Could not set realtime priority.\n"); exit(-1); } } for (;;) { int hits = samples; for (i = 0; i < nr_cpu; i++) { for (counter = 0; counter < nr_counters; counter++) { if (mmap_array[i][counter].base) mmap_read(&mmap_array[i][counter]); } } if (hits == samples) { if (done) break; ret = poll(event_array, nr_poll, -1); waking++; } if (done) { for (i = 0; i < nr_cpu; i++) { for (counter = 0; counter < nr_counters; counter++) ioctl(fd[i][counter], PERF_EVENT_IOC_DISABLE); } } } fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking); /* * Approximate RIP event size: 24 bytes. */ fprintf(stderr, "[ perf record: Captured and wrote %.3f MB %s (~%lld samples) ]\n", (double)bytes_written / 1024.0 / 1024.0, output_name, bytes_written / 24); return 0; }
dv_t *rawdv_open_input_file(const char *filename, int mmap_size) { dv_t *dv = (dv_t*) vj_malloc(sizeof(dv_t)); if(!dv) return NULL; memset(dv, 0, sizeof(dv_t)); dv_decoder_t *decoder = NULL; uint8_t *tmp = (uint8_t*) vj_malloc(sizeof(uint8_t) * DV_HEADER_SIZE); memset( tmp, 0, sizeof(uint8_t) * DV_HEADER_SIZE); off_t file_size = 0; int n = 0; decoder = dv_decoder_new( 1,0,0); dv->fd = open( filename, O_RDONLY ); if(!dv->fd) { dv_decoder_free(decoder); rawdv_free(dv); veejay_msg(VEEJAY_MSG_ERROR, "Unable to open file '%s'",filename); if(tmp)free(tmp); return NULL; } /* fseek sometimes lies about filesize - seek to end (lseek returns file offset from start)*/ file_size = lseek( dv->fd, 0, SEEK_END ); if( file_size < DV_HEADER_SIZE) { dv_decoder_free(decoder); veejay_msg(VEEJAY_MSG_ERROR, "File %s is not a DV file", filename); rawdv_free(dv); if(tmp) free(tmp); return NULL; } /* And back to start offset */ if( lseek(dv->fd,0, SEEK_SET ) < 0) { dv_decoder_free(decoder); veejay_msg(VEEJAY_MSG_ERROR, "Seek error in %s", filename); rawdv_free(dv); if(tmp) free(tmp); return NULL; } dv->mmap_region = NULL; if( mmap_size > 0 ) // user wants mmap { dv->mmap_region = mmap_file( dv->fd, 0, (mmap_size * 720 * 576 * 3), file_size ); } if( dv->mmap_region == NULL ) { if(mmap_size>0) veejay_msg(VEEJAY_MSG_DEBUG, "Mmap of DV file failed - fallback to read"); n = read( dv->fd, tmp, DV_HEADER_SIZE ); } else { n = mmap_read( dv->mmap_region, 0, DV_HEADER_SIZE, tmp ); } if( n <= 0 ) { dv_decoder_free(decoder); rawdv_free(dv); if(tmp) free(tmp); veejay_msg(VEEJAY_MSG_ERROR, "Cannot read from '%s'", filename); return NULL; } if( dv_parse_header( decoder, tmp) < 0 ) { dv_decoder_free( decoder ); rawdv_free(dv); if(tmp) free(tmp); veejay_msg(VEEJAY_MSG_ERROR, "Cannot parse header of file %s", filename); return NULL; } /* if(decoder->sampling == e_dv_sample_411) { dv_decoder_free( decoder ); rawdv_free(dv); if(tmp) free(tmp); return NULL; }*/ if(dv_is_PAL( decoder ) ) dv->chunk_size = DV_PAL_SIZE; else dv->chunk_size = DV_NTSC_SIZE; dv->width = decoder->width; dv->height = decoder->height; dv->audio_rate = decoder->audio->frequency; dv->audio_chans = decoder->audio->num_channels; dv->audio_qbytes = decoder->audio->quantization; dv->fps = ( dv_is_PAL( decoder) ? 25.0 : 29.97 ); dv->size = decoder->frame_size; dv->num_frames = (file_size - DV_HEADER_SIZE) / dv->size; dv->fmt = decoder->sampling; // dv->fmt = ( decoder->sampling == e_dv_sample_422 ? 1 : 0); dv->buf = (uint8_t*) vj_malloc(sizeof(uint8_t*) * dv->size); dv->offset = 0; veejay_msg(VEEJAY_MSG_DEBUG, "DV properties %d x %d, %f, %d frames, %d sampling", dv->width,dv->height, dv->fps, dv->num_frames, dv->fmt ); dv_decoder_free( decoder ); if(tmp) free(tmp); /* if(dv->audio_rate) { int i; for( i = 0; i < 4; i ++ ) dv->audio_buffers[i] = (int16_t*) vj_malloc(sizeof(int16_t) * 2 * DV_AUDIO_MAX_SAMPLES); }*/ /* veejay_msg(VEEJAY_MSG_DEBUG, "rawDV: num frames %ld, dimensions %d x %d, at %2.2f in %s", dv->num_frames, dv->width, dv->height, dv->fps, (dv->fmt==1?"422":"420")); veejay_msg(VEEJAY_MSG_DEBUG, "rawDV: frame size %d, rate %d, channels %d, bits %d", dv->size, dv->audio_rate, dv->audio_chans, dv->audio_qbytes);*/ return dv; }
static void parse_mime_types(const char* filename) { size_t maplen; const char* map=mmap_read(filename,&maplen); unsigned int allocated=0,used=0; struct mimeentry* nmt=0; if (map) { const char* mimetype; const char* extension; const char* end=map+maplen; const char* x,* l; struct pool* p=malloc(sizeof(struct pool)); if (!p) goto kaputt; pinit(p); for (l=map; l<end; l=nextline(l,end)) { x=skipws(l,end); if (x>=end) break; if (*x=='#' || *x=='\n') continue; mimetype=x; x=skipnonws(x,end); if (x>=end) break; if (*x=='#' || *x=='\n') continue; mimetype=memdup(p,mimetype,x); x=skipws(x,end); if (x>=end) break; if (*x=='#' || *x=='\n') continue; while (x<end) { extension=x; x=skipnonws(x,end); if (x>extension) { extension=memdup(p,extension,x); if (!extension) continue; // printf("%s -> %s\n",extension,mimetype); if (used+1 > allocated) { struct mimeentry* tmp; allocated+=16; tmp=realloc(nmt,allocated*sizeof(nmt[0])); if (!tmp) { free(nmt); pfree(p); free(p); nmt=0; goto kaputt; } nmt=tmp; } nmt[used].name=extension; nmt[used].type=mimetype; ++used; } x=skipws(x,end); if (x>=end || *x=='#' || *x=='\n') break; } if (x>=end) break; } if (mimepool) { pfree(mimepool); free(mimepool); } mimepool=p; kaputt: mmap_unmap((char*)map,maplen); } if (nmt) { nmt[used].name=nmt[used].type=0; free(mimetypes); mimetypes=nmt; } }