static int update_file(const char *path, void *entry, int esize) { int rv = -1; int file; char *map; if ((file = open(path, O_RDWR)) >= 0) { map = mmap(NULL, esize * STEP_COUNT, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, file, 0); if ((map != NULL) && (map != MAP_FAILED)) { if (timeof(entry) > timeof(map + esize * (STEP_COUNT-1))) { memmove(map, map + esize, esize * (STEP_COUNT-1)); memcpy(map + esize * (STEP_COUNT-1), entry, esize); } munmap(map, esize * STEP_COUNT); rv = 0; } close(file); } return rv; }
static Node * newnode(char *name) { register Node *node; node = (Node *)Malloc(sizeof(Node)); symlook(name, S_NODE, (void *)node); node->name = name; node->time = timeof(name, 0); node->prereqs = 0; node->flags = node->time? PROBABLE : 0; node->next = 0; return(node); }
void update(int fake, Node *node) { Arc *a; MADESET(node, fake? BEINGMADE : MADE); if(((node->flags&VIRTUAL) == 0) && (access(node->name, 0) == 0)){ node->time = timeof(node->name, 1); node->flags &= ~(CANPRETEND|PRETENDING); for(a = node->prereqs; a; a = a->next) if(a->prog) outofdate(node, a, 1); } else { node->time = 1; for(a = node->prereqs; a; a = a->next) if(a->n && outofdate(node, a, 1)) node->time = a->n->time; } /* print("----node %s time=%lud flags=0x%x\n", node->name, node->time, node->flags);/**/ }