Esempio n. 1
0
/* Output page causes file to get added to page queue for later rasterizing */
static int
gdev_prn_async_write_output_page(gx_device * pdev, int num_copies, int flush)
{
    gx_device_printer *const pwdev = (gx_device_printer *) pdev;
    gx_device_clist_writer *const pcwdev =
        &((gx_device_clist *) pdev)->writer;
    int flush_code;
    int add_code;
    int open_code;
    int one_last_time = 1;

    /* do NOT close files before sending to page queue */
    flush_code = clist_end_page(pcwdev);
    add_code = gx_page_queue_add_page(pcwdev, pwdev->page_queue,
                                (flush ? GX_PAGE_QUEUE_ACTION_FULL_PAGE :
                                 GX_PAGE_QUEUE_ACTION_COPY_PAGE),
                                      &pcwdev->page_info, num_copies);
    if (flush && (flush_code >= 0) && (add_code >= 0)) {
        /* This page is finished */
        gx_finish_output_page(pdev, num_copies, flush);
    }

    /* Open new band files to take the place of ones added to page queue */
    while ((open_code = (*gs_clist_device_procs.open_device)
            ((gx_device *) pdev)) == gs_error_VMerror) {
        /* Open failed, try after a page gets rendered */
        if (!gx_page_queue_wait_one_page(pwdev->page_queue)
            && one_last_time-- <= 0)
            break;
    }

    return
        (flush_code < 0 ? flush_code : open_code < 0 ? open_code :
         add_code < 0 ? add_code : 0);
}
Esempio n. 2
0
/* Wait for page queue to become empty */
void
gx_page_queue_wait_until_empty(
				  gx_page_queue_t * queue	/* page queue to wait on */
)
{
    while (gx_page_queue_wait_one_page(queue));
}
Esempio n. 3
0
/* Free bandlist memory waits until the rasterizer runs enough to free some mem */
static int			/* -ve err,  0 if no pages remain to rasterize, 1 if more pages to go */
gdev_prn_async_write_free_up_bandlist_memory(gx_device * pdev, bool flush_current)
{
    gx_device_printer *const pwdev = (gx_device_printer *) pdev;

    if (flush_current) {
        int code = flush_page(pwdev, true);

        if (code < 0)
            return code;
    }
    return gx_page_queue_wait_one_page(pwdev->page_queue);
}
Esempio n. 4
0
/* Even if an error is returned, entry will have been added to queue! */
int				/* rets 0 ok, gs_error_VMerror if error */
gx_page_queue_add_page(gx_device_clist_writer *const pcwdev,
			  gx_page_queue_t * queue,	/* page queue to add to */
			  gx_page_queue_action_t action,	/* action code to queue */
			  const gx_band_page_info_t * page_info,  /* bandinfo incl. bandlist (or 0) */
			  int page_count	/* see comments in gdevprna.c */
)
{
    int code = 0;

    /* Allocate a new page queue entry */
    gx_page_queue_entry_t *entry
    = gx_page_queue_entry_alloc(queue);

    if (!entry) {
	/* Use reserve page queue entry */
	gx_monitor_enter(queue->monitor);	/* not strictly necessary */
	entry = queue->reserve_entry;
	queue->reserve_entry = 0;
	gx_monitor_leave(queue->monitor);
    }
    /* Fill in page queue entry with info from device */
    entry->action = action;
    if (page_info != 0)
	entry->page_info = *page_info;
    else {
	entry->page_info = null_page_info;
	entry->page_info.io_procs = pcwdev->page_info.io_procs;
    }
    entry->num_copies = page_count;

    /* Stick onto page queue & signal */
    gx_page_queue_enqueue(entry);

    /* If a new reserve entry is needed, wait till enough mem is avail */
    while (!queue->reserve_entry) {
	queue->reserve_entry = gx_page_queue_entry_alloc(queue);
	if (!queue->reserve_entry && !gx_page_queue_wait_one_page(queue)) {
	    /* Should never happen: all pages rendered & still can't get memory: give up! */
	    code = gs_note_error(gs_error_Fatal);
	    break;
	}
    }
    return code;
}
Esempio n. 5
0
/* Flush any pending partial pages, re-open device */
static int
reopen_clist_after_flush(
                         gx_device_printer * pwdev	/* async writer device to flush */
)
{
    int open_code;
    int one_last_time = 1;

    /* Open new band files to take the place of ones added to page queue */
    while ((open_code = (*gs_clist_device_procs.open_device)
            ((gx_device *) pwdev)) == gs_error_VMerror) {
        /* Open failed, try after a page gets rendered */
        if (!gx_page_queue_wait_one_page(pwdev->page_queue)
            && one_last_time-- <= 0)
            break;
    }
    return open_code;
}