bd8b4f7f1e
Roll in the ORTE state machine. Remove last traces of opal_sos. Remove UTK epoch code. Please see the various emails about the state machine change for details. I'll send something out later with more info on the new arch. This commit was SVN r26242.
109 строки
2.5 KiB
C
109 строки
2.5 KiB
C
|
|
#include <event2/event.h>
|
|
#include <event2/event_struct.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <signal.h>
|
|
#include <stdbool.h>
|
|
|
|
#define SIGPRI 0
|
|
#define TERMPRI 1
|
|
|
|
static struct event_base *base;
|
|
static bool run=true;
|
|
static int loops=0;
|
|
|
|
static void
|
|
cbfunc(evutil_socket_t fd, short what, void *arg)
|
|
{
|
|
fprintf(stderr, "CAUGHT SIGNAL\n");
|
|
fflush(stderr);
|
|
#if 0
|
|
event_base_loopbreak(base);
|
|
#endif
|
|
run = false;
|
|
}
|
|
|
|
static void
|
|
die(const char *msg)
|
|
{
|
|
fprintf(stderr, "%s\n", msg);
|
|
fflush(stderr);
|
|
exit(1);
|
|
}
|
|
|
|
static void
|
|
t1func(evutil_socket_t fd, short what, void *arg)
|
|
{
|
|
struct event *t1 = (struct event*)arg;
|
|
struct event *t2;
|
|
|
|
fprintf(stderr, "CAUGHT EVENT\n");
|
|
fflush(stderr);
|
|
event_del(t1);
|
|
free(t1);
|
|
loops++;
|
|
if (loops < 10) {
|
|
t2 = (struct event*)malloc(sizeof(struct event));
|
|
if (event_assign(t2, base, -1, EV_WRITE, t1func, t2) < 0) {
|
|
die("event_assign_term");
|
|
}
|
|
if (event_priority_set(t2, TERMPRI) < 0) {
|
|
die("event_priority_set_term");
|
|
}
|
|
fprintf(stderr, "EVENT %d DEFINED\n", loops);
|
|
fflush(stderr);
|
|
event_active(t2, EV_WRITE, 1);
|
|
fprintf(stderr, "EVENT %d ACTIVATED\n", loops);
|
|
fflush(stderr);
|
|
}
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
struct event ev;
|
|
struct event *t1;
|
|
|
|
event_enable_debug_mode();
|
|
|
|
fprintf(stderr, "Libevent %s\n", event_get_version());
|
|
fflush(stderr);
|
|
|
|
if (!(base = event_base_new()))
|
|
die("event_base_new");
|
|
if (event_base_priority_init(base, 8) < 0)
|
|
die("event_base_priority_init");
|
|
if (event_assign(&ev, base, SIGTERM, EV_SIGNAL|EV_PERSIST, cbfunc, NULL)<0)
|
|
die("event_assign");
|
|
if (event_priority_set(&ev, SIGPRI) < 0)
|
|
die("event_priority_set");
|
|
if (event_add(&ev, NULL) < 0)
|
|
die("event_add");
|
|
fprintf(stderr, "SIGNAL EVENT DEFINED\n");
|
|
fflush(stderr);
|
|
|
|
t1 = (struct event*)malloc(sizeof(struct event));
|
|
if (event_assign(t1, base, -1, EV_WRITE, t1func, t1) < 0) {
|
|
die("event_assign_term");
|
|
}
|
|
if (event_priority_set(t1, TERMPRI) < 0) {
|
|
die("event_priority_set_term");
|
|
}
|
|
event_active(t1, EV_WRITE, 1);
|
|
fprintf(stderr, "FIRST TERMINATION EVENT DEFINED\n");
|
|
fflush(stderr);
|
|
|
|
/* event_dispatch(base); */
|
|
|
|
while (run) {
|
|
event_base_loop(base, EVLOOP_ONCE);
|
|
}
|
|
|
|
fprintf(stderr, "EXITED LOOP - FREEING BASE\n");
|
|
fflush(stderr);
|
|
event_base_free(base);
|
|
return 0;
|
|
}
|