From 681a45beecef09e52f3ddc77e38d9b50b96f587d Mon Sep 17 00:00:00 2001 From: midipix Date: Jun 08 2020 14:22:12 +0000 Subject: daemon: implement the waiter queue as a true FIFO. --- diff --git a/src/daemon/toks_daemon_acquire.c b/src/daemon/toks_daemon_acquire.c index 6d89331..af262ac 100644 --- a/src/daemon/toks_daemon_acquire.c +++ b/src/daemon/toks_daemon_acquire.c @@ -152,25 +152,25 @@ static int32_t toks_daemon_queue(struct toks_daemon_ctx * dctx) { int nwaiters; struct toks_waiter * waiter; - struct toks_waiter * waiters; nt_tty_port_msg * msg; - int i; msg = &dctx->reply; - waiters = toks_get_driver_waiters(dctx->driver_ctx); nwaiters = toks_get_driver_nwaiters(dctx->driver_ctx); if (nwaiters == TOKS_MAX_WAITERS) return NT_STATUS_TIMEOUT; - for (i=0, waiter=0; !waiter && (iwaiter_next; toks_set_driver_nwaiters( dctx->driver_ctx, ++nwaiters); + dctx->waiter_next++; + + if (dctx->waiter_next == dctx->waiter_cap) + dctx->waiter_next = dctx->waiter_base; + ntapi->tt_generic_memcpy( &waiter->msg,msg, sizeof(*msg)); @@ -281,5 +281,4 @@ int32_t __stdcall toks_daemon_acquire(struct toks_daemon_ctx * dctx) } return NT_STATUS_SUCCESS; - } diff --git a/src/daemon/toks_daemon_release.c b/src/daemon/toks_daemon_release.c index 2a91214..fbaffe1 100644 --- a/src/daemon/toks_daemon_release.c +++ b/src/daemon/toks_daemon_release.c @@ -24,23 +24,32 @@ static void toks_daemon_token_reset(struct toks_token * token) static int32_t toks_daemon_unqueue(struct toks_daemon_ctx * dctx) { + int status; int nwaiters; struct toks_waiter * waiter; - struct toks_waiter * waiters; nt_tty_port_msg * msg; nt_tty_port_msg cmsg; - int i; msg = &dctx->reply; - waiters = toks_get_driver_waiters(dctx->driver_ctx); nwaiters = toks_get_driver_nwaiters(dctx->driver_ctx); if (nwaiters == 0) return NT_STATUS_SUCCESS; - for (i=0, waiter=0; !waiter && (iwaiter_first; + + toks_set_driver_nwaiters( + dctx->driver_ctx, + --nwaiters); + + dctx->waiter_first++; + + if (dctx->waiter_first == dctx->waiter_cap) + dctx->waiter_first = dctx->waiter_base; + + ntapi->tt_generic_memcpy( &cmsg,msg, @@ -50,13 +59,8 @@ static int32_t toks_daemon_unqueue(struct toks_daemon_ctx * dctx) msg,&waiter->msg, sizeof(*msg)); - toks_set_driver_nwaiters( - dctx->driver_ctx, - --nwaiters); - - waiter->msg.header.msg_id = 0; - - msg->ttyinfo.status = toks_daemon_acquire(dctx); + status = toks_daemon_acquire(dctx); + msg->ttyinfo.status = status; msg->ttyinfo.exarg = waiter; ntapi->zw_reply_port( @@ -67,7 +71,7 @@ static int32_t toks_daemon_unqueue(struct toks_daemon_ctx * dctx) msg,&cmsg, sizeof(*msg)); - return NT_STATUS_SUCCESS; + return status; } int32_t __stdcall toks_daemon_release(struct toks_daemon_ctx * dctx) diff --git a/src/driver/toks_driver_ctx.c b/src/driver/toks_driver_ctx.c index 3a1a359..44fd9ef 100644 --- a/src/driver/toks_driver_ctx.c +++ b/src/driver/toks_driver_ctx.c @@ -383,12 +383,19 @@ int toks_get_driver_ctx( ctx->ctx.cctx = &ctx->cctx; ctx->cctx.uuid = &ctx->uuid; - toks_daemon_ctx.driver_ctx = &ctx->ctx; - if (cctx.drvflags & TOKS_DRIVER_MODE_SERVER) { - if (!(ctx->waiters = toks_calloc(TOKS_MAX_WAITERS,sizeof(*ctx->waiters)))) + if (!(ctx->waiters = toks_calloc( + TOKS_MAX_WAITERS, + sizeof(struct toks_waiter)))) return toks_get_driver_ctx_fail(meta); + toks_daemon_ctx.driver_ctx = &ctx->ctx; + toks_daemon_ctx.waiter_base = ctx->waiters; + toks_daemon_ctx.waiter_first = ctx->waiters; + toks_daemon_ctx.waiter_next = ctx->waiters; + toks_daemon_ctx.waiter_cap = &ctx->waiters[TOKS_MAX_WAITERS]; + + if (!(ctx->tokens = toks_calloc(ntokens,sizeof(*ctx->tokens)))) return toks_get_driver_ctx_fail(meta); diff --git a/src/internal/toksvc_daemon_impl.h b/src/internal/toksvc_daemon_impl.h index e976c01..548f536 100644 --- a/src/internal/toksvc_daemon_impl.h +++ b/src/internal/toksvc_daemon_impl.h @@ -46,6 +46,11 @@ typedef int32_t __stdcall toks_daemon_routine(struct toks_daemon_ctx *); struct toks_daemon_ctx { struct toks_driver_ctx *driver_ctx; + struct toks_waiter * waiter_base; + struct toks_waiter * waiter_first; + struct toks_waiter * waiter_next; + struct toks_waiter * waiter_cap; + nt_port_keys daemon_keys; nt_port_attr daemon_attr; nt_port_name daemon_name; diff --git a/src/internal/toksvc_driver_impl.h b/src/internal/toksvc_driver_impl.h index 7908a41..d4d1568 100644 --- a/src/internal/toksvc_driver_impl.h +++ b/src/internal/toksvc_driver_impl.h @@ -151,13 +151,6 @@ static inline const nt_guid * toks_get_driver_uuid(const struct toks_driver_ctx return &ictx->uuid; } -static inline struct toks_waiter * toks_get_driver_waiters(const struct toks_driver_ctx * dctx) -{ - struct toks_driver_ctx_impl * ictx; - ictx = toks_get_driver_ictx(dctx); - return ictx->waiters; -} - static inline int toks_get_driver_nwaiters(const struct toks_driver_ctx * dctx) { struct toks_driver_ctx_impl * ictx;