static void http_handler(struct evhttp_request *req, void *args) { struct EventContext *eventContext = (struct EventContext *)args; KonohaContext *kctx = eventContext->httpContext; struct evbuffer *body = evhttp_request_get_input_buffer(req); size_t len = evbuffer_get_length(body); unsigned char *requestLine; struct evbuffer *buf = evbuffer_new(); switch(req->type) { case EVHTTP_REQ_POST: requestLine = evbuffer_pullup(body, -1); requestLine[len] = '\0'; struct JsonBuf jsonbuf = {}; if(PLATAPI JsonModule.ParseJson(kctx, &jsonbuf, (char *)requestLine, strlen((char *)requestLine), NULL)) { pthread_mutex_lock(&eventContext->lock); if(enqueueRawEventToLocalQueue(eventContext->queue, (RawEvent *)&jsonbuf) == true) { pthread_mutex_unlock(&eventContext->lock); evhttp_send_reply(req, HTTP_OK, "OK", buf); } *(eventContext->safePointRef) |= SafePoint_Event; } else { evhttp_send_error(req, HTTP_SERVUNAVAIL, "Event queue is full"); } break; default: evhttp_send_error(req, HTTP_BADREQUEST, "Available POST only"); break; } evbuffer_free(buf); }
static kbool_t EmitEvent(KonohaContext *kctx, struct JsonBuf *json, KTraceInfo *trace) { struct EventContext *eventContext = PLATAPI eventContext; kbool_t ret = false; if(eventContext != NULL) { ret = enqueueRawEventToLocalQueue(eventContext->queue, (RawEvent *)json); if(ret && eventContext->isWaiting) { raise(SIGCONT); // see WaitEvent(); } } return ret; }
static kbool_t EmitEvent(KonohaContext *kctx, struct JsonBuf *json, KTraceInfo *trace) { struct EventContext *eventContext = EVENTAPI eventContext; kbool_t ret = false; if(eventContext != NULL) { pthread_mutex_lock(&eventContext->lock); ret = enqueueRawEventToLocalQueue(eventContext->queue, (RawEvent *)json); pthread_mutex_unlock(&eventContext->lock); if(ret && eventContext->isWaiting) { pthread_cond_signal(&eventContext->cond); // see WaitEvent(); } } return ret; }
static void AddSignalEvent(KonohaContext *kctx, struct EventContext *eventContext, KTraceInfo *trace) { size_t i; for(i = 0; i < 32; i++) { siginfo_t *siginfo = eventContext->siginfo[i]; eventContext->siginfo[i] = NULL; if(siginfo != NULL) { char buf[BUFSIZ]; struct JsonBuf jsonbuf = {}; snprintf(buf, sizeof(buf), "{\"event\": \"signal\", \"signal\": %d}", (int)(i+1)); if(PLATAPI ParseJson(kctx, &jsonbuf, buf, strlen(buf), trace)) { enqueueRawEventToLocalQueue(eventContext->queue, (RawEvent *)&jsonbuf); } } } }