From ff1eb2cbc9b7bb146cae957d15cccfb67285d57e Mon Sep 17 00:00:00 2001 From: Grissiom Date: Sun, 13 Jul 2014 18:26:48 +0800 Subject: [PATCH] ymodem: refactor _rym_read_code Make fast path fast and slow path slow. --- components/utilities/ymodem/ymodem.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/components/utilities/ymodem/ymodem.c b/components/utilities/ymodem/ymodem.c index fdd1950cc..f5ebeab83 100644 --- a/components/utilities/ymodem/ymodem.c +++ b/components/utilities/ymodem/ymodem.c @@ -70,18 +70,23 @@ static enum rym_code _rym_read_code( struct rym_ctx *ctx, rt_tick_t timeout) { - /* consume the available sem and read the data in buffer if possible */ - while (rt_sem_trytake(&ctx->sem) == RT_EOK) - ; + /* Fast path */ if (rt_device_read(ctx->dev, 0, ctx->buf, 1) == 1) return *ctx->buf; - /* no data yet, wait for one */ - if (rt_sem_take(&ctx->sem, timeout) != RT_EOK) - return RYM_CODE_NONE; - /* read one */ - if (rt_device_read(ctx->dev, 0, ctx->buf, 1) == 1) - return *ctx->buf; - return RYM_CODE_NONE; + + /* Slow path */ + do { + rt_size_t rsz; + + /* No data yet, wait for one */ + if (rt_sem_take(&ctx->sem, timeout) != RT_EOK) + return RYM_CODE_NONE; + + /* Try to read one */ + rsz = rt_device_read(ctx->dev, 0, ctx->buf, 1); + if (rsz == 1) + return *ctx->buf; + } while (1); } /* the caller should at least alloc _RYM_STX_PKG_SZ buffer */