del old ipc code && sema support timeout

This commit is contained in:
zhangzheng
2025-02-13 11:18:19 +08:00
parent 00804aaaaa
commit f86daa3169
55 changed files with 359 additions and 182 deletions

4
.vscode/launch.json vendored
View File

@@ -71,8 +71,8 @@
// "miDebuggerPath": "/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gdb",
// "miDebuggerPath": "/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb",
// "miDebuggerPath": "/home/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb",
// "miDebuggerPath": "/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb",
"miDebuggerPath": "/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/arm-none-eabi-gdb",
"miDebuggerPath": "/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb",
// "miDebuggerPath": "/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/arm-none-eabi-gdb",
"miDebuggerServerAddress": "127.0.0.1:33333",
"MIMode": "gdb",
"setupCommands": [

View File

@@ -32,7 +32,7 @@ CONFIG_FD_MAP_ROW_NR=16
#
# Sys util config
#
CONFIG_USING_SIG=y
CONFIG_USING_SIG=n
CONFIG_SIG_THREAD_STACK_SIZE=512
CONFIG_SIG_THREAD_PRIO=3
# end of Sys util config

View File

@@ -32,7 +32,7 @@ CONFIG_FD_MAP_ROW_NR=16
#
# Sys util config
#
CONFIG_USING_SIG=y
CONFIG_USING_SIG=n
CONFIG_SIG_THREAD_STACK_SIZE=512
CONFIG_SIG_THREAD_PRIO=3
# end of Sys util config

View File

@@ -59,14 +59,11 @@ add_dependencies(mkrtos_img_dump
bootstrap_dump
mkrtos_dump
init_dump
nes_dump
# app_dump
shell_dump
# fatfs_dump
appfs_dump
vi_dump
tst_dump
eth_dump
net_dump
# tcc_dump
# eth_dump
# nes_dump
# net_dump
)

View File

@@ -104,7 +104,7 @@ void MemManage_Handler(void)
}
// printk("instr || data 0x%x access is error.\n", fault_addr);
if (task_vma_page_fault(&(thread_get_current_task()->mm_space.mem_vma),
fault_addr, NULL) < 0)
fault_addr & (~(sizeof(void *) - 1)), NULL) < 0)
{
printk("[semgement fault] task:0x%x, mem_addr:0x%lx bus_addr:0x%lx .\n",
thread_get_current_task(), fault_addr, bus_addr);

View File

@@ -57,7 +57,7 @@ void MemManage_Handler(void)
}
// printk("instr || data 0x%x access is error.\n", fault_addr);
if (task_vma_page_fault(&(thread_get_current_task()->mm_space.mem_vma),
fault_addr, NULL) < 0)
fault_addr & (~(sizeof(void *) - 1)), NULL) < 0)
{
printk("[semgement fault] task:0x%x, mem_addr:0x%lx bus_addr:0x%lx .\n",
thread_get_current_task(), fault_addr, bus_addr);

View File

@@ -99,7 +99,7 @@ void MemManage_Handler(void)
}
// printk("instr || data 0x%x access is error.\n", fault_addr);
if (task_vma_page_fault(&(thread_get_current_task()->mm_space.mem_vma),
fault_addr, NULL) < 0)
fault_addr & (~(sizeof(void *) - 1)), NULL) < 0)
{
printk("[semgement fault] task:0x%x, mem_addr:0x%lx bus_addr:0x%lx .\n",
thread_get_current_task(), fault_addr, bus_addr);

View File

@@ -4,6 +4,7 @@
#include "futex.h"
#include "irq.h"
#include "thread_knl.h"
#include "sleep.h"
static umword_t sys_tick_cnt;
umword_t sys_tick_cnt_get(void)
@@ -16,7 +17,10 @@ void SysTick_Handler(void)
// 进行上下文切换
thread_sched(TRUE);
sys_tick_cnt++;
#if 0
thread_timeout_check(1);
#endif
thread_check_timeout();
futex_timeout_times_tick();
thread_calc_cpu_usage();
#if 0

View File

@@ -16,15 +16,15 @@ typedef sema_t mutex_t;
void sema_init(sema_t *obj, int cnt, int max);
void sema_up(sema_t *obj);
void sema_down(sema_t *obj);
umword_t sema_down(sema_t *obj, umword_t ticks);
static inline void mutex_init(mutex_t *lock)
{
sema_init(lock, 1, 1);
}
static inline void mutex_lock(mutex_t *lock)
static inline void mutex_lock(mutex_t *lock, umword_t ticks)
{
sema_down(lock);
sema_down(lock, ticks);
}
static inline void mutex_unlock(mutex_t *lock)
{

View File

@@ -0,0 +1,13 @@
#pragma
#include "thread.h"
typedef struct thread_wait_entry
{
slist_head_t node;
thread_t *th;
umword_t times;
} thread_wait_entry_t;
void thread_check_timeout(void);
thread_wait_entry_t *thread_sleep_del(thread_t *th);
void thread_sleep_del_and_wakeup(thread_t *th);
umword_t thread_sleep(umword_t tick);

View File

@@ -144,14 +144,14 @@ typedef struct thread
bool_t is_vcpu; //!< 是否是vcpu
msg_buf_t msg; //!< 每个线程独有的消息缓存区
#if 0
slist_head_t wait_send_head; //!< 等待头,那些节点等待给当前线程发送数据
spinlock_t recv_lock; //!< 当前线程接收消息时锁住
spinlock_t send_lock; //!< 当前线程发送消息时锁住
bool_t has_wait_send_th; //!< 有线程等待给当前线程发送消息
thread_t *last_send_th; //!< 当前线程上次接收到谁的数据
kobject_t *ipc_kobj; //!< 发送者放到一个ipc对象中
#endif
umword_t user_id; //!< 接收到的user_id
enum thread_state status; //!< 线程状态

View File

@@ -10,6 +10,7 @@
#include "init.h"
#include "ref.h"
#include "slist.h"
#include "sleep.h"
#if IS_ENABLED(CONFIG_BUDDY_SLAB)
#include <slab.h>
static slab_t *sema_slab;
@@ -65,8 +66,8 @@ void sema_up(sema_t *obj)
slist_del(first_wait_node);
if (ref_counter_dec_and_release(&first_wait->thread->ref, &first_wait->thread->kobj) != 1)
{
thread_ready_remote(first_wait->thread, FALSE);
// thread_ready_remote(first_wait->thread, FALSE);
thread_sleep_del_and_wakeup(first_wait->thread);
}
if (obj->cnt < obj->max_cnt)
{
@@ -77,12 +78,14 @@ void sema_up(sema_t *obj)
spinlock_set(&obj->lock, status);
preemption();
}
void sema_down(sema_t *obj)
umword_t sema_down(sema_t *obj, umword_t ticks)
{
assert(obj);
thread_t *th = thread_get_current();
umword_t status;
umword_t remain_sleep = 0;
sema_wait_item_t wait_item;
again:
status = spinlock_lock(&obj->lock);
if (obj->cnt == 0)
@@ -90,7 +93,8 @@ again:
sema_wait_item_init(&wait_item, th);
ref_counter_inc(&th->ref);
slist_add_append(&obj->suspend_head, &wait_item.node);
thread_suspend_sw(th, FALSE);
// thread_suspend_sw(th, FALSE);
remain_sleep = thread_sleep(ticks);
spinlock_set(&obj->lock, status);
preemption();
goto again;
@@ -102,6 +106,7 @@ again:
// printk("down sema cnt:%d max:%d.\n", obj->cnt, obj->max_cnt);
}
spinlock_set(&obj->lock, status);
return remain_sleep;
}
static void sema_syscall(kobject_t *kobj, syscall_prot_t sys_p,
@@ -126,7 +131,10 @@ static void sema_syscall(kobject_t *kobj, syscall_prot_t sys_p,
break;
case SEMA_DOWN:
{
sema_down(sema);
umword_t ret;
ret = sema_down(sema, f->regs[0]);
f->regs[1] = ret;
tag = msg_tag_init4(0, 0, 0, 0);
}
}

124
mkrtos_knl/knl/sleep.c Normal file
View File

@@ -0,0 +1,124 @@
/**
* @file sleep.c
* @author your name (1358745329@qq.com)
* @brief 线程休眠支持
* @version 0.1
* @date 2025-02-12
*
* @copyright Copyright (c) 2025
*
*/
#include <thread.h>
#include <types.h>
#include <spinlock.h>
#include <slist.h>
#include <init.h>
#include "sleep.h"
#include "arch.h"
static slist_head_t wait_list;
static spinlock_t lock;
static inline void thread_wait_entry_init(thread_wait_entry_t *entry,
thread_t *th, mword_t times)
{
slist_init(&entry->node);
entry->th = th;
entry->times = times;
}
static void thread_timeout_init(void)
{
slist_init(&wait_list);
spinlock_init(&lock);
}
INIT_KOBJ(thread_timeout_init);
/**
* @brief 必须在中断中调用
*
*/
void thread_check_timeout(void)
{
thread_wait_entry_t *pos;
slist_foreach_not_next(
pos, (slist_head_t *)&wait_list,
node)
{
assert(pos->th->status == THREAD_SUSPEND);
thread_wait_entry_t *next = slist_next_entry(
pos, (slist_head_t *)wait_list,
node);
if (pos->times != 0)
{
pos->times--;
if (pos->times == 0)
{
thread_ready(pos->th, TRUE);
slist_del(&pos->node);
}
} // !< 如果是0则一直休眠
pos = next;
}
}
/**
* @brief 从休眠队列中删除
*
* @param th
*/
thread_wait_entry_t *thread_sleep_del(thread_t *th)
{
assert(cpulock_get_status());
thread_wait_entry_t *pos = NULL;
slist_foreach_not_next(
pos, (slist_head_t *)&wait_list,
node)
{
assert(pos->th->status == THREAD_SUSPEND);
thread_wait_entry_t *next = slist_next_entry(
pos, (slist_head_t *)wait_list,
node);
if (pos->th == th)
{
slist_del(&pos->node);
break;
}
pos = next;
}
return pos;
}
void thread_sleep_del_and_wakeup(thread_t *th)
{
assert(cpulock_get_status());
thread_wait_entry_t *wait;
wait = thread_sleep_del(th);
if (wait == NULL)
{
return;
}
thread_ready(wait->th, TRUE);
}
/**
* @brief 放到休眠队列中
*
* @param tick
* @return umword_t 返回剩余的休眠时间
*/
umword_t thread_sleep(umword_t tick)
{
assert(cpulock_get_status());
thread_wait_entry_t entry;
thread_t *cur_th = thread_get_current();
umword_t status;
thread_wait_entry_init(&entry, cur_th, tick);
status = spinlock_lock(&lock);
slist_add(&wait_list, &entry.node);
thread_suspend(cur_th);
spinlock_set(&lock, status);
preemption();
return entry.times;
}

View File

@@ -447,7 +447,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
{
task_t *cur_task = thread_get_current_task();
mutex_lock(&cur_task->nofity_lock);
mutex_lock(&cur_task->nofity_lock, 0);
tag = msg_tag_init4(0, 0, 0, 0);
}
break;

View File

@@ -33,6 +33,7 @@
#include "thread_task_arch.h"
#include "types.h"
#include "sema.h"
#include "sleep.h"
#if IS_ENABLED(CONFIG_SMP)
#include <ipi.h>
#endif
@@ -51,6 +52,7 @@ enum thread_op
YIELD,
DO_IPC = 6, //!< 与ipc对象中的额IPC_DO一致
SET_EXEC, //!< 设置异常处理
SLEEP,
};
enum IPC_TYPE
{
@@ -67,7 +69,7 @@ static void thread_syscall(kobject_t *kobj, syscall_prot_t sys_p,
static bool_t thread_put(kobject_t *kobj);
static void thread_release_stage1(kobject_t *kobj);
static void thread_release_stage2(kobject_t *kobj);
#if 0
typedef struct thread_wait_entry
{
slist_head_t node;
@@ -84,7 +86,6 @@ static inline void thread_wait_entry_init(thread_wait_entry_t *entry,
entry->th = th;
entry->times = times;
}
static PER_CPU(slist_head_t, wait_send_queue);
static PER_CPU(slist_head_t, wait_recv_queue);
@@ -96,8 +97,8 @@ static void thread_timeout_init(void)
slist_init(pre_cpu_get_var_cpu(i, (&wait_recv_queue)));
}
}
INIT_KOBJ(thread_timeout_init);
#endif
#if IS_ENABLED(CONFIG_BUDDY_SLAB)
#include <buddy.h>
@@ -126,9 +127,11 @@ void thread_init(thread_t *th, ram_limit_t *lim, umword_t flags)
kobject_init(&th->kobj, THREAD_TYPE);
sched_init(&th->sche);
slist_init(&th->futex_node);
#if 0
slist_init(&th->wait_send_head);
spinlock_init(&th->recv_lock);
spinlock_init(&th->send_lock);
#endif
ref_counter_init(&th->ref);
ref_counter_inc(&th->ref);
thread_arch_init(th, flags);
@@ -157,8 +160,11 @@ static void thread_release_stage1_impl(thread_t *th)
if (th->status == THREAD_READY)
{
thread_suspend(th);
preemption();
}
th->ipc_status = THREAD_IPC_ABORT;
thread_sleep_del(th); //!< 从休眠中删除
#if 0
thread_wait_entry_t *pos;
slist_foreach_not_next(
@@ -202,6 +208,7 @@ static void thread_release_stage1_impl(thread_t *th)
}
pos2 = next;
}
#endif
thread_unbind(th);
}
#if IS_ENABLED(CONFIG_SMP)
@@ -499,7 +506,7 @@ thread_t *thread_create(ram_limit_t *ram, umword_t flags)
printk("create thread 0x%x\n", th);
return th;
}
#if 0
/**
* @brief 线程超时检查
*
@@ -668,6 +675,8 @@ void thread_timeout_del_recv_remote(thread_t *th, bool_t is_sche)
thread_ready(th, is_sche); //!< 直接唤醒接受者
#endif
}
#endif
static int ipc_dat_copy_raw(obj_space_t *dst_obj, obj_space_t *src_obj, ram_limit_t *lim,
ipc_msg_t *dst_ipc, ipc_msg_t *src_ipc, msg_tag_t tag, int is_reply)
{
@@ -706,6 +715,7 @@ static int ipc_dat_copy_raw(obj_space_t *dst_obj, obj_space_t *src_obj, ram_limi
MIN(tag.msg_buf_len * WORD_BYTES, IPC_MSG_SIZE));
return i;
}
#if 0
/**
* @brief ipc传输时的数据拷贝
*
@@ -1170,6 +1180,7 @@ end:
#endif
return ret;
}
#endif
msg_tag_t thread_fast_ipc_call(thread_t *to_th, entry_frame_t *f, umword_t user_id)
{
task_t *cur_task = thread_get_current_task();
@@ -1195,7 +1206,7 @@ _to_unlock:
preemption();
goto _to_unlock;
}
mutex_lock(&to_task->nofity_lock);
mutex_lock(&to_task->nofity_lock, 0);
if (GET_LSB(*to_task->nofity_bitmap, to_task->nofity_bitmap_len) == GET_LSB((~0ULL), to_task->nofity_bitmap_len))
{
mutex_unlock(&to_task->nofity_lock);
@@ -1215,7 +1226,7 @@ _to_unlock:
dst_ipc, src_ipc, in_tag, FALSE);
if (ret >= 0)
{
dst_ipc->user[2] = task_pid_get(cur_task); // 设置pid
dst_ipc->user[2] = task_pid_get(cur_task); // 设置pid
slist_add(&to_task->nofity_theads_head, &cur_th->com->fast_ipc_node); // 添加到链表中,用于进程关闭时进行释放
pf_s_t *usr_stask_point = (void *)arch_get_user_sp();
@@ -1374,6 +1385,7 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id)
return thread_fast_ipc_call(to_th, f, user_id);
}
break;
#if 0
case IPC_CALL:
{
msg_tag_t in_tag = msg_tag_init(f->regs[0]);
@@ -1424,6 +1436,7 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id)
ret = thread_ipc_call(to_th, in_tag, NULL, ipc_tm_out, NULL, FALSE);
return msg_tag_init4(0, 0, 0, ret);
}
#endif
default:
ret = -ENOSYS;
break;
@@ -1649,6 +1662,17 @@ static void thread_syscall(kobject_t *kobj, syscall_prot_t sys_p,
tag = msg_tag_init4(0, 0, 0, 0);
}
break;
case SLEEP:
{
int ret;
umword_t status;
status = cpulock_lock();
ret = thread_sleep(f->regs[0]);
cpulock_set(status);
tag = msg_tag_init4(0, 0, 0, ret);
}
break;
}
f->regs[0] = tag.raw;
}

View File

@@ -1,10 +1,10 @@
#!/bin/bash
export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/
export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
# export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/
# export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
# export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
# export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
# export TOOLCHAIN=/d/GNUArmEmbeddedToolchain/102021.10/bin/
# export TOOLCHAIN_LIB=/d/GNUArmEmbeddedToolchain/102021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp

View File

@@ -61,7 +61,7 @@ again:
rlen = cons_read((uint8_t *)data, len);
if (rlen <= 0)
{
u_sema_down(SEMA_PROT);
u_sema_down(SEMA_PROT, 0, NULL);
goto again;
}
return rlen;

View File

@@ -50,7 +50,7 @@ static void *mm_page_alloc(int page_nr)
u_mutex_init(&lock, handler_alloc());
lock_is_init = 1;
}
u_mutex_lock(&lock);
u_mutex_lock(&lock, 0, NULL);
for (umword_t i = 0; i < ROUND_UP(max_page_nr, WORD_BITS); i++)
{
if (mm_bitmap[i] != (umword_t)(-1))
@@ -106,7 +106,7 @@ static int mm_page_free(int st, int nr)
{
return -EINVAL;
}
u_mutex_lock(&lock);
u_mutex_lock(&lock, 0, NULL);
for (int i = st; (i < st + nr) && (i < max_page_nr); i++)
{
MK_CLR_BIT(mm_bitmap[i / WORD_BITS], i % WORD_BITS);

View File

@@ -13,6 +13,7 @@
#include "u_futex.h"
#include <assert.h>
#include <limits.h>
#include "u_sleep.h"
#include <pthread.h>
#include <time.h>
#include <unistd.h>
@@ -61,8 +62,10 @@ void be_exit(long exit_code)
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); //!< 删除当前task以及申请得所有对象
a_crash(); //!< 强制退出
}
while (1) {
thread_ipc_wait(ipc_timeout_create2(0, 0), NULL, -1);
while (1)
{
// thread_ipc_wait(ipc_timeout_create2(0, 0), NULL, -1);
u_sleep_ms((umword_t)-1);
}
}
@@ -74,4 +77,3 @@ long sys_exit(va_list ap)
be_exit(exit_code);
return 0;
}

View File

@@ -129,7 +129,7 @@ static int be_tty_read(char *buf, long size)
}
else if (len == 0)
{
u_sema_down(SEMA_PROT);
u_sema_down(SEMA_PROT, 0/*TODO:*/, NULL);
continue;
}
r_len += len;
@@ -235,7 +235,7 @@ long be_readv(long fd, const struct iovec *iov, long iovcnt)
}
else if (read_cn == 0)
{
u_sema_down(SEMA_PROT);
u_sema_down(SEMA_PROT, 0, NULL);
cons_write_str(".\n");
goto again_read;
}

View File

@@ -8,5 +8,5 @@ typedef struct u_mutex
} u_mutex_t;
int u_mutex_init(u_mutex_t *lock, obj_handler_t sema_hd);
void u_mutex_lock(u_mutex_t *lock);
void u_mutex_lock(u_mutex_t *lock, umword_t timeout, umword_t *remain_times);
void u_mutex_unlock(u_mutex_t *lock);

View File

@@ -4,4 +4,5 @@
#include "u_types.h"
msg_tag_t u_sema_up(obj_handler_t obj);
msg_tag_t u_sema_down(obj_handler_t obj);
msg_tag_t u_sema_down(obj_handler_t obj, umword_t timeout, umword_t *remain_times);

View File

@@ -66,11 +66,13 @@ static inline msg_tag_t thread_run(obj_handler_t obj, uint8_t prio)
}
msg_tag_t thread_bind_task(obj_handler_t obj, obj_handler_t tk_obj);
msg_tag_t thread_set_exec(obj_handler_t obj, obj_handler_t exec_th);
#if 0
msg_tag_t thread_ipc_wait(ipc_timeout_t timeout, umword_t *obj, obj_handler_t ipc_obj);
msg_tag_t thread_ipc_reply(msg_tag_t in_tag, ipc_timeout_t timeout);
msg_tag_t thread_ipc_send(msg_tag_t in_tag, obj_handler_t target_th_obj, ipc_timeout_t timeout);
msg_tag_t thread_ipc_call(msg_tag_t in_tag, obj_handler_t target_th_obj, ipc_timeout_t timeout);
#endif
msg_tag_t thread_sleep(umword_t ticks);
msg_tag_t thread_ipc_fast_call(msg_tag_t in_tag, obj_handler_t target_obj, umword_t arg0, umword_t arg1, umword_t arg2);
msg_tag_t thread_ipc_fast_replay(msg_tag_t in_tag, obj_handler_t target_obj, int unlock_bitmap);

