Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
ede353d8
T
Third Party Musl
项目概览
OpenHarmony
/
Third Party Musl
大约 1 年 前同步成功
通知
37
Star
125
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Musl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ede353d8
编写于
6月 07, 2011
作者:
R
Rich Felker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implement mq_notify
上级
ab11386a
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
65 addition
and
2 deletion
+65
-2
src/mq/mq_notify.c
src/mq/mq_notify.c
+65
-2
未找到文件。
src/mq/mq_notify.c
浏览文件 @
ede353d8
#include <mqueue.h>
#include <pthread.h>
#include <errno.h>
#include <sys/socket.h>
#include <signal.h>
#include <unistd.h>
#include "syscall.h"
struct
args
{
pthread_barrier_t
barrier
;
int
sock
;
const
struct
sigevent
*
sev
;
};
void
*
start
(
void
*
p
)
{
struct
args
*
args
=
p
;
char
buf
[
32
];
ssize_t
n
;
int
s
=
args
->
sock
;
void
(
*
func
)(
union
sigval
)
=
args
->
sev
->
sigev_notify_function
;
union
sigval
val
=
args
->
sev
->
sigev_value
;
pthread_barrier_wait
(
&
args
->
barrier
);
n
=
recv
(
s
,
buf
,
sizeof
(
buf
),
MSG_NOSIGNAL
|
MSG_WAITALL
);
close
(
s
);
if
(
n
==
sizeof
buf
&&
buf
[
sizeof
buf
-
1
]
==
1
)
func
(
val
);
return
0
;
}
int
mq_notify
(
mqd_t
mqd
,
const
struct
sigevent
*
sev
)
{
errno
=
ENOSYS
;
return
-
1
;
struct
args
args
=
{
.
sev
=
sev
};
pthread_attr_t
attr
;
pthread_t
td
;
int
s
;
struct
sigevent
sev2
;
static
const
char
zeros
[
32
];
if
(
!
sev
||
sev
->
sigev_notify
!=
SIGEV_THREAD
)
return
syscall
(
SYS_mq_notify
,
mqd
,
sev
);
s
=
socket
(
AF_NETLINK
,
SOCK_RAW
|
SOCK_CLOEXEC
,
0
);
if
(
s
<
0
)
return
-
1
;
args
.
sock
=
s
;
if
(
sev
->
sigev_notify_attributes
)
attr
=
*
sev
->
sigev_notify_attributes
;
else
pthread_attr_init
(
&
attr
);
pthread_attr_setdetachstate
(
&
attr
,
PTHREAD_CREATE_DETACHED
);
pthread_barrier_init
(
&
args
.
barrier
,
0
,
2
);
if
(
pthread_create
(
&
td
,
&
attr
,
start
,
&
args
))
{
__syscall
(
SYS_close
,
s
);
errno
=
EAGAIN
;
return
-
1
;
}
pthread_barrier_wait
(
&
args
.
barrier
);
pthread_barrier_destroy
(
&
args
.
barrier
);
sev2
.
sigev_notify
=
SIGEV_THREAD
;
sev2
.
sigev_signo
=
s
;
sev2
.
sigev_value
.
sival_ptr
=
&
zeros
;
if
(
syscall
(
SYS_mq_notify
,
mqd
,
&
sev2
)
<
0
)
{
pthread_cancel
(
td
);
__syscall
(
SYS_close
,
s
);
return
-
1
;
}
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录