void SvgSubprocessCharacterGenerator::run_thread( ) {
    RawFrame *frame;
    size_t svg_size;
    uint8_t alpha;
    char *svg_data;
    
    /* fork subprocess */
    do_fork( );

    for (;;) {
        /* request a SVG from the subprocess */
        request( );

        /* get the SVG */
        svg_size = read_item_from_fd<uint32_t>(recv_fd);
        alpha = read_item_from_fd<uint8_t>(recv_fd);
        _dirty_level = read_item_from_fd<uint8_t>(recv_fd);

        if (svg_size > 0) {
            svg_data = read_svg(svg_size);

            /* render SVG to frame */
            frame = RsvgFrame::render_svg(svg_data, svg_size);
            frame->set_global_alpha(alpha);
            free(svg_data);

            /* put frame down the pipe */
            _output_pipe.put(frame);
        } else {
            _output_pipe.put(NULL);
        }
    }
}
void SvgSubprocessCharacterGenerator::run_thread( ) {
    size_t svg_size;
    char *svg_data;
    
    /* fork subprocess */
    do_fork( );

    for (;;) {
        /* request a SVG from the subprocess */
        request( );

        /* get the SVG */
        svg_size = read_item_from_fd<uint32_t>(recv_fd);
        _alpha = read_item_from_fd<uint8_t>(recv_fd);
        _dirty_level = read_item_from_fd<uint8_t>(recv_fd);

        if (svg_size > 0) {
            svg_data = read_svg(svg_size);

            /* render SVG to frame */
            {
            	MutexLock lock(mut);
				RawFrame* old_old_frame = _old_frame;
				_old_frame = _frame;
				_frame = RsvgFrame::render_svg(svg_data, svg_size);
				_frame->set_global_alpha(_alpha);
				delete old_old_frame;
            }
            free(svg_data);

//            fprintf(stderr, "frame rendered: %zx %x %x\n",
//        		svg_size, _alpha, _dirty_level);

            /* put frame down the pipe */
            _output_pipe.put(_frame);
        } else {
            _output_pipe.put(NULL);
        }
    }
}