update time related function.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1091 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
cb72c44e5a
commit
cf85a6688f
|
@ -1,20 +1,7 @@
|
|||
Import('RTT_ROOT')
|
||||
from building import *
|
||||
|
||||
src = Split('''
|
||||
clock_time.c
|
||||
pthread.c
|
||||
pthread_attr.c
|
||||
pthread_barrier.c
|
||||
pthread_cond.c
|
||||
pthread_internal.c
|
||||
pthread_mutex.c
|
||||
pthread_rwlock.c
|
||||
pthread_spin.c
|
||||
pthread_tls.c
|
||||
sched.c
|
||||
semaphore.c
|
||||
''')
|
||||
src = Glob('*.c')
|
||||
CPPPATH = [RTT_ROOT + '/components/pthreads']
|
||||
group = DefineGroup('pthreads', src, depend = ['RT_USING_PTHREADS'], CPPPATH = CPPPATH)
|
||||
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
#include <rtthread.h>
|
||||
#include "pthread_internal.h"
|
||||
#include <time.h>
|
||||
|
||||
int clock_getres(clockid_t clock_id, struct timespec *res)
|
||||
{
|
||||
if ((clock_id != CLOCK_REALTIME) || (res == RT_NULL))
|
||||
{
|
||||
rt_set_errno(EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
res->tv_sec = 0;
|
||||
res->tv_nsec = NSEC_PER_TICK;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int clock_gettime(clockid_t clock_id, struct timespec *tp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int clock_settime(clockid_t clock_id, const struct timespec *tp)
|
||||
{
|
||||
return 0;
|
||||
}
|
|
@ -1,7 +1,10 @@
|
|||
#include "mqueue.h"
|
||||
#include <stdargs.h>
|
||||
#include "pthread_internal.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat,
|
||||
struct mq_attr *omqstat)
|
||||
{
|
||||
|
@ -103,13 +106,13 @@ ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len,
|
|||
rt_set_errno(EINVAL);
|
||||
return -1;
|
||||
}
|
||||
tick = time_to_tick(abs_timeout);
|
||||
tick = libc_time_to_tick(abs_timeout);
|
||||
|
||||
result = rt_mq_recv(mqdes, msg_ptr, msg_len, tick);
|
||||
if (result == RT_EOK) return msg_len;
|
||||
|
||||
if (result == -RT_ETIMEOUT)
|
||||
rt_set_errno(ETIMEOUT);
|
||||
rt_set_errno(ETIMEDOUT);
|
||||
else
|
||||
rt_set_errno(EBADMSG);
|
||||
|
||||
|
@ -125,7 +128,7 @@ int mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_
|
|||
|
||||
int mq_notify(mqd_t mqdes, const struct sigevent *notification)
|
||||
{
|
||||
rt_set_errno(-RT_ERROT);
|
||||
rt_set_errno(-RT_ERROR);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -145,6 +148,7 @@ int mq_unlink(const char *name)
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* delete this message queue */
|
||||
rt_mq_delete(mq);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
#include <rtthread.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
#include <signal.h>
|
||||
#include <sys/signal.h>
|
||||
#include <pthread.h>
|
||||
|
||||
typedef rt_mq_t mqd_t;
|
||||
struct mq_attr
|
||||
|
|
|
@ -237,5 +237,22 @@ int pthread_barrier_init(pthread_barrier_t *barrier,
|
|||
|
||||
int pthread_barrier_wait(pthread_barrier_t *barrier);
|
||||
|
||||
/* Signal Generation and Delivery, P1003.1b-1993, p. 63
|
||||
NOTE: P1003.1c/D10, p. 34 adds sigev_notify_function and
|
||||
sigev_notify_attributes to the sigevent structure. */
|
||||
union sigval {
|
||||
int sival_int; /* Integer signal value */
|
||||
void *sival_ptr; /* Pointer signal value */
|
||||
};
|
||||
|
||||
struct sigevent {
|
||||
int sigev_notify; /* Notification type */
|
||||
int sigev_signo; /* Signal number */
|
||||
union sigval sigev_value; /* Signal value */
|
||||
void (*sigev_notify_function)( union sigval );
|
||||
/* Notification function */
|
||||
pthread_attr_t *sigev_notify_attributes; /* Notification Attributes */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -166,11 +166,10 @@ int pthread_cond_timedwait(pthread_cond_t *cond,
|
|||
pthread_mutex_t * mutex,
|
||||
const struct timespec *abstime)
|
||||
{
|
||||
rt_int32_t timeout;
|
||||
int timeout;
|
||||
rt_err_t result;
|
||||
|
||||
timeout = abstime->tv_sec * RT_TICK_PER_SECOND +
|
||||
abstime->tv_nsec * RT_TICK_PER_SECOND/1000000000;
|
||||
timeout = libc_time_to_tick(abstime);
|
||||
result = _pthread_cond_timedwait(cond, mutex, timeout);
|
||||
if (result == RT_EOK) return 0;
|
||||
if (result == -RT_ETIMEOUT) return ETIMEDOUT;
|
||||
|
|
|
@ -53,6 +53,6 @@ rt_inline _pthread_data_t* _pthread_get_data(pthread_t thread)
|
|||
return (_pthread_data_t*)thread->user_data;
|
||||
}
|
||||
|
||||
#define NSEC_PER_TICK (1000000000UL/RT_TICK_PER_SECOND)
|
||||
extern int libc_time_to_tick(const struct timespec *time);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -93,7 +93,7 @@ int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout)
|
|||
if (!sem || !abs_timeout) return EINVAL;
|
||||
|
||||
/* calculate os tick */
|
||||
tick = abs_timeout->tv_sec/RT_TICK_PER_SECOND + (abs_timeout->tv_nsec/1000) * (1000/RT_TICK_PER_SECOND);
|
||||
tick = libc_time_to_tick(abs_timeout);
|
||||
|
||||
result = rt_sem_take(sem, tick);
|
||||
if (result == -RT_ETIMEOUT) return ETIMEDOUT;
|
||||
|
|
Loading…
Reference in New Issue