Use the service thread for comm notifications.
diff --git a/misc/comm.c b/misc/comm.c
index 25b5a7c..78bb93e 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -64,7 +64,8 @@
#include "server.h"
#include "process.h"
#include "winerror.h"
-#include "async.h"
+#include "services.h"
+#include "file.h"
#include "debugtools.h"
@@ -213,12 +214,12 @@
return ioctl(fd, TIOCMSET, &mstat);
}
-static void comm_notification(int fd,void*private)
+static void CALLBACK comm_notification( ULONG_PTR private )
{
struct DosDeviceStruct *ptr = (struct DosDeviceStruct *)private;
int prev, bleft, len;
WORD mask = 0;
- int cid = GetCommPort_fd(fd);
+ int cid = GetCommPort_fd(ptr->fd);
TRACE("async notification\n");
/* read data from comm port */
@@ -226,7 +227,7 @@
do {
bleft = ((ptr->ibuf_tail > ptr->ibuf_head) ? (ptr->ibuf_tail-1) : ptr->ibuf_size)
- ptr->ibuf_head;
- len = read(fd, ptr->inbuf + ptr->ibuf_head, bleft?bleft:1);
+ len = read(ptr->fd, ptr->inbuf + ptr->ibuf_head, bleft?bleft:1);
if (len > 0) {
if (!bleft) {
ptr->commerror = CE_RXOVER;
@@ -257,7 +258,7 @@
/* write any TransmitCommChar character */
if (ptr->xmit>=0) {
- len = write(fd, &(ptr->xmit), 1);
+ len = write(ptr->fd, &(ptr->xmit), 1);
if (len > 0) ptr->xmit = -1;
}
/* write from output queue */
@@ -265,7 +266,7 @@
do {
bleft = ((ptr->obuf_tail <= ptr->obuf_head) ? ptr->obuf_head : ptr->obuf_size)
- ptr->obuf_tail;
- len = bleft ? write(fd, ptr->outbuf + ptr->obuf_tail, bleft) : 0;
+ len = bleft ? write(ptr->fd, ptr->outbuf + ptr->obuf_tail, bleft) : 0;
if (len > 0) {
ptr->obuf_tail += len;
if (ptr->obuf_tail >= ptr->obuf_size)
@@ -455,10 +456,12 @@
return IE_MEMORY;
}
- /* enable async notifications */
- ASYNC_RegisterFD(COM[port].fd,comm_notification,&COM[port]);
+ COM[port].service = SERVICE_AddObject( FILE_DupUnixHandle( COM[port].fd,
+ GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE ),
+ comm_notification,
+ (ULONG_PTR)&COM[port] );
/* bootstrap notifications, just in case */
- comm_notification(COM[port].fd,&COM[port]);
+ comm_notification( (ULONG_PTR)&COM[port] );
return port;
}
}
@@ -499,8 +502,7 @@
/* COM port */
SEGPTR_FREE(unknown[cid]); /* [LW] */
- /* disable async notifications */
- ASYNC_UnregisterFD(COM[cid].fd,comm_notification);
+ SERVICE_Delete( COM[cid].service );
/* free buffers */
free(ptr->outbuf);
free(ptr->inbuf);