Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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);
			}
		}
	}
}