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:
parent
52d3936063
commit
cf827d8028
15 changed files with 136 additions and 87 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
16
src/map.c
16
src/map.c
|
@ -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) {
|
||||
|
|
16
src/map.c-e
16
src/map.c-e
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue