#define _GNU_SOURCE #include #include #include #include #include #include #include "../afb-thread.h" #include "../jobs.h" struct foo { int value; int refcount; }; void addref(void *closure) { struct foo *foo = closure; foo->refcount++; } void unref(void *closure) { struct foo *foo = closure; if(!--foo->refcount) { 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); } struct afb_req_itf itf = { .json = NULL, .get = NULL, .success = NULL, .fail = fail, .raw = NULL, .send = NULL, .context_get = NULL, .context_set = NULL, .addref = addref, .unref = unref, .session_close = NULL, .session_set_LOA = NULL, .subscribe = NULL, .unsubscribe = NULL, .subcall = NULL }; void process(struct afb_req req) { struct timespec ts; struct foo *foo = req.closure; printf("%06d PROCESS T%d\n", foo->value, (int)syscall(SYS_gettid)); ts.tv_sec = 0; ts.tv_nsec = foo->value * 1000; // nanosleep(&ts, NULL); } int main() { int i; struct foo *foo; struct afb_req req; struct timespec ts; req.itf = &itf; 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_req_call(req, process, 5, (&ts) + (i % 7)); unref(foo); ts.tv_sec = 0; ts.tv_nsec = 1000000; // nanosleep(&ts, NULL); } ts.tv_sec = 1; ts.tv_nsec = 0; nanosleep(&ts, NULL); jobs_terminate(); }