Example #1
0
Byte*
FSIO::_write_alloc(int& size)
{
    int count = _write_count();

    // XXX deal with any outstanding writes
    if (err)
	return 0;

    ASSERT(writer.ptr <= writer.end);

    off_t off = write_offset();

    Byte* b = writer.ptr;
    writer.ptr += size;

    if (writer.ptr > writer.creg->limit)
    {
	int bsize = roundup(size, bufsize);
	Byte* oldbuffer = 0;

	/*
	 * If creg is in use, we must allocate a new region
	 */

	if (writer.creg->refcount != 0)
	{
	    writer.creg->limit = b;
	    writer.creg = new Region(writer.creg);
	    writer.creg->set_buf(new unsigned char[bsize], bsize);
	}
	else if (bsize != bufsize)
	{
	    oldbuffer = writer.creg->base;
	    writer.creg->set_buf(new unsigned char[bsize], bsize);
	} /* else reuse existing buffer and region */

	writer.creg->flush_off = writer.creg->off = off;

	if (count)
	    memmove(writer.creg->base, b, count);
	if (oldbuffer)
	    delete[] oldbuffer;
	b = writer.creg->base;
	writer.ptr = b + size;
	writer.end = b + count;
    }

    if (writer.ptr > writer.end)
	writer.end = writer.ptr;
    writer.creg->refcount++;
    return b;
}
Example #2
0
int main(int argc, char **argv)
{
	char offset_file[MAX_FILE_NAME];
	char *file_name, *prog;
	ino_t inode;
	off_t offset;

	prog = argv[0];

	if (argc != 2) {
		fprintf(stderr, "no filename specified\n");
		usage(prog);
		return 1;
	}

	file_name = argv[1];

	if (strlen(OFFSET_EXT) + strlen(file_name) + 1 > MAX_FILE_NAME) {
		fprintf(stderr, "%s: filename too long (max is %ld)\n",
			prog, MAX_FILE_NAME - strlen(OFFSET_EXT) - 1);
		return 1;
	}
	strncat(offset_file, file_name,
		sizeof(offset_file) - strlen(offset_file) - 1);
	strncat(offset_file, OFFSET_EXT,
		sizeof(offset_file) - strlen(offset_file) - 1);

	if (read_offset(offset_file, &inode, &offset) != 0) {
		fprintf(stderr, "%s: can't open offset file: %s\n",
			prog, strerror(errno));
		return 1;
	}

	if (print_logs(file_name, &inode, &offset) != 0) {
		fprintf(stderr, "%s: can't read '%s': %s\n",
			prog, file_name, strerror(errno));
		return 1;
	}

	if (write_offset(offset_file, inode, offset) != 0) {
		fprintf(stderr, "%s: can't write offset file: %s\n",
			prog, strerror(errno));
		return 1;
	}

	return 0;
}
Example #3
0
int
FSIO::_write_free(Byte* buf)
{
    Region** rp;
    Region* reg = writer.find(buf, rp);

    if (!reg || reg->refcount == 0)
    {
	err = EINVAL;
	return -1;
    }

    reg->refcount--;

    if (reg->refcount == 0)
    {
	if (reg == writer.creg)
	{
	    off_t off = write_offset();

	    writer.creg->limit = writer.end;
	    writer.creg = new Region(writer.creg);
	    writer.creg->set_buf(new unsigned char[bufsize], bufsize, off);
	    writer.ptr = writer.end = writer.creg->base;
	}

	if (_write_flush(reg) < 0)
	{
	    if (err)
		return -1;

	    return 0;
	}

	*rp = reg->next;
	delete[] reg->base;
	delete reg;
    }

    return 0;
}
Example #4
0
int main(void)
{
    message_t message;
    uint8_t next_grid[32];
    uint16_t interval = 150;
    uint8_t current_pattern = 0;

    initialise();
    set_up_timers();
    init_timers();
    HTbrightness(1);

    goto init;
    while (1) {
        if (mq_get(&message)) {
            switch (msg_get_event(message)) {
            case M_TIMER:
                memset(next_grid, 0, 32);
                for (uint8_t x = 0; x < 32; x++) {
                    for (uint8_t y = 0; y < 8; y++) {
                        uint8_t c = count(x, y);
                        if (c == 3)
                            next_grid[x] |= 1 << y;
                        else if (c == 4)
                            next_grid[x] |= leds[x] & (1 << y);
                    }
                }
                memcpy(leds, next_grid, 32);
                HTsendscreen();
                break;

            case M_KEY_DOWN:
            case M_KEY_REPEAT:
                switch (msg_get_param(message)) {
                case KEY_LEFT:
                    if (interval > MIN_INTERVAL) {
                        interval -= INTERVAL_INCREMENT;
                        set_timer(interval, 0, true);
                    }
                    break;

                case KEY_RIGHT:
                    if (interval < MAX_INTERVAL) {
                        interval += INTERVAL_INCREMENT;
                        set_timer(interval, 0, true);
                    }
                    break;

                case KEY_MIDDLE:
                    current_pattern = (current_pattern + 1) % (sizeof(patterns) / sizeof(character));
                init:
                    memset(leds, 0, 32);
                    write_offset(patterns[current_pattern], 10, 2);
                    HTsendscreen();
                    set_timer(interval, 0, true);
                    break;
                }
                break;
            }
        }
    }
}