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, 0xbeef));
skipstone_map_destroy(map);
skipstone_map_destroy(map, NULL);
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, 0xbeef));
skipstone_map_destroy(map);
skipstone_map_destroy(map, NULL);
return 0;
}

View file

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

View file

@ -19,7 +19,7 @@ int main(int argc, char **argv) {
printf("%s\n", message);
skipstone_queue_destroy(queue);
skipstone_queue_destroy(queue, NULL);
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) {
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_string(message, "KMFDM", 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) {
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_string(message, "KMFDM", 5);
skipstone_message_append_string(message, "Nihil", 5);

View file

@ -15,7 +15,7 @@ typedef struct _skipstone_map {
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);

View file

@ -58,6 +58,8 @@ int skipstone_message_pack(skipstone_message *message, void *buf);
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,
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,
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,
skipstone_link *link);

View file

@ -7,12 +7,12 @@ typedef struct _skipstone_queue skipstone_queue;
skipstone_queue *skipstone_queue_new();
void skipstone_queue_destroy(skipstone_queue *queue);
size_t skipstone_queue_count(skipstone_queue *queue);
int skipstone_queue_add(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 */

View file

@ -18,24 +18,24 @@ error_malloc_map:
return NULL;
}
static void _destroy(skipstone_map *map, int depth) {
static void _destroy(skipstone_map *map, void (*destructor)(void *), int depth) {
uint16_t i;
if (depth > SKIPSTONE_MAP_DEPTH) {
return;
}
for (i=0; i<SKIPSTONE_MAP_SLOTS; i++) {
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);
}
void skipstone_map_destroy(skipstone_map *map) {
_destroy(map, 0);
void skipstone_map_destroy(skipstone_map *map, void (*destructor)(void *)) {
_destroy(map, destructor, 0);
}
void *skipstone_map_get(skipstone_map *map, uint16_t index) {

View file

@ -18,24 +18,24 @@ error_malloc_map:
return NULL;
}
static void _destroy(skipstone_map *map, int depth) {
static void _destroy(skipstone_map *map, void (*destructor)(void *), int depth) {
uint16_t i;
if (depth > SKIPSTONE_MAP_DEPTH) {
return;
}
for (i=0; i<SKIPSTONE_MAP_SLOTS; i++) {
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);
}
void skipstone_map_destroy(skipstone_map *map) {
_destroy(map, 0);
void skipstone_map_destroy(skipstone_map *map, void (*destructor)(void *)) {
_destroy(map, destructor, 0);
}
void *skipstone_map_get(skipstone_map *map, uint16_t index) {

View file

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

View file

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

View file

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

View file

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