X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/34292b1daab0fcd6ce02627497117d01aaa39a19..c969e831c5977919d3e1c094acc86e194c50d17c:/windows/winhandl.c diff --git a/windows/winhandl.c b/windows/winhandl.c index 305f9971..a5b7c696 100644 --- a/windows/winhandl.c +++ b/windows/winhandl.c @@ -18,13 +18,6 @@ * when one completes. */ -/* - * TODO: - * - * - could do with some sort of private-data field in each handle - * structure. - */ - #include #include "putty.h" @@ -58,6 +51,7 @@ struct handle_generic { int done; /* request subthread to terminate */ int defunct; /* has the subthread already gone? */ int busy; /* operation currently in progress? */ + void *privdata; /* for client to remember who they are */ }; /* ---------------------------------------------------------------------- @@ -78,6 +72,7 @@ struct handle_input { int done; /* request subthread to terminate */ int defunct; /* has the subthread already gone? */ int busy; /* operation currently in progress? */ + void *privdata; /* for client to remember who they are */ /* * Data set by the input thread before signalling ev_to_main, @@ -165,6 +160,7 @@ struct handle_output { int done; /* request subthread to terminate */ int defunct; /* has the subthread already gone? */ int busy; /* operation currently in progress? */ + void *privdata; /* for client to remember who they are */ /* * Data set by the main thread before signalling ev_from_main, @@ -267,7 +263,8 @@ static int handle_find_evtomain(void *av, void *bv) return 0; } -struct handle *handle_input_new(HANDLE handle, handle_inputfn_t gotdata) +struct handle *handle_input_new(HANDLE handle, handle_inputfn_t gotdata, + void *privdata) { struct handle *h = snew(struct handle); @@ -276,10 +273,10 @@ struct handle *handle_input_new(HANDLE handle, handle_inputfn_t gotdata) h->u.i.ev_to_main = CreateEvent(NULL, FALSE, FALSE, NULL); h->u.i.ev_from_main = CreateEvent(NULL, FALSE, FALSE, NULL); h->u.i.gotdata = gotdata; - h->u.i.busy = FALSE; h->u.i.defunct = FALSE; h->u.i.moribund = FALSE; h->u.i.done = FALSE; + h->u.i.privdata = privdata; if (!handles_by_evtomain) handles_by_evtomain = newtree234(handle_cmp_evtomain); @@ -287,13 +284,13 @@ struct handle *handle_input_new(HANDLE handle, handle_inputfn_t gotdata) CreateThread(NULL, 0, handle_input_threadfunc, &h->u.i, 0, NULL); - - handle_throttle(&h->u.i, 0); /* start first read operation */ + h->u.i.busy = TRUE; return h; } -struct handle *handle_output_new(HANDLE handle, handle_outputfn_t sentdata) +struct handle *handle_output_new(HANDLE handle, handle_outputfn_t sentdata, + void *privdata) { struct handle *h = snew(struct handle); @@ -305,6 +302,7 @@ struct handle *handle_output_new(HANDLE handle, handle_outputfn_t sentdata) h->u.o.defunct = FALSE; h->u.o.moribund = FALSE; h->u.o.done = FALSE; + h->u.o.privdata = privdata; bufchain_init(&h->u.o.queued_data); h->u.o.sentdata = sentdata; @@ -393,6 +391,7 @@ void handle_free(struct handle *h) */ h->u.g.moribund = TRUE; h->u.g.done = TRUE; + h->u.g.busy = TRUE; SetEvent(h->u.g.ev_from_main); } } @@ -426,6 +425,7 @@ void handle_got_event(HANDLE event) handle_destroy(h); } else { h->u.g.done = TRUE; + h->u.g.busy = TRUE; SetEvent(h->u.g.ev_from_main); } return; @@ -484,3 +484,8 @@ int handle_backlog(struct handle *h) assert(h->output); return bufchain_size(&h->u.o.queued_data); } + +void *handle_get_privdata(struct handle *h) +{ + return h->u.g.privdata; +}