CGI-SpeedyCGI

 view release on metacpan or  search on metacpan

src/speedy_util.c  view on Meta::CPAN


void speedy_util_mapout(SpeedyMapInfo *mi) {
    if (mi->addr) {
	if (mi->is_mmaped)
	    (void) munmap(mi->addr, mi->maplen);
	else
	    speedy_free(mi->addr);
	mi->addr = NULL;
    }
    speedy_free(mi);
}

static int readall(int fd, void *addr, int len) {
    int numread, n;

    for (numread = 0; len - numread; numread += n) {
	n = read(fd, ((char*)addr) + numread, len - numread);
	if (n == -1)
	    return -1;
	if (n == 0)
	    break;
    }
    return numread;
}

SpeedyMapInfo *speedy_util_mapin(int fd, int max_size, int file_size)
{
    SpeedyMapInfo *mi;
    
    speedy_new(mi, 1, SpeedyMapInfo);

    if (file_size) {
	mi->maplen = max_size == -1 ? file_size : min(file_size, max_size);
	mi->addr = mmap(0, mi->maplen, PROT_READ, MAP_SHARED, fd, 0);
	mi->is_mmaped = (mi->addr != (void*)MAP_FAILED);

	if (!mi->is_mmaped) {
	    speedy_new(mi->addr, mi->maplen, char);
	    lseek(fd, 0, SEEK_SET);
	    mi->maplen = readall(fd, mi->addr, mi->maplen);
	    if (mi->maplen == -1) {
		speedy_util_mapout(mi);
		return NULL;
	    }
	}
    } else {
	mi->maplen = 0;
	mi->addr = NULL;
	mi->is_mmaped = 0;
    }
    return mi;
}

SPEEDY_INLINE SpeedyDevIno speedy_util_stat_devino(const struct stat *stbuf) {
    SpeedyDevIno retval;
    retval.d = stbuf->st_dev;
    retval.i = stbuf->st_ino;
    return retval;
}

SPEEDY_INLINE int speedy_util_open_stat(const char *path, struct stat *stbuf)
{
    int fd = open(path, O_RDONLY);
    if (fd != -1 && fstat(fd, stbuf) == -1) {
       close(fd);
       fd = -1;
    }
    return fd;
}

void speedy_util_exit(int status, int underbar_exit) {

#   ifdef SPEEDY_PROFILING
	end_profiling(underbar_exit);
#   endif

#   ifdef SPEEDY_DEBUG
	if (savecore) {
	    char buf[200];
	    struct timeval tv;

	    mkdir("/tmp/speedy_core", 0777);
	    gettimeofday(&tv, NULL);
	    sprintf(buf, "/tmp/speedy_core/%s.%d.%06d.%d", SPEEDY_PROGNAME, (int)tv.tv_sec, (int)tv.tv_usec, getpid());
	    mkdir(buf, 0777);
	    chdir(buf);
	    kill(getpid(), SIGFPE);
	}
#   endif

    if (underbar_exit)
	_exit(status);
    else
	exit(status);
}

int speedy_util_kill(pid_t pid, int sig) {
    return pid
	? (pid == speedy_util_getpid() ? 0 : kill(pid, sig))
	: -1;
}



( run in 2.720 seconds using v1.01-cache-2.11-cpan-98e64b0badf )