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




Примеры. Хрестоматия по программированию на Си в Unix - стр. 4


/* Уничтожить все прежние записи про 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]; /* вернуть указатель на зону данных */ }




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