add wit support

This commit is contained in:
vms 2020-08-08 23:47:24 +03:00
parent ae52a7084d
commit 9dd65dedad
2 changed files with 28 additions and 14 deletions

View File

@ -11,9 +11,11 @@ SDK = sdk/syscalls_stubs.c
EXPORT_FUNCS = \ EXPORT_FUNCS = \
--export=allocate,$\ --export=allocate,$\
--export=deallocate,$\ --export=deallocate,$\
--export=invoke,$\ --export=set_result_size,$\
--export=load,$\ --export=set_result_ptr,$\
--export=store --export=get_result_size,$\
--export=get_result_ptr,$\
--export=invoke
REDIS_SERVER_SRC = \ REDIS_SERVER_SRC = \
adlist.c\ adlist.c\

View File

@ -5,6 +5,8 @@
#include <string.h> #include <string.h>
client *g_client; client *g_client;
char *RESULT_PTR;
int RESULT_SIZE;
// TODO: add handling of the initialization process errors // TODO: add handling of the initialization process errors
void init() { void init() {
@ -25,8 +27,20 @@ void deallocate(void *ptr, int size) {
zfree(ptr); zfree(ptr);
} }
void store(char *ptr, unsigned char byte) { void set_result_ptr(char *ptr) {
*ptr = byte; *RESULT_PTR = ptr;
}
void set_result_size(int size) {
RESULT_SIZE = size;
}
int get_result_size(void) {
return RESULT_SIZE;
}
char *get_result_ptr() {
return RESULT_PTR;
} }
unsigned char load(const unsigned char *ptr) { unsigned char load(const unsigned char *ptr) {
@ -59,10 +73,10 @@ void clean_client_buffer(client *c) {
} }
char *write_response(client *c, size_t *response_size) { char *write_response(client *c, size_t *response_size) {
char *response = allocate(c->bufpos + c->reply_bytes + 4); char *response = allocate(c->bufpos + c->reply_bytes);
*response_size = 0; *response_size = 0;
memcpy(response + 4, c->buf, c->bufpos); memcpy(response, c->buf, c->bufpos);
*response_size += c->bufpos; *response_size += c->bufpos;
while(listLength(c->reply)) { while(listLength(c->reply)) {
@ -74,21 +88,17 @@ char *write_response(client *c, size_t *response_size) {
continue; continue;
} }
memcpy(response + 4 + *response_size, o->buf, objlen); memcpy(response + *response_size, o->buf, objlen);
c->reply_bytes -= o->size; c->reply_bytes -= o->size;
*response_size += objlen; *response_size += objlen;
listDelNode(c->reply, listFirst(c->reply)); listDelNode(c->reply, listFirst(c->reply));
} }
for(int i = 0; i < 4; ++i) {
response[i] = (*response_size >> 8*i) & 0xFF;
}
return response; return response;
} }
const char *invoke(char *request, int request_size) { void invoke(char *request, int request_size) {
serverLog(LL_DEBUG, "invoke started\n"); serverLog(LL_DEBUG, "invoke started\n");
if(g_isInited == 0) { if(g_isInited == 0) {
init(); init();
@ -119,6 +129,7 @@ const char *invoke(char *request, int request_size) {
g_client->reply_bytes, g_client->reply_bytes,
response_size response_size
); );
clean_client_buffer(g_client); clean_client_buffer(g_client);
serverCron(); serverCron();
@ -127,5 +138,6 @@ const char *invoke(char *request, int request_size) {
beforeSleep(); beforeSleep();
serverLog(LL_DEBUG, "beforeSleep\n"); serverLog(LL_DEBUG, "beforeSleep\n");
return response; RESULT_PTR = response;
RESULT_SIZE = response_size;
} }