Break out some crap in a more logical way I suppose so I can, like, trigger timeout alarms and whatnot

This commit is contained in:
XANTRONIX Development 2017-11-26 17:35:22 -06:00
parent 52d3936063
commit cf827d8028
15 changed files with 136 additions and 87 deletions

View file

@ -19,7 +19,7 @@ int main(int argc, char **argv) {
printf("%p\n", skipstone_map_get(map, 0xdead)); printf("%p\n", skipstone_map_get(map, 0xdead));
printf("%p\n", skipstone_map_get(map, 0xbeef)); printf("%p\n", skipstone_map_get(map, 0xbeef));
skipstone_map_destroy(map); skipstone_map_destroy(map, NULL);
return 0; return 0;
} }

View file

@ -19,7 +19,7 @@ int main(int argc, char **argv) {
printf("%p\n", skipstone_map_get(map, 0xdead)); printf("%p\n", skipstone_map_get(map, 0xdead));
printf("%p\n", skipstone_map_get(map, 0xbeef)); printf("%p\n", skipstone_map_get(map, 0xbeef));
skipstone_map_destroy(map); skipstone_map_destroy(map, NULL);
return 0; return 0;
} }

View file

@ -19,7 +19,7 @@ int main(int argc, char **argv) {
printf("%s\n", message); printf("%s\n", message);
skipstone_queue_destroy(queue); skipstone_queue_destroy(queue, NULL);
return 0; return 0;
} }

View file

@ -19,7 +19,7 @@ int main(int argc, char **argv) {
printf("%s\n", message); printf("%s\n", message);
skipstone_queue_destroy(queue); skipstone_queue_destroy(queue, NULL);
return 0; return 0;
} }

View file

@ -22,9 +22,6 @@ static int answer_music_message(skipstone_message_service *service,
void *buf, uint16_t size, uint16_t id, void *context) { void *buf, uint16_t size, uint16_t id, void *context) {
skipstone_message *message = skipstone_message_new(); skipstone_message *message = skipstone_message_new();
printf("Received music message size %hu value %02x\n", size,
((uint8_t *)buf)[0]);
skipstone_message_append_uint8(message, 0x10); skipstone_message_append_uint8(message, 0x10);
skipstone_message_append_string(message, "KMFDM", 5); skipstone_message_append_string(message, "KMFDM", 5);
skipstone_message_append_string(message, "Nihil", 5); skipstone_message_append_string(message, "Nihil", 5);

View file

@ -22,9 +22,6 @@ static int answer_music_message(skipstone_message_service *service,
void *buf, uint16_t size, uint16_t id, void *context) { void *buf, uint16_t size, uint16_t id, void *context) {
skipstone_message *message = skipstone_message_new(); skipstone_message *message = skipstone_message_new();
printf("Received music message size %hu value %02x\n", size,
((uint8_t *)buf)[0]);
skipstone_message_append_uint8(message, 0x10); skipstone_message_append_uint8(message, 0x10);
skipstone_message_append_string(message, "KMFDM", 5); skipstone_message_append_string(message, "KMFDM", 5);
skipstone_message_append_string(message, "Nihil", 5); skipstone_message_append_string(message, "Nihil", 5);

View file

@ -15,7 +15,7 @@ typedef struct _skipstone_map {
skipstone_map *skipstone_map_new(); skipstone_map *skipstone_map_new();
void skipstone_map_destroy(skipstone_map *map); void skipstone_map_destroy(skipstone_map *map, void (*destructor)(void *));
void *skipstone_map_get(skipstone_map *map, uint16_t index); void *skipstone_map_get(skipstone_map *map, uint16_t index);

View file

@ -58,6 +58,8 @@ int skipstone_message_pack(skipstone_message *message, void *buf);
skipstone_message_service *skipstone_message_service_new(); skipstone_message_service *skipstone_message_service_new();
void skipstone_message_service_destroy(skipstone_message_service *service);
int skipstone_message_service_register(skipstone_message_service *service, int skipstone_message_service_register(skipstone_message_service *service,
uint16_t id, skipstone_message_handler *handler, void *context); uint16_t id, skipstone_message_handler *handler, void *context);
@ -70,6 +72,9 @@ int skipstone_message_service_queue_packed(skipstone_message_service *service,
int skipstone_message_service_queue(skipstone_message_service *service, int skipstone_message_service_queue(skipstone_message_service *service,
skipstone_message *message, uint16_t id); skipstone_message *message, uint16_t id);
int skipstone_message_service_next_event(skipstone_message_service *service,
skipstone_link *link);
int skipstone_message_service_run(skipstone_message_service *service, int skipstone_message_service_run(skipstone_message_service *service,
skipstone_link *link); skipstone_link *link);

View file

@ -7,12 +7,12 @@ typedef struct _skipstone_queue skipstone_queue;
skipstone_queue *skipstone_queue_new(); skipstone_queue *skipstone_queue_new();
void skipstone_queue_destroy(skipstone_queue *queue);
size_t skipstone_queue_count(skipstone_queue *queue); size_t skipstone_queue_count(skipstone_queue *queue);
int skipstone_queue_add(skipstone_queue *queue, void *value); int skipstone_queue_add(skipstone_queue *queue, void *value);
int skipstone_queue_remove(skipstone_queue *queue, void **value); int skipstone_queue_remove(skipstone_queue *queue, void **value);
void skipstone_queue_destroy(skipstone_queue *queue);
#endif /* _SKIPSTONE_QUEUE_H */ #endif /* _SKIPSTONE_QUEUE_H */

View file

@ -18,24 +18,24 @@ error_malloc_map:
return NULL; return NULL;
} }
static void _destroy(skipstone_map *map, int depth) { static void _destroy(skipstone_map *map, void (*destructor)(void *), int depth) {
uint16_t i; uint16_t i;
if (depth > SKIPSTONE_MAP_DEPTH) {
return;
}
for (i=0; i<SKIPSTONE_MAP_SLOTS; i++) { for (i=0; i<SKIPSTONE_MAP_SLOTS; i++) {
if (map[i].next) { if (map[i].next) {
_destroy(map[i].next, depth + 1); if (destructor && depth == SKIPSTONE_MAP_DEPTH) {
destructor(map[i].value);
} else {
_destroy(map[i].next, destructor, depth + 1);
}
} }
} }
free(map); free(map);
} }
void skipstone_map_destroy(skipstone_map *map) { void skipstone_map_destroy(skipstone_map *map, void (*destructor)(void *)) {
_destroy(map, 0); _destroy(map, destructor, 0);
} }
void *skipstone_map_get(skipstone_map *map, uint16_t index) { void *skipstone_map_get(skipstone_map *map, uint16_t index) {

View file

@ -18,24 +18,24 @@ error_malloc_map:
return NULL; return NULL;
} }
static void _destroy(skipstone_map *map, int depth) { static void _destroy(skipstone_map *map, void (*destructor)(void *), int depth) {
uint16_t i; uint16_t i;
if (depth > SKIPSTONE_MAP_DEPTH) {
return;
}
for (i=0; i<SKIPSTONE_MAP_SLOTS; i++) { for (i=0; i<SKIPSTONE_MAP_SLOTS; i++) {
if (map[i].next) { if (map[i].next) {
_destroy(map[i].next, depth + 1); if (destructor && depth == SKIPSTONE_MAP_DEPTH) {
destructor(map[i].value);
} else {
_destroy(map[i].next, destructor, depth + 1);
}
} }
} }
free(map); free(map);
} }
void skipstone_map_destroy(skipstone_map *map) { void skipstone_map_destroy(skipstone_map *map, void (*destructor)(void *)) {
_destroy(map, 0); _destroy(map, destructor, 0);
} }
void *skipstone_map_get(skipstone_map *map, uint16_t index) { void *skipstone_map_get(skipstone_map *map, uint16_t index) {

View file

@ -24,6 +24,7 @@ struct endpoint {
struct _skipstone_message_service { struct _skipstone_message_service {
skipstone_map *endpoints; skipstone_map *endpoints;
skipstone_queue *pending; skipstone_queue *pending;
void *buf;
}; };
skipstone_message *skipstone_message_new() { skipstone_message *skipstone_message_new() {
@ -174,6 +175,10 @@ skipstone_message_service *skipstone_message_service_new() {
goto error_malloc_service; goto error_malloc_service;
} }
if ((service->buf = malloc(SKIPSTONE_MESSAGE_MAX_PAYLOAD)) == NULL) {
goto error_malloc_buf;
}
if ((service->endpoints = skipstone_map_new()) == NULL) { if ((service->endpoints = skipstone_map_new()) == NULL) {
goto error_map_new_endpoints; goto error_map_new_endpoints;
} }
@ -185,15 +190,36 @@ skipstone_message_service *skipstone_message_service_new() {
return service; return service;
error_queue_new_pending: error_queue_new_pending:
skipstone_map_destroy(service->endpoints); skipstone_map_destroy(service->endpoints, free);
error_map_new_endpoints: error_map_new_endpoints:
free(service->buf);
error_malloc_buf:
free(service); free(service);
error_malloc_service: error_malloc_service:
return NULL; return NULL;
} }
void skipstone_message_service_destroy(skipstone_message_service *service) {
skipstone_message *message;
skipstone_map_destroy(service->endpoints, free);
while (skipstone_queue_remove(service->pending, (void **)&message)) {
skipstone_message_destroy(message);
}
skipstone_queue_destroy(service->pending);
free(service->buf);
free(service);
return;
}
int skipstone_message_service_register(skipstone_message_service *service, int skipstone_message_service_register(skipstone_message_service *service,
uint16_t id, skipstone_message_handler *handler, void *context) { uint16_t id, skipstone_message_handler *handler, void *context) {
struct endpoint *endpoint; struct endpoint *endpoint;
@ -271,41 +297,44 @@ error_malloc_packed:
return -1; return -1;
} }
int skipstone_message_service_run(skipstone_message_service *service, int skipstone_message_service_next_event(skipstone_message_service *service,
skipstone_link *link) { skipstone_link *link) {
void *buf; skipstone_message_header *message;
struct endpoint *endpoint;
uint16_t size, id;
if ((buf = malloc(SKIPSTONE_MESSAGE_MAX_PAYLOAD)) == NULL) { if (skipstone_link_recv(link, service->buf, &size, &id) < 0) {
goto error_malloc_buf; goto error_io;
} }
while (1) { if ((endpoint = skipstone_map_get(service->endpoints, id)) != NULL) {
skipstone_message_header *message; if (endpoint->handler(service, service->buf, size, id, endpoint->context) < 0) {
struct endpoint *endpoint;
uint16_t size, id;
if (skipstone_link_recv(link, buf, &size, &id) < 0) {
goto error_io; goto error_io;
} }
}
if ((endpoint = skipstone_map_get(service->endpoints, id)) != NULL) { while (skipstone_queue_remove(service->pending, (void **)&message)) {
if (endpoint->handler(service, buf, size, id, endpoint->context) < 0) { if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) {
goto error_io; goto error_io;
}
}
while (skipstone_queue_remove(service->pending, (void **)&message)) {
if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) {
goto error_io;
}
} }
} }
return 0; return 0;
error_io: error_io:
free(buf); return -1;
}
error_malloc_buf:
int skipstone_message_service_run(skipstone_message_service *service,
skipstone_link *link) {
while (1) {
if (skipstone_message_service_next_event(service, link) < 0) {
goto error_service_next_event;
}
}
return 0;
error_service_next_event:
return -1; return -1;
} }

View file

@ -24,6 +24,7 @@ struct endpoint {
struct _skipstone_message_service { struct _skipstone_message_service {
skipstone_map *endpoints; skipstone_map *endpoints;
skipstone_queue *pending; skipstone_queue *pending;
void *buf;
}; };
skipstone_message *skipstone_message_new() { skipstone_message *skipstone_message_new() {
@ -174,6 +175,10 @@ skipstone_message_service *skipstone_message_service_new() {
goto error_malloc_service; goto error_malloc_service;
} }
if ((service->buf = malloc(SKIPSTONE_MESSAGE_MAX_PAYLOAD)) == NULL) {
goto error_malloc_buf;
}
if ((service->endpoints = skipstone_map_new()) == NULL) { if ((service->endpoints = skipstone_map_new()) == NULL) {
goto error_map_new_endpoints; goto error_map_new_endpoints;
} }
@ -185,15 +190,36 @@ skipstone_message_service *skipstone_message_service_new() {
return service; return service;
error_queue_new_pending: error_queue_new_pending:
skipstone_map_destroy(service->endpoints); skipstone_map_destroy(service->endpoints, free);
error_map_new_endpoints: error_map_new_endpoints:
free(service->buf);
error_malloc_buf:
free(service); free(service);
error_malloc_service: error_malloc_service:
return NULL; return NULL;
} }
void skipstone_message_service_destroy(skipstone_message_service *service) {
skipstone_message *message;
skipstone_map_destroy(service->endpoints, free);
while (skipstone_queue_remove(service->pending, (void **)&message)) {
skipstone_message_destroy(message);
}
skipstone_queue_destroy(service->pending);
free(service->buf);
free(service);
return;
}
int skipstone_message_service_register(skipstone_message_service *service, int skipstone_message_service_register(skipstone_message_service *service,
uint16_t id, skipstone_message_handler *handler, void *context) { uint16_t id, skipstone_message_handler *handler, void *context) {
struct endpoint *endpoint; struct endpoint *endpoint;
@ -271,41 +297,44 @@ error_malloc_packed:
return -1; return -1;
} }
int skipstone_message_service_run(skipstone_message_service *service, int skipstone_message_service_next_event(skipstone_message_service *service,
skipstone_link *link) { skipstone_link *link) {
void *buf; skipstone_message_header *message;
struct endpoint *endpoint;
uint16_t size, id;
if ((buf = malloc(SKIPSTONE_MESSAGE_MAX_PAYLOAD)) == NULL) { if (skipstone_link_recv(link, service->buf, &size, &id) < 0) {
goto error_malloc_buf; goto error_io;
} }
while (1) { if ((endpoint = skipstone_map_get(service->endpoints, id)) != NULL) {
skipstone_message_header *message; if (endpoint->handler(service, service->buf, size, id, endpoint->context) < 0) {
struct endpoint *endpoint;
uint16_t size, id;
if (skipstone_link_recv(link, buf, &size, &id) < 0) {
goto error_io; goto error_io;
} }
}
if ((endpoint = skipstone_map_get(service->endpoints, id)) != NULL) { while (skipstone_queue_remove(service->pending, (void **)&message)) {
if (endpoint->handler(service, buf, size, id, endpoint->context) < 0) { if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) {
goto error_io; goto error_io;
}
}
while (skipstone_queue_remove(service->pending, (void **)&message)) {
if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) {
goto error_io;
}
} }
} }
return 0; return 0;
error_io: error_io:
free(buf); return -1;
}
error_malloc_buf:
int skipstone_message_service_run(skipstone_message_service *service,
skipstone_link *link) {
while (1) {
if (skipstone_message_service_next_event(service, link) < 0) {
goto error_service_next_event;
}
}
return 0;
error_service_next_event:
return -1; return -1;
} }

View file

@ -8,10 +8,6 @@ struct _skipstone_watch {
skipstone_map *endpoints; skipstone_map *endpoints;
}; };
struct endpoint {
};
skipstone_watch *skipstone_watch_new(skipstone_link *link) { skipstone_watch *skipstone_watch_new(skipstone_link *link) {
skipstone_watch *watch; skipstone_watch *watch;
@ -35,7 +31,7 @@ error_malloc_watch:
} }
void skipstone_watch_destroy(skipstone_watch *watch) { void skipstone_watch_destroy(skipstone_watch *watch) {
skipstone_map_destroy(watch->endpoints); skipstone_map_destroy(watch->endpoints, NULL);
free(watch); free(watch);
} }

View file

@ -8,10 +8,6 @@ struct _skipstone_watch {
skipstone_map *endpoints; skipstone_map *endpoints;
}; };
struct endpoint {
};
skipstone_watch *skipstone_watch_new(skipstone_link *link) { skipstone_watch *skipstone_watch_new(skipstone_link *link) {
skipstone_watch *watch; skipstone_watch *watch;
@ -35,7 +31,7 @@ error_malloc_watch:
} }
void skipstone_watch_destroy(skipstone_watch *watch) { void skipstone_watch_destroy(skipstone_watch *watch) {
skipstone_map_destroy(watch->endpoints); skipstone_map_destroy(watch->endpoints, NULL);
free(watch); free(watch);
} }