From 472cc9334ac63bdd041f83e884757c75a30651c7 Mon Sep 17 00:00:00 2001 From: "bernard.xiong@gmail.com" Date: Sun, 28 Aug 2011 15:57:10 +0000 Subject: [PATCH] add errno implementation in RT-Thread. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1682 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- components/net/lwip/src/lwipopts.h | 2 -- include/rtthread.h | 6 ++++++ src/kservice.c | 27 ++++++++++++++++++++++----- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/components/net/lwip/src/lwipopts.h b/components/net/lwip/src/lwipopts.h index a706d386ab..1e8ebf37f3 100644 --- a/components/net/lwip/src/lwipopts.h +++ b/components/net/lwip/src/lwipopts.h @@ -3,9 +3,7 @@ #include -#if defined(RT_USING_NEWLIB) || defined(RT_USING_MINILIBC) #define ERRNO 1 -#endif #define NO_SYS 0 #define LWIP_SOCKET 1 diff --git a/include/rtthread.h b/include/rtthread.h index 417c86afee..08923f7a32 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -365,6 +365,12 @@ void rt_kprintf(const char *fmt, ...); rt_err_t rt_get_errno(void); void rt_set_errno(rt_err_t no); +int *_rt_errno(void); +#ifndef RT_USING_NEWLIB +#ifndef errno +#define errno *_rt_errno() +#endif +#endif void* rt_memset(void *src, int c, rt_ubase_t n); void* rt_memcpy(void *dest, const void *src, rt_ubase_t n); diff --git a/src/kservice.c b/src/kservice.c index 10d2807082..70a8e9060a 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -27,7 +27,7 @@ #ifndef RT_USING_NEWLIB /* global errno in RT-Thread*/ -volatile int errno; +static volatile int _errno; #else #include #endif @@ -47,11 +47,11 @@ rt_err_t rt_get_errno(void) if(rt_interrupt_get_nest() != 0) { /* it's in interrupt context */ - return errno; + return _errno; } tid = rt_thread_self(); - if (tid == RT_NULL) return errno; + if (tid == RT_NULL) return _errno; return tid->error; } @@ -68,16 +68,33 @@ void rt_set_errno(rt_err_t error) if(rt_interrupt_get_nest() != 0) { /* it's in interrupt context */ - errno = error; + _errno = error; return; } tid = rt_thread_self(); - if (tid == RT_NULL) { errno = error; return; } + if (tid == RT_NULL) { _errno = error; return; } tid->error = error; } +/** + * This function returns errno. + * + * @return the errno in the system + */ +int *_rt_errno(void) +{ + rt_thread_t tid; + + if (rt_interrupt_get_nest() != 0) return (int *)&_errno; + + tid = rt_thread_self(); + if (tid != RT_NULL) return (int *)&(tid->error); + + return (int *)&_errno; +} + /** * This function will set the content of memory to specified value * -- GitLab