View File

@@ -26,9 +26,9 @@ int u_mutex_init(u_mutex_t *lock, obj_handler_t sema_hd)
}
return 0;
}
void u_mutex_lock(u_mutex_t *lock)
void u_mutex_lock(u_mutex_t *lock, umword_t timeout, umword_t *remain_times)
{
u_sema_down(lock->obj);
u_sema_down(lock->obj, timeout, remain_times);
}
void u_mutex_unlock(u_mutex_t *lock)
{

View File

@@ -22,12 +22,13 @@ msg_tag_t u_sema_up(obj_handler_t obj)
return tag;
}
msg_tag_t u_sema_down(obj_handler_t obj)
msg_tag_t u_sema_down(obj_handler_t obj, umword_t timeout, umword_t *remain_times)
{
register volatile umword_t r0 asm(ARCH_REG_0);
register volatile umword_t r1 asm(ARCH_REG_1);
mk_syscall(syscall_prot_create(SEMA_DOWN, SEMA_PROT, obj).raw,
0,
timeout,
0,
0,
0,
@@ -35,5 +36,9 @@ msg_tag_t u_sema_down(obj_handler_t obj)
0);
msg_tag_t tag = msg_tag_init(r0);
if (remain_times)
{
*remain_times = r1;
}
return tag;
}

View File

@@ -12,6 +12,7 @@ enum thread_op
YIELD,
DO_IPC,
SET_EXEC,
SLEEP,
};
enum IPC_TYPE
{
@@ -23,6 +24,8 @@ enum IPC_TYPE
IPC_FAST_CALL, //!< 快速CALL通信不切换上下文
IPC_FAST_REPLAY,
};
#if 0
msg_tag_t thread_ipc_wait(ipc_timeout_t timeout, umword_t *obj, obj_handler_t ipc_obj)
{
register volatile umword_t r0 asm(ARCH_REG_0);
@@ -92,6 +95,22 @@ msg_tag_t thread_ipc_call(msg_tag_t in_tag, obj_handler_t target_th_obj, ipc_tim
: ARCH_REG_0);
return msg_tag_init(r0);
}
#endif
msg_tag_t thread_sleep(umword_t ticks)
{
register volatile umword_t r0 asm(ARCH_REG_0);
mk_syscall(syscall_prot_create4(SLEEP, THREAD_PROT, -1, TRUE).raw,
ticks,
0,
0,
0,
0,
0);
asm __volatile__(""
:
:
: ARCH_REG_0);
}
msg_tag_t thread_ipc_fast_call(msg_tag_t in_tag, obj_handler_t target_obj, umword_t arg0, umword_t arg1, umword_t arg2)
{
register volatile umword_t r0 asm(ARCH_REG_0);

View File

@@ -10,7 +10,7 @@
#include <stdio.h>
#include <u_env.h>
RPC_GENERATION_CALL3(TRUE, blk_drv_t, BLK_DRV_PROT, BLK_DRV_WRITE, write,
RPC_GENERATION_CALL3(blk_drv_t, BLK_DRV_PROT, BLK_DRV_WRITE, write,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, inx)
@@ -29,7 +29,7 @@ int blk_drv_cli_write(obj_handler_t dm9000_obj, obj_handler_t shm_obj, int len,
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL3(TRUE, blk_drv_t, BLK_DRV_PROT, BLK_DRV_READ, read,
RPC_GENERATION_CALL3(blk_drv_t, BLK_DRV_PROT, BLK_DRV_READ, read,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, inx)
@@ -49,7 +49,7 @@ int blk_drv_cli_read(obj_handler_t dm9000_obj, obj_handler_t shm_obj, int len, i
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL1(TRUE, blk_drv_t, BLK_DRV_PROT, BLK_DRV_MAP, map,
RPC_GENERATION_CALL1(blk_drv_t, BLK_DRV_PROT, BLK_DRV_MAP, map,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)
int blk_drv_cli_map(obj_handler_t dm9000_obj, obj_handler_t *sem_obj)
@@ -77,7 +77,7 @@ int blk_drv_cli_map(obj_handler_t dm9000_obj, obj_handler_t *sem_obj)
*sem_obj = newfd;
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL1(TRUE, blk_drv_t, BLK_DRV_PROT, BLK_DRV_INFO, info,
RPC_GENERATION_CALL1(blk_drv_t, BLK_DRV_PROT, BLK_DRV_INFO, info,
rpc_blk_drv_info_t_t, rpc_blk_drv_info_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, info)
int blk_drv_cli_info(obj_handler_t obj, blk_drv_info_t *info)
{

View File

@@ -8,13 +8,13 @@
#include "u_rpc_svr.h"
#include <u_env.h>
RPC_GENERATION_CALL1(TRUE, cons_t, CONS_PROT, CONS_WRITE, write,
RPC_GENERATION_CALL1(cons_t, CONS_PROT, CONS_WRITE, write,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data)
RPC_GENERATION_CALL2(TRUE, cons_t, CONS_PROT, CONS_READ, read,
RPC_GENERATION_CALL2(cons_t, CONS_PROT, CONS_READ, read,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_OUT, RPC_TYPE_DATA, data,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
RPC_GENERATION_CALL1(TRUE, cons_t, CONS_PROT, CONS_ACTIVE, active,
RPC_GENERATION_CALL1(cons_t, CONS_PROT, CONS_ACTIVE, active,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
int cons_write(const uint8_t *data, int len)

View File

@@ -10,20 +10,20 @@
#include <string.h>
#include <assert.h>
RPC_GENERATION_CALL2(TRUE, drv_t, FS_PROT, DRV_OPEN, open,
RPC_GENERATION_CALL2(drv_t, FS_PROT, DRV_OPEN, open,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, name,
rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, oflags)
RPC_GENERATION_CALL1(TRUE, drv_t, FS_PROT, DRV_CLOSE, close,
RPC_GENERATION_CALL1(drv_t, FS_PROT, DRV_CLOSE, close,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc)
RPC_GENERATION_CALL3(TRUE, drv_t, FS_PROT, DRV_READ, read,
RPC_GENERATION_CALL3(drv_t, FS_PROT, DRV_READ, read,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_OUT, RPC_TYPE_DATA, data,
rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size)
RPC_GENERATION_CALL3(TRUE, drv_t, FS_PROT, DRV_WRITE, write,
RPC_GENERATION_CALL3(drv_t, FS_PROT, DRV_WRITE, write,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data,
rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size)
RPC_GENERATION_CALL3(TRUE, drv_t, FS_PROT, DRV_IOCTL, ioctl,
RPC_GENERATION_CALL3(drv_t, FS_PROT, DRV_IOCTL, ioctl,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc,
rpc_mword_t_t, rpc_mword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, data,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size)

View File

@@ -16,7 +16,7 @@
typedef struct kstat kstat_t;
RPC_TYPE_DEF_ALL(kstat_t)
/*open*/
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_OPEN, open,
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_OPEN, open,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, mode)
@@ -55,7 +55,7 @@ sd_t fs_open(const char *path, int flags, int mode)
return mk_sd_init2(hd, msg_tag_get_val(tag)).raw;
}
/*close*/
RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_CLOSE, close,
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_CLOSE, close,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd)
int fs_close(sd_t _fd)
{
@@ -75,7 +75,7 @@ int fs_close(sd_t _fd)
return msg_tag_get_val(tag);
}
/*read*/
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_READ, read,
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_READ, read,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
@@ -118,7 +118,7 @@ int fs_read(sd_t _fd, void *buf, size_t len)
return rlen;
}
/*write*/
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_WRITE, write,
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_WRITE, write,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, buf,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
@@ -164,7 +164,7 @@ int fs_write(sd_t _fd, void *buf, size_t len)
return wlen;
}
/*readdir*/
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_READDIR, readdir,
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_READDIR, readdir,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_dirent_t_t, rpc_dirent_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, dir)
@@ -192,7 +192,7 @@ int fs_readdir(sd_t _fd, dirent_t *dirent)
return msg_tag_get_val(tag);
}
/*lseek*/
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_LSEEK, lseek,
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_LSEEK, lseek,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, offs,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, whence)
@@ -221,7 +221,7 @@ int fs_lseek(sd_t _fd, int offs, int whence)
return msg_tag_get_val(tag);
}
/*ftruncate*/
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_FTRUNCATE, ftruncate,
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_FTRUNCATE, ftruncate,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_int64_t_t, rpc_int64_t_t, RPC_DIR_IN, RPC_TYPE_DATA, offs)
int fs_ftruncate(sd_t _fd, off_t off)
@@ -246,7 +246,7 @@ int fs_ftruncate(sd_t _fd, off_t off)
}
/*fstat*/
// int fstat(int fd, struct stat *statbuf);
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_FSTAT, fstat,
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_FSTAT, fstat,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_kstat_t_t, rpc_kstat_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, statbuf)
int fs_fstat(sd_t _fd, kstat_t *stat)
@@ -275,7 +275,7 @@ int fs_fstat(sd_t _fd, kstat_t *stat)
return msg_tag_get_val(tag);
}
// int ioctl(int fd, int req, void *arg)
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_IOCTL, ioctl,
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_IOCTL, ioctl,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, req,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, arg)
@@ -304,7 +304,7 @@ int fs_ioctl(sd_t _fd, int req, void *arg)
return msg_tag_get_val(tag);
}
// int fcntl(int fd, int cmd, void *arg)
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_FCNTL, fcntl,
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_FCNTL, fcntl,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, cmd,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, arg)
@@ -334,7 +334,7 @@ int fs_fcntl(sd_t _fd, int cmd, void *arg)
}
/*fsync*/
RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_FSYNC, fsync,
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_FSYNC, fsync,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd)
int fs_fsync(sd_t _fd)
{
@@ -350,7 +350,7 @@ int fs_fsync(sd_t _fd)
}
/*int unlink(const char *path)*/
RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_UNLINK, unlink,
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_UNLINK, unlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path)
int fs_unlink(const char *path)
{
@@ -372,7 +372,7 @@ int fs_unlink(const char *path)
return msg_tag_get_val(tag);
}
// int symlink(const char *existing, const char *new)
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_SYMLINK, symlink,
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_SYMLINK, symlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, src,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dst)
@@ -413,7 +413,7 @@ int fs_symlink(const char *src, const char *dst)
}
/*int mkdir(char *path)*/
RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_MKDIR, mkdir,
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_MKDIR, mkdir,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dir)
int fs_mkdir(char *path)
@@ -437,7 +437,7 @@ int fs_mkdir(char *path)
}
/*int rmdir(char *path)*/
RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_RMDIR, rmdir,
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_RMDIR, rmdir,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dir)
int fs_rmdir(char *path)
@@ -460,7 +460,7 @@ int fs_rmdir(char *path)
return msg_tag_get_val(tag);
}
/*int rename(char *old, char *new)*/
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_RENAME, rename,
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_RENAME, rename,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, old,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, new)
@@ -500,7 +500,7 @@ int fs_rename(char *old, char *new)
return msg_tag_get_val(tag);
}
// int stat(const char *restrict path, struct stat *restrict buf)
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_STAT, stat,
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_STAT, stat,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_kstat_t_t, rpc_kstat_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf)
@@ -534,7 +534,7 @@ int fs_stat(char *path, void *_buf)
return msg_tag_get_val(tag);
}
// ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize)
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_READLINK, readlink,
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_READLINK, readlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, bufsize)
@@ -570,7 +570,7 @@ int fs_readlink(const char *path, char *buf, int bufsize)
}
// static int __statfs(const char *path, struct statfs *buf)
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_STATFS, statfs,
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_STATFS, statfs,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_statfs_t_t, rpc_statfs_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf)

View File

@@ -28,7 +28,7 @@ RPC_TYPE_DEF_ALL(timeval_t)
RPC_TYPE_DEF_ALL(pollfd_t)
RPC_TYPE_DEF_ALL(nfds_t)
RPC_GENERATION_CALL3(TRUE, net_t, NET_PROT, NET_ACCEPT, accept,
RPC_GENERATION_CALL3(net_t, NET_PROT, NET_ACCEPT, accept,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_socketaddr_t_t, rpc_socketaddr_t_t, RPC_DIR_INOUT, RPC_TYPE_DATA, addr,
rpc_socklen_t_t, rpc_socklen_t_t, RPC_DIR_INOUT, RPC_TYPE_DATA, addrlen)
@@ -66,7 +66,7 @@ int net_accept(sd_t s, struct sockaddr *addr, socklen_t *addrlen)
*addrlen = rpc_addrlen.data;
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL3(TRUE, net_t, NET_PROT, NET_BIND, bind,
RPC_GENERATION_CALL3(net_t, NET_PROT, NET_BIND, bind,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_socketaddr_t_t, rpc_socketaddr_t_t, RPC_DIR_INOUT, RPC_TYPE_DATA, addr,
rpc_socklen_t_t, rpc_socklen_t_t, RPC_DIR_IN, RPC_TYPE_DATA, namelen)
@@ -93,7 +93,7 @@ int net_bind(int s, const struct sockaddr *name, socklen_t namelen)
tag = net_t_bind_call(hd, &rpc_s, &rpc_addr, &rpc_addrlen);
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL2(TRUE, net_t, NET_PROT, NET_SHUTDOWN, shutdown,
RPC_GENERATION_CALL2(net_t, NET_PROT, NET_SHUTDOWN, shutdown,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, how)
int net_shutdown(int s, int how)
@@ -111,7 +111,7 @@ int net_shutdown(int s, int how)
tag = net_t_shutdown_call(hd, &rpc_s, &rpc_how);
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL3(TRUE, net_t, NET_PROT, NET_GETPEERNAME, getpeername,
RPC_GENERATION_CALL3(net_t, NET_PROT, NET_GETPEERNAME, getpeername,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_socketaddr_t_t, rpc_socketaddr_t_t, RPC_DIR_INOUT, RPC_TYPE_DATA, addr,
rpc_socklen_t_t, rpc_socklen_t_t, RPC_DIR_INOUT, RPC_TYPE_DATA, namelen)
@@ -147,7 +147,7 @@ int net_getpeername(int s, struct sockaddr *name, socklen_t *namelen)
*namelen = rpc_namelen.data;
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL3(TRUE, net_t, NET_PROT, NET_GETSOCKNAME, getsockname,
RPC_GENERATION_CALL3(net_t, NET_PROT, NET_GETSOCKNAME, getsockname,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_socketaddr_t_t, rpc_socketaddr_t_t, RPC_DIR_INOUT, RPC_TYPE_DATA, name,
rpc_socklen_t_t, rpc_socklen_t_t, RPC_DIR_INOUT, RPC_TYPE_DATA, namelen)
@@ -183,7 +183,7 @@ int net_getsockname(int s, struct sockaddr *name, socklen_t *namelen)
*namelen = rpc_namelen.data;
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL5(TRUE, net_t, NET_PROT, NET_GETSOCKOPT, getsockopt,
RPC_GENERATION_CALL5(net_t, NET_PROT, NET_GETSOCKOPT, getsockopt,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, level,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, optname,
@@ -229,7 +229,7 @@ int net_getsockopt(int s, int level, int optname, void *optval, socklen_t *optle
// memcpy(optval, &rpc_buf.data[0], MIN(*optlen, rpc_buf.data));
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL5(TRUE, net_t, NET_PROT, NET_SETSOCKOPT, setsockopt,
RPC_GENERATION_CALL5(net_t, NET_PROT, NET_SETSOCKOPT, setsockopt,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, level,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, optname,
@@ -269,7 +269,7 @@ int net_setsockopt(int s, int level, int optname, const void *optval, socklen_t
}
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL3(TRUE, net_t, NET_PROT, NET_CONNECT, connect,
RPC_GENERATION_CALL3(net_t, NET_PROT, NET_CONNECT, connect,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_socketaddr_t_t, rpc_socketaddr_t_t, RPC_DIR_IN, RPC_TYPE_DATA, name,
rpc_socklen_t_t, rpc_socklen_t_t, RPC_DIR_IN, RPC_TYPE_DATA, namelen)
@@ -295,7 +295,7 @@ int net_connect(int s, const struct sockaddr *name, socklen_t namelen)
tag = net_t_connect_call(hd, &rpc_s, &rpc_name, &rpc_namelen);
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL2(TRUE, net_t, NET_PROT, NET_LISTEN, listen,
RPC_GENERATION_CALL2(net_t, NET_PROT, NET_LISTEN, listen,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, backlog)
int net_listen(int s, int backlog)
@@ -313,7 +313,7 @@ int net_listen(int s, int backlog)
tag = net_t_listen_call(hd, &rpc_s, &rpc_backlog);
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL4(TRUE, net_t, NET_PROT, NET_RECV, recv,
RPC_GENERATION_CALL4(net_t, NET_PROT, NET_RECV, recv,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_ref_array_uint32_t_uint8_t_128_t, rpc_array_uint32_t_uint8_t_128_t, RPC_DIR_IN, RPC_TYPE_DATA, mem,
rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, len,
@@ -365,7 +365,7 @@ int net_recv(int s, void *mem, size_t len, int flags)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL6(TRUE, net_t, NET_PROT, NET_RECVFROM, recvfrom,
RPC_GENERATION_CALL6(net_t, NET_PROT, NET_RECVFROM, recvfrom,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_ref_array_uint32_t_uint8_t_128_t, rpc_array_uint32_t_uint8_t_128_t, RPC_DIR_INOUT, RPC_TYPE_DATA, mem,
rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, len,
@@ -427,7 +427,7 @@ int net_recvfrom(int s, void *mem, size_t len, int flags,
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL4(TRUE, net_t, NET_PROT, NET_SEND, send,
RPC_GENERATION_CALL4(net_t, NET_PROT, NET_SEND, send,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_ref_array_uint32_t_uint8_t_128_t, rpc_array_uint32_t_uint8_t_128_t, RPC_DIR_IN, RPC_TYPE_DATA, mem,
rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size,
@@ -480,7 +480,7 @@ int net_send(int s, const void *dataptr, size_t size, int flags)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL6(TRUE, net_t, NET_PROT, NET_SENDTO, sendto,
RPC_GENERATION_CALL6(net_t, NET_PROT, NET_SENDTO, sendto,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_ref_array_uint32_t_uint8_t_128_t, rpc_array_uint32_t_uint8_t_128_t, RPC_DIR_IN, RPC_TYPE_DATA, mem,
rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size,
@@ -540,7 +540,7 @@ int net_sendto(int s, const void *dataptr, size_t size, int flags,
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL3(TRUE, net_t, NET_PROT, NET_SOCKET, socket,
RPC_GENERATION_CALL3(net_t, NET_PROT, NET_SOCKET, socket,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, s,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, type,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, protocol)

View File

@@ -68,12 +68,12 @@ static bool_t reg_hd(const char *path, obj_handler_t hd, int split_inx)
return FALSE;
}
RPC_GENERATION_CALL3(TRUE, ns_t, NS_PROT, NS_REGISTER_OP, register,
RPC_GENERATION_CALL3(ns_t, NS_PROT, NS_REGISTER_OP, register,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, svr_hd,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, type)
RPC_GENERATION_CALL2(TRUE, ns_t, NS_PROT, NS_QUERY_OP, query,
RPC_GENERATION_CALL2(ns_t, NS_PROT, NS_QUERY_OP, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)

View File

@@ -11,7 +11,7 @@
#include <string.h>
#include <assert.h>
RPC_GENERATION_CALL4(TRUE, pm_t, PM_PROT, PM_RUN_APP, run_app,
RPC_GENERATION_CALL4(pm_t, PM_PROT, PM_RUN_APP, run_app,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, params,
@@ -38,7 +38,7 @@ int pm_run_app(const char *path, int flags, uint8_t *params, int params_len)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL2(TRUE, pm_t, PM_PROT, PM_KILL_TASK, kill_task,
RPC_GENERATION_CALL2(pm_t, PM_PROT, PM_KILL_TASK, kill_task,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, pid,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
@@ -54,7 +54,7 @@ int pm_kill_task(int pid, int flags)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL3(TRUE, pm_t, PM_PROT, PM_WATCH_PID, watch_pid,
RPC_GENERATION_CALL3(pm_t, PM_PROT, PM_WATCH_PID, watch_pid,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, sig_hd,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, pid,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
@@ -74,7 +74,7 @@ int pm_watch_pid(obj_handler_t sig_hd, pid_t pid, int flags)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL5(TRUE, pm_t, PM_PROT, PM_COPY_DATA, copy_data,
RPC_GENERATION_CALL5(pm_t, PM_PROT, PM_COPY_DATA, copy_data,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, src_pid,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, dst_pid,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, src_addr,

View File

@@ -11,7 +11,7 @@
* @brief 该宏用于生成一个客户端的调用函数(传递一个参数)
*
*/
#define RPC_GENERATION_CALL1(is_fast, struct_type, prot, op, func_name, cli_type0, svr_type0, dir0, rpc_type0, name0) \
#define RPC_GENERATION_CALL1(struct_type, prot, op, func_name, cli_type0, svr_type0, dir0, rpc_type0, name0) \
msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, cli_type0 *var0) \
{ \
void *buf; \
@@ -32,16 +32,8 @@
PRC_CLI_FILL_MAP_BUF(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc);*/ \
msg_tag_t tag; \
if (is_fast) \
{ \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
} \
else \
{ \
tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
} \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \

View File

@@ -8,7 +8,7 @@
#include <sys/types.h>
#include <errno.h>
#define RPC_GENERATION_CALL2(is_fast, struct_type, prot, op, func_name, \
#define RPC_GENERATION_CALL2(struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1) \
msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, cli_type0 *var0, cli_type1 *var1) \
@@ -33,16 +33,8 @@
PRC_CLI_FILL_MAP_BUF(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \
msg_tag_t tag; \
if (is_fast) \
{ \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
} \
else \
{ \
tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
} \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \

View File

@@ -8,7 +8,7 @@
#include <sys/types.h>
#include <errno.h>
#define RPC_GENERATION_CALL3(is_fast, struct_type, prot, op, func_name, \
#define RPC_GENERATION_CALL3(struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1, \
cli_type2, svr_type2, dir2, rpc_type2, name2) \
@@ -36,16 +36,8 @@
PRC_CLI_FILL_MAP_BUF(rpc_type2, cli_type2, var2, dir2, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \
msg_tag_t tag; \
if (is_fast) \
{ \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
} \
else \
{ \
tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
} \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \

View File

@@ -8,7 +8,7 @@
#include <sys/types.h>
#include <errno.h>
#define RPC_GENERATION_CALL4(is_fast, struct_type, prot, op, func_name, \
#define RPC_GENERATION_CALL4(struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1, \
cli_type2, svr_type2, dir2, rpc_type2, name2, \
@@ -39,16 +39,8 @@
PRC_CLI_FILL_MAP_BUF(rpc_type3, cli_type3, var3, dir3, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \
msg_tag_t tag; \
if (is_fast) \
{ \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
} \
else \
{ \
tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
} \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \

View File

@@ -8,7 +8,7 @@
#include <sys/types.h>
#include <errno.h>
#define RPC_GENERATION_CALL5(is_fast, struct_type, prot, op, func_name, \
#define RPC_GENERATION_CALL5(struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1, \
cli_type2, svr_type2, dir2, rpc_type2, name2, \
@@ -42,16 +42,8 @@
PRC_CLI_FILL_MAP_BUF(rpc_type4, cli_type4, var4, dir4, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \
msg_tag_t tag; \
if (is_fast) \
{ \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
} \
else \
{ \
tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
} \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \

View File

@@ -8,7 +8,7 @@
#include <sys/types.h>
#include <errno.h>
#define RPC_GENERATION_CALL6(is_fast, struct_type, prot, op, func_name, \
#define RPC_GENERATION_CALL6(struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1, \
cli_type2, svr_type2, dir2, rpc_type2, name2, \
@@ -45,16 +45,8 @@
PRC_CLI_FILL_MAP_BUF(rpc_type5, cli_type5, var5, dir5, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \
msg_tag_t tag; \
if (is_fast) \
{ \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
} \
else \
{ \
tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
} \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \

View File

@@ -36,7 +36,7 @@ rpc_svr_obj_t *meta_find_svr_obj(umword_t prot);
int meta_reg_svr_obj(rpc_svr_obj_t *svr_obj, umword_t prot);
int meta_reg_svr_obj_raw(meta_t *meta, rpc_svr_obj_t *svr_obj, umword_t prot);
int rpc_creaite_bind_ipc(obj_handler_t th, void *obj, obj_handler_t *ipc_hd);
void rpc_loop(void);
#if 0
void rpc_loop(void);
int rpc_mtd_loop(void);
#endif

View File

@@ -164,6 +164,7 @@ int rpc_meta_init(obj_handler_t th, obj_handler_t *ret_ipc_hd)
{
return rpc_creaite_bind_ipc(th, &meta_obj.svr, ret_ipc_hd);
}
#if 0
/**
* @brief RPC循环处理消息
*
@@ -201,7 +202,6 @@ void rpc_loop(void)
thread_ipc_reply(tag, ipc_timeout_create2(0, 0));
}
}
#if 0
#define RPC_MTD_TH_STACK_SIZE (1024 + 256)
typedef struct mtd_params
{

View File

@@ -23,5 +23,6 @@ static obj_handler_t hd = HANDLER_INVALID;
void u_sleep_ms(size_t ms)
{
umword_t sleep_tick = ROUND_UP(ms, (1000 / CONFIG_SYS_SCHE_HZ));
thread_ipc_wait(ipc_timeout_create2(0, sleep_tick), NULL, -1);
// thread_ipc_wait(ipc_timeout_create2(0, sleep_tick), NULL, -1);
thread_sleep(sleep_tick);
}

View File

@@ -117,10 +117,12 @@ int fs_svr_statfs(const char *path, struct statfs *buf)
{
return -ENOSYS;
}
#if 0
void fs_svr_loop(void)
{
rpc_loop();
}
#endif
static const fs_operations_t ops =
{
.fs_svr_open = fs_svr_open,

View File

@@ -17,6 +17,7 @@
#include "appfs.h"
#include "hw_block.h"
#include "appfs_open.h"
#include "u_sleep.h"
#define STACK_COM_ITME_SIZE (2 * 1024)
ATTR_ALIGN(8)
uint8_t stack_coms[STACK_COM_ITME_SIZE];
@@ -78,7 +79,12 @@ int main(int argc, char *argv[])
fs_svr_init();
ns_register(mount_path, hd, MOUNT_NODE);
cons_write_str("appfs mount success\n");
#if 0
fs_svr_loop();
#endif
while (1)
{
u_sleep_ms((umword_t)(-1));
}
return 0;
}

View File

@@ -34,7 +34,7 @@
#define DEFAULT_INIT_CFG "init.cfg"
#define STACK_COM_ITME_SIZE (3*1024)
#define STACK_COM_ITME_SIZE (3 * 1024)
ATTR_ALIGN(8)
uint8_t stack_coms[STACK_COM_ITME_SIZE];
uint8_t msg_buf_coms[MSG_BUG_LEN];
@@ -70,6 +70,10 @@ int main(int argc, char *args[])
ret = parse_cfg(DEFAULT_INIT_CFG, env);
printf("run app num is %d.\n", ret);
namespace_loop();
// namespace_loop();
while (1)
{
u_sleep_ms((umword_t)(-1));
}
return 0;
}

View File

@@ -556,13 +556,13 @@ int namespace_query(const char *path, obj_handler_t *hd)
ns_unlock();
return ret_inx;
}
#if 0
void namespace_loop(void)
{
rpc_loop();
// rpc_mtd_loop();
}
#endif
int fs_svr_mkdir(char *path)
{
int ret = ns_reg(path, 0, DIR_NODE);

View File

@@ -117,7 +117,7 @@ int parse_cfg(const char *parse_cfg_file_name, uenv_t *env)
msg_tag_t tag;
sys_info_t sys_info;
u_mutex_lock(&cmd_lock);
u_mutex_lock(&cmd_lock, 0, NULL);
tag = sys_read_info(SYS_PROT, &sys_info, 0);
if (msg_tag_get_val(tag) < 0)

View File

@@ -137,6 +137,7 @@ int pm_rpc_watch_pid(pm_t *pm, obj_handler_t sig_rcv_hd, pid_t pid, int flags)
printf("[pm] watch pid:%d, sig hd:%d.\n", src_pid, sig_rcv_hd);
return 0;
}
#if IS_ENABLED(CONFIG_USING_SIG)
/**
* @brief pm给task的信号线程发送消息
*
@@ -175,6 +176,7 @@ static bool_t pm_send_sig_to_task(pm_t *pm, pid_t pid, umword_t sig_val)
pos = next;
}
}
#endif
/**
* @brief 杀死某个进程
*
@@ -195,7 +197,9 @@ int pm_rpc_kill_task(int pid, int flags)
ns_node_del_by_pid(pid, flags); //!< 从ns中删除
pm_del_watch_by_pid(&pm, pid); //!< 从watch中删除
#if IS_ENABLED(CONFIG_USING_SIG)
pm_send_sig_to_task(&pm, pid, KILL_SIG); //!< 给watch者发送sig
#endif
// handler_del_umap(pid);
printf("[pm] kill pid:%d.\n", pid);
return 0;

View File

@@ -1,3 +1,4 @@
#if 0
#include "u_log.h"
#include "u_prot.h"
#include "u_factory.h"
@@ -229,3 +230,4 @@ CuSuite *ipc_test_suite(void)
return &suite;
}
#endif

View File

@@ -1,3 +1,4 @@
#if 0
#include "u_log.h"
#include "u_prot.h"
#include "u_factory.h"
@@ -91,3 +92,4 @@ CuSuite *map_test_suite(void)
return &suite;
}
#endif

View File

@@ -21,7 +21,7 @@ int u_sema_test(void)
assert(msg_tag_get_val(tag) >= 0);
u_sema_up(sema_hd);
u_sema_down(sema_hd);
u_sema_down(sema_hd, 0, NULL);
handler_free_umap(sema_hd);
return 0;
@@ -55,7 +55,7 @@ static void *thread_th2(void *arg)
while (1)
{
printf("sema_down start\n");
u_sema_down(sema_hd2);
u_sema_down(sema_hd2, 0, NULL);
u_sleep_ms(50);
printf("sema_down end\n");
if (j == TEST_CN)
@@ -73,7 +73,7 @@ static void *thread_th3(void *arg)
while (1)
{
printf("sema_down2 start\n");
u_sema_down(sema_hd2);
u_sema_down(sema_hd2, 0, NULL);
u_sleep_ms(50);
printf("sema_down2 end\n");
if (j == TEST_CN)

View File

@@ -15,13 +15,16 @@ static void RunAllTests(void)
exit(1);
}
CuSuiteInit(&suite);
#if 0
CuSuiteAddSuite(&suite, ipc_test_suite());
#endif
CuSuiteAddSuite(&suite, ulog_test_suite());
CuSuiteAddSuite(&suite, printf_test_suite());
CuSuiteAddSuite(&suite, vmm_test_suite());
CuSuiteAddSuite(&suite, sharem_mem_test_suite());
#if 0
CuSuiteAddSuite(&suite, map_test_suite());
#endif
CuSuiteAddSuite(&suite, thread_base_test_suite());
CuSuiteAddSuite(&suite, sema_test_suite());
CuSuiteAddSuite(&suite, pthread_base_test_suite());

View File

@@ -18,6 +18,7 @@
#include "fs_rpc.h"
#include "net_rpc.h"
#include "u_fast_ipc.h"
#include "net_test.h"
static umword_t addr;
static umword_t size;
obj_handler_t net_drv_hd;
@@ -107,7 +108,7 @@ again:
net_test();
while (1)
{
if (msg_tag_get_prot(u_sema_down(sem_hd)) < 0)
if (msg_tag_get_prot(u_sema_down(sem_hd, 0, NULL)) < 0)
{
printf("error.\n");
}

View File

@@ -122,6 +122,7 @@ int main(int argc, char *argv[])
while (1)
{
rpc_loop();
// rpc_loop();
u_sleep_ms((umword_t)(-1));
}
}