#include <afb/afb-req-itf.h>
#include "../afb-thread.h"
+#include "../jobs.h"
struct foo {
int value;
{
struct foo *foo = closure;
if(!--foo->refcount) {
- printf("%06d FREE\n", foo->value);
+ /* printf("%06d FREE\n", foo->value); */
free(foo);
}
}
void fail(void *closure, const char *status, const char *info)
{
struct foo *foo = closure;
- printf("%06d ERROR %s\n", foo->value, status);
+ printf("%06d ABORT T%d %s\n", foo->value, (int)syscall(SYS_gettid), status);
}
struct afb_req_itf itf = {
// nanosleep(&ts, NULL);
}
+void terminate(int signum)
+{
+ printf("---------------- TERMINATE T%d (%d)\n", (int)syscall(SYS_gettid), signum);
+#if 1
+ jobs_terminate();
+#else
+ jobs_invoke0(0, jobs_terminate);
+#endif
+ exit(0);
+}
+
int main()
{
int i;
struct timespec ts;
req.itf = &itf;
- afb_thread_init(4, 1);
+ jobs_init(4, 0, 20000);
for (i = 0 ; i < 10000 ; i++) {
req.closure = foo = malloc(sizeof *foo);
foo->value = i;
foo->refcount = 1;
- afb_thread_call(req, process, 5, (&ts) + (i % 4));
+ afb_thread_req_call(req, process, 5, (&ts) + (i % 7));
unref(foo);
+ if (i == 5000)
+#if 0
+ jobs_invoke0(0, terminate);
+#else
+ jobs_queue0(NULL, 0, terminate);
+#endif
ts.tv_sec = 0;
ts.tv_nsec = 1000000;
// nanosleep(&ts, NULL);
}
- ts.tv_sec = 1;
- ts.tv_nsec = 0;
- nanosleep(&ts, NULL);
- afb_thread_terminate();
+ return -jobs_add_me();
}