PDA

Visualizza la versione completa : [C-POSIX] open, mmap, memcpy


daniele_dll
17-11-2005, 17:01
per ora vi assillo un po ...

allora sto scrivendo un software per il quale mi serve poter scrivere consumando al minimo il procio e quindi sfruttando al massimo il DMA e le relative accelerazioni MMX e CO ... di conseguenza dopo qualche oretta di ricerca mi pare di aver capito che mappando i file nella memoria virtuale e usando memcpy per copiarci i dati dentro dovrei ottenere maggiori performance, soprattutto tenendo conto che questo applicativo deve fare questa stessa operazione, tipo, per 1 mese di fila, 24 su 24 ore ^^

posto il pezzetto di codice che mi va in tilt



if (video_read_frame_start(buffer) == TRUE)
{
char filename[30];
sprintf(filename, "./shots/shot.%09i.yuyv", frames);

int shot_fd = open(filename, O_RDWR | O_SYNC | O_CREAT | O_TRUNC);
void* shot_mem_start = mmap(0, (*buffer).length, PROT_READ | PROT_WRITE, MAP_SHARED, shot_fd, (off_t)(*buffer).length);

if (shot_mem_start == MAP_FAILED)
{
perror("mmap");
}
else
{
printf(" Frame[%i] Buffer[%i/%i]: start=%u, length=%i\n", frames, (*buffer).index, n_buffers - 1, (uint)buffers[(*buffer).index].start, (*buffer).length); fflush(stdout);
memcpy(shot_mem_start, buffers[(*buffer).index].start, (*buffer).length);
munmap(shot_mem_start, (*buffer).length);
}
close(shot_fd);

frames++;
}
else
{
printf(" Frame[%i]: error while reading buffer", frames); fflush(stdout);
}

// End frame reading
video_read_frame_end(buffer);


la riga in grassetto quella che mi da errore per via SICURAMENTE dell'errato mmap eseguito sul file (se provo a fare un bel printf("%c", *(char *)shot_mem_start); mi da errore)

l'errore che ricevo Bus Error ... ergo leggo oltre e mi da problemi

io credo che la cosa dipenda dal fatto che il file ha una dimensione di zero e col tutto che imposto la dimensione dell'mmap su quello che mi serve scriverci lui continua a tenere zero.

comunque l'mmap non fallisce

non essendo molto esperto di programmazione C e dato che per la prima volta mi sono avventurato con mmap/munmap/memcpy che fa potreste darlo un'aiutino?

ho gi cercato estensivamente su internet, mi sono letto parecchio codice sorgente ed ovviamente le manpages sotto linux ... ma non sono riuscito a risolvere

cmq se non che imposta la dimensione in memoria a zero forse perch non rispetto la dimensione della pagina (e quindi la prende a male)

ho anche provato a fare prima mmap e poi a ridimensionare il tutto con mremap ma ottengo lo stesso identico errore

qualcuno di voi sa aiutarmi? :stordita:

daniele_dll
17-11-2005, 18:14
do un piccolo update....


ho corretto il calcolo della memoria virtuale da allocare per l'mmap ma ancora nun va :\

la riga corretta questa
void* shot_mem_start = mmap(0, (((*buffer).bytesused / sz) + 1) * sz, PROT_READ | PROT_WRITE, MAP_SHARED, shot_fd, 0);


sz lo estraggo usando
long sz = sysconf(_SC_PAGESIZE);

ho bisogno di appena 151 pagine per mettere in memoria i dati

nota: OVVIAMENTE il problema persiste ancora ma almeon un pezzetto ora risolto ^^

daniele_dll
17-11-2005, 19:26
risolto :fighet: :fighet:

dovevo usare ftruncate sull'fd del file per riallaggarlo a sufficenza per poterci copiare i file ... credevo che mmap lo facesse da solo :unz: :unz:

Loading