channels/printer: remove usage of thread utils
This commit is contained in:
parent
996e7c5dbd
commit
75d4c70dd0
@ -415,6 +415,7 @@ static BOOL audin_server_close(audin_server_context* context)
|
|||||||
{
|
{
|
||||||
SetEvent(audin->stopEvent);
|
SetEvent(audin->stopEvent);
|
||||||
WaitForSingleObject(audin->thread, INFINITE);
|
WaitForSingleObject(audin->thread, INFINITE);
|
||||||
|
CloseHandle(audin->thread);
|
||||||
audin->thread = NULL;
|
audin->thread = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,9 +31,8 @@
|
|||||||
#include <winpr/interlocked.h>
|
#include <winpr/interlocked.h>
|
||||||
|
|
||||||
#include <winpr/stream.h>
|
#include <winpr/stream.h>
|
||||||
#include <freerdp/utils/thread.h>
|
|
||||||
#include <freerdp/utils/svc_plugin.h>
|
|
||||||
#include <freerdp/channels/rdpdr.h>
|
#include <freerdp/channels/rdpdr.h>
|
||||||
|
#include <freerdp/utils/svc_plugin.h>
|
||||||
|
|
||||||
#ifdef WITH_CUPS
|
#ifdef WITH_CUPS
|
||||||
#include "printer_cups.h"
|
#include "printer_cups.h"
|
||||||
@ -53,17 +52,21 @@ struct _PRINTER_DEVICE
|
|||||||
rdpPrinter* printer;
|
rdpPrinter* printer;
|
||||||
|
|
||||||
PSLIST_HEADER pIrpList;
|
PSLIST_HEADER pIrpList;
|
||||||
freerdp_thread* thread;
|
|
||||||
|
HANDLE event;
|
||||||
|
HANDLE stopEvent;
|
||||||
|
|
||||||
|
HANDLE thread;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void printer_process_irp_create(PRINTER_DEVICE* printer_dev, IRP* irp)
|
static void printer_process_irp_create(PRINTER_DEVICE* printer_dev, IRP* irp)
|
||||||
{
|
{
|
||||||
rdpPrintJob* printjob = NULL;
|
rdpPrintJob* printjob = NULL;
|
||||||
|
|
||||||
if (printer_dev->printer != NULL)
|
if (printer_dev->printer)
|
||||||
printjob = printer_dev->printer->CreatePrintJob(printer_dev->printer, irp->devman->id_sequence++);
|
printjob = printer_dev->printer->CreatePrintJob(printer_dev->printer, irp->devman->id_sequence++);
|
||||||
|
|
||||||
if (printjob != NULL)
|
if (printjob)
|
||||||
{
|
{
|
||||||
stream_write_UINT32(irp->output, printjob->id); /* FileId */
|
stream_write_UINT32(irp->output, printjob->id); /* FileId */
|
||||||
|
|
||||||
@ -87,7 +90,7 @@ static void printer_process_irp_close(PRINTER_DEVICE* printer_dev, IRP* irp)
|
|||||||
if (printer_dev->printer != NULL)
|
if (printer_dev->printer != NULL)
|
||||||
printjob = printer_dev->printer->FindPrintJob(printer_dev->printer, irp->FileId);
|
printjob = printer_dev->printer->FindPrintJob(printer_dev->printer, irp->FileId);
|
||||||
|
|
||||||
if (printjob == NULL)
|
if (!printjob)
|
||||||
{
|
{
|
||||||
irp->IoStatus = STATUS_UNSUCCESSFUL;
|
irp->IoStatus = STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
@ -115,10 +118,10 @@ static void printer_process_irp_write(PRINTER_DEVICE* printer_dev, IRP* irp)
|
|||||||
stream_read_UINT64(irp->input, Offset);
|
stream_read_UINT64(irp->input, Offset);
|
||||||
stream_seek(irp->input, 20); /* Padding */
|
stream_seek(irp->input, 20); /* Padding */
|
||||||
|
|
||||||
if (printer_dev->printer != NULL)
|
if (printer_dev->printer)
|
||||||
printjob = printer_dev->printer->FindPrintJob(printer_dev->printer, irp->FileId);
|
printjob = printer_dev->printer->FindPrintJob(printer_dev->printer, irp->FileId);
|
||||||
|
|
||||||
if (printjob == NULL)
|
if (!printjob)
|
||||||
{
|
{
|
||||||
irp->IoStatus = STATUS_UNSUCCESSFUL;
|
irp->IoStatus = STATUS_UNSUCCESSFUL;
|
||||||
Length = 0;
|
Length = 0;
|
||||||
@ -162,15 +165,20 @@ static void printer_process_irp(PRINTER_DEVICE* printer_dev, IRP* irp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printer_process_irp_list(PRINTER_DEVICE* printer_dev)
|
static void* printer_thread_func(void* arg)
|
||||||
{
|
{
|
||||||
IRP* irp;
|
IRP* irp;
|
||||||
|
PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*) arg;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (freerdp_thread_is_stopped(printer_dev->thread))
|
WaitForSingleObject(printer_dev->event, INFINITE);
|
||||||
|
|
||||||
|
if (WaitForSingleObject(printer_dev->stopEvent, 0) == WAIT_OBJECT_0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
ResetEvent(printer_dev->event);
|
||||||
|
|
||||||
irp = (IRP*) InterlockedPopEntrySList(printer_dev->pIrpList);
|
irp = (IRP*) InterlockedPopEntrySList(printer_dev->pIrpList);
|
||||||
|
|
||||||
if (irp == NULL)
|
if (irp == NULL)
|
||||||
@ -178,24 +186,6 @@ static void printer_process_irp_list(PRINTER_DEVICE* printer_dev)
|
|||||||
|
|
||||||
printer_process_irp(printer_dev, irp);
|
printer_process_irp(printer_dev, irp);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static void* printer_thread_func(void* arg)
|
|
||||||
{
|
|
||||||
PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*)arg;
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
freerdp_thread_wait(printer_dev->thread);
|
|
||||||
|
|
||||||
if (freerdp_thread_is_stopped(printer_dev->thread))
|
|
||||||
break;
|
|
||||||
|
|
||||||
freerdp_thread_reset(printer_dev->thread);
|
|
||||||
printer_process_irp_list(printer_dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
freerdp_thread_quit(printer_dev->thread);
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -206,7 +196,7 @@ static void printer_irp_request(DEVICE* device, IRP* irp)
|
|||||||
|
|
||||||
InterlockedPushEntrySList(printer_dev->pIrpList, &(irp->ItemEntry));
|
InterlockedPushEntrySList(printer_dev->pIrpList, &(irp->ItemEntry));
|
||||||
|
|
||||||
freerdp_thread_signal(printer_dev->thread);
|
SetEvent(printer_dev->event);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printer_free(DEVICE* device)
|
static void printer_free(DEVICE* device)
|
||||||
@ -214,8 +204,9 @@ static void printer_free(DEVICE* device)
|
|||||||
IRP* irp;
|
IRP* irp;
|
||||||
PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*) device;
|
PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*) device;
|
||||||
|
|
||||||
freerdp_thread_stop(printer_dev->thread);
|
SetEvent(printer_dev->stopEvent);
|
||||||
freerdp_thread_free(printer_dev->thread);
|
WaitForSingleObject(printer_dev->thread, INFINITE);
|
||||||
|
CloseHandle(printer_dev->thread);
|
||||||
|
|
||||||
while ((irp = (IRP*) InterlockedPopEntrySList(printer_dev->pIrpList)) != NULL)
|
while ((irp = (IRP*) InterlockedPopEntrySList(printer_dev->pIrpList)) != NULL)
|
||||||
irp->Discard(irp);
|
irp->Discard(irp);
|
||||||
@ -292,11 +283,13 @@ void printer_register(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, rdpPrinter* pri
|
|||||||
printer_dev->pIrpList = (PSLIST_HEADER) _aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT);
|
printer_dev->pIrpList = (PSLIST_HEADER) _aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT);
|
||||||
InitializeSListHead(printer_dev->pIrpList);
|
InitializeSListHead(printer_dev->pIrpList);
|
||||||
|
|
||||||
printer_dev->thread = freerdp_thread_new();
|
printer_dev->event = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
|
printer_dev->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
|
|
||||||
pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) printer_dev);
|
pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) printer_dev);
|
||||||
|
|
||||||
freerdp_thread_start(printer_dev->thread, printer_thread_func, printer_dev);
|
printer_dev->thread = CreateThread(NULL, 0,
|
||||||
|
(LPTHREAD_START_ROUTINE) printer_thread_func, (void*) printer_dev, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef STATIC_CHANNELS
|
#ifdef STATIC_CHANNELS
|
||||||
@ -316,6 +309,7 @@ int DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints)
|
|||||||
#ifdef WITH_CUPS
|
#ifdef WITH_CUPS
|
||||||
driver = printer_cups_get_driver();
|
driver = printer_cups_get_driver();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
driver = printer_win_get_driver();
|
driver = printer_win_get_driver();
|
||||||
#endif
|
#endif
|
||||||
@ -334,7 +328,7 @@ int DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints)
|
|||||||
{
|
{
|
||||||
printer = driver->GetPrinter(driver, name);
|
printer = driver->GetPrinter(driver, name);
|
||||||
|
|
||||||
if (printer == NULL)
|
if (!printer)
|
||||||
{
|
{
|
||||||
DEBUG_WARN("printer %s not found.", name);
|
DEBUG_WARN("printer %s not found.", name);
|
||||||
return 1;
|
return 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user