mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-15 01:10:52 +08:00
108 lines
2.0 KiB
C
108 lines
2.0 KiB
C
#include "lib_acl.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <poll.h>
|
|
#include "fiber/lib_fiber.h"
|
|
|
|
static int __nfibers = 0;
|
|
|
|
static void poll_sleep(ACL_FIBER *fiber, void *ctx acl_unused)
|
|
{
|
|
int in = 0, fd = dup(in), n;
|
|
struct pollfd pfd;
|
|
|
|
//fd = in;
|
|
memset(&pfd, 0, sizeof(pfd));
|
|
acl_non_blocking(fd, ACL_NON_BLOCKING);
|
|
pfd.fd = fd;
|
|
pfd.events = POLLIN;
|
|
|
|
while (1) {
|
|
n = poll(&pfd, 1, 10000);
|
|
if (n < 0) {
|
|
printf("poll error: %s\r\n", acl_last_serror());
|
|
break;
|
|
}
|
|
|
|
if (n == 0) {
|
|
printf("fiber-%d: fd=%d, poll wakeup\r\n",
|
|
acl_fiber_id(fiber), fd);
|
|
} else
|
|
printf("fiber-%d: fd = %d read ready %s\r\n",
|
|
acl_fiber_id(fiber), pfd.fd,
|
|
pfd.revents & POLLIN ? "yes" : "no");
|
|
|
|
if (pfd.revents & POLLIN) {
|
|
char buf[256];
|
|
|
|
n = read(fd, buf, sizeof(buf) - 1);
|
|
if (n < 0) {
|
|
if (errno != EWOULDBLOCK) {
|
|
printf("fiber-%d: error %s\r\n",
|
|
acl_fiber_id(fiber),
|
|
acl_last_serror());
|
|
break;
|
|
}
|
|
printf("fiber-%d: %s\r\n", acl_fiber_id(fiber),
|
|
acl_last_serror());
|
|
continue;
|
|
} else if (n == 0) {
|
|
printf("fiber-%d: read over\r\n",
|
|
acl_fiber_id(fiber));
|
|
break;
|
|
}
|
|
|
|
buf[n] = 0;
|
|
printf("fiber-%d: %s", acl_fiber_id(fiber), buf);
|
|
fflush(stdout);
|
|
pfd.revents = 0;
|
|
}
|
|
}
|
|
|
|
close(fd);
|
|
printf(">>>fiber-%d close %d exit\r\n", acl_fiber_id(fiber), fd);
|
|
|
|
if (--__nfibers == 0) {
|
|
printf("All are over!\r\n");
|
|
//acl_fiber_schedule_stop();
|
|
}
|
|
}
|
|
|
|
static void usage(const char *procname)
|
|
{
|
|
printf("usage: %s -h [help]\r\n", procname);
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int ch, n = 1;
|
|
|
|
while ((ch = getopt(argc, argv, "h")) > 0) {
|
|
switch (ch) {
|
|
case 'h':
|
|
usage(argv[0]);
|
|
return 0;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
acl_fiber_msg_stdout_enable(1);
|
|
|
|
__nfibers++;
|
|
acl_fiber_create(poll_sleep, &n, 32768);
|
|
|
|
__nfibers++;
|
|
acl_fiber_create(poll_sleep, &n, 32768);
|
|
|
|
__nfibers++;
|
|
acl_fiber_create(poll_sleep, &n, 32768);
|
|
|
|
__nfibers++;
|
|
acl_fiber_create(poll_sleep, &n, 32768);
|
|
|
|
acl_fiber_schedule();
|
|
|
|
return 0;
|
|
}
|