Хрестоматия по программированию на Си в Unix


           

Уничтожить все прежние записи про


/* Уничтожить все прежние записи про ptr, прописывая их adjsize=0 */ void MEMerasePreviousRecords(AllocFrame *ptr){ int nrecords, i, found; size_t size;
MEMopenFd(); lseek(mem_fd, 0L, SEEK_SET); /* перемотать в начало */ for(;;){ found = 0; size = read(mem_fd, memrecords, sizeof memrecords); nrecords = size / sizeof(memrecords[0]);
if(nrecords <= 0) break;
for(i=0; i < nrecords; i++) if(memrecords[i].ptr == ptr){ memrecords[i].adjsize = 0; /* memrecords[i].size = 0; */ found++; } if(found){ lseek(mem_fd, -size, SEEK_CUR); /* шаг назад */ write(mem_fd, memrecords, size); /* перезаписать */ } } }
void MEMcheckAll(){ #ifdef CHECKALL int nrecords, i; size_t size;
printf("Проверка всех указателей -------------\n"); MEMopenFd(); lseek(mem_fd, 0L, SEEK_SET); /* перемотать в начало */ for(;;){ size = read(mem_fd, memrecords, sizeof memrecords); nrecords = size / sizeof(memrecords[0]);
if(nrecords <= 0) break;
for(i=0; i < nrecords; i++) if(memrecords[i].adjsize != 0) MEMcheckRecord(&memrecords[i]); } printf("Проверка всех указателей завершена ---\n"); #endif }
/* ============================================================= */ /* Заполнение пограничных зон образцом - "следовой дорожкой" */ void MEMmakeRedZones(char *cptr, size_t size, size_t adjsize){ register i;
for(i=0; i < adjsize; i++){ if(i < RedZoneTypeSize i >= RedZoneTypeSize + size ){ /* головная погранзона ИЛИ * хвостовая погранзона + дополнение * до целого числа RedZoneType-ов */ cptr[i] = red_table[ i % RedZoneTypeSize ]; } } } /* ============================================================= */ /* Функция выделения памяти */ void *MEMmalloc(size_t size){ AllocFrame *retptr; int fullRedZoneTypes = (size + RedZoneTypeSize - 1) / RedZoneTypeSize; size_t adjustedSize = sizeof(retptr->red_zone) * 2 + /* две погранзоны */ fullRedZoneTypes * RedZoneTypeSize;
retptr = (AllocFrame *) malloc(adjustedSize); if(retptr == NULL) return NULL;
MEMmakeRedZones ((char *) retptr, size, adjustedSize); MEMputTableRecord(retptr, retptr, size, adjustedSize); return &retptr->stuff[0]; /* вернуть указатель на зону данных */ }

Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий