/* Deallocte dynamic memory attached to device. Aware of possible imcomplete open */ static void gdev_prn_dealloc(gx_device_printer * pwdev) { gx_device_printer *const prdev = pwdev->async_renderer; /* Delete renderer device & its memory allocator */ if (prdev) { gs_memory_t *render_alloc = prdev->memory; gs_free_object(render_alloc, prdev, "gdev_prn_dealloc"); free_render_memory(render_alloc); } /* Free page queue */ if (pwdev->page_queue) { gx_page_queue_dnit(pwdev->page_queue); gs_free_object(pwdev->bandlist_memory, pwdev->page_queue, "gdev_prn_dealloc"); pwdev->page_queue = 0; } /* Free memory bandlist allocators */ if (pwdev->bandlist_memory) free_bandlist_memory(pwdev->bandlist_memory); }
/* Initialize a gx_page_queue object */ int /* -ve error code, or 0 */ gx_page_queue_init( gx_page_queue_t * queue, /* page queue to init */ gs_memory_t * memory /* allocator for dynamic memory */ ) { queue->memory = memory; queue->monitor = gx_monitor_alloc(memory); /* alloc monitor to serialize */ queue->entry_count = 0; queue->dequeue_in_progress = false; queue->render_req_sema = gx_semaphore_alloc(memory); queue->enable_render_done_signal = false; queue->render_done_sema = gx_semaphore_alloc(memory); queue->first_in = queue->last_in = 0; queue->reserve_entry = gx_page_queue_entry_alloc(queue); if (queue->monitor && queue->render_req_sema && queue->render_done_sema && queue->reserve_entry) return 0; else { gx_page_queue_dnit(queue); return gs_error_VMerror; } }