Pubsub core api feature (#174)

* fixed inline functions for modern C standart

* pubsub api, base version

* basic test for pubsub

* update applications.mk, add test file

* more test for pubsub

* remove unimplemented files, cleanup header file

* remove legacy tests, check unsubscribe not call cb

* implement deleting mutex, fail test

* release mutex before deleting

Co-authored-by: aanper <mail@s3f.ru>
This commit is contained in:
DrZlo13
2020-10-16 04:23:18 +10:00
committed by GitHub
parent 59740349fa
commit 05ef19b07a
10 changed files with 188 additions and 268 deletions

View File

@@ -1,6 +1,7 @@
#pragma once
#include "flipper.h"
#include "flipper_v2.h"
#include "m-list.h"
/*
== PubSub ==
@@ -11,43 +12,46 @@ and also subscriber can set `void*` context pointer that pass into
callback (you can see callback signature below).
*/
typedef void(PubSubCallback*)(void*, void*);
typedef void (*PubSubCallback)(void*, void*);
typedef struct PubSubType PubSub;
typedef struct {
PubSubCallback cb;
void* ctx;
PubSub* self;
} PubSubItem;
typedef struct {
PubSub* self;
PubSubItem* item;
} PubSubId;
LIST_DEF(list_pubsub_cb, PubSubItem, M_POD_OPLIST);
typedef struct {
PubSubItem items[NUM_OF_CALLBACKS];
PubSubId ids[NUM_OF_CALLBACKS]; ///< permanent links to item
size_t count; ///< count of callbacks
} PubSub;
struct PubSubType {
list_pubsub_cb_t items;
osMutexId_t mutex;
};
/*
To create PubSub you should create PubSub instance and call `init_pubsub`.
*/
void init_pubsub(PubSub* pubsub);
bool init_pubsub(PubSub* pubsub);
/*
Since we use dynamic memory - we must explicity delete pubsub
*/
bool delete_pubsub(PubSub* pubsub);
/*
Use `subscribe_pubsub` to register your callback.
*/
PubSubId* subscribe_pubsub(PubSub* pubsub, PubSubCallback cb, void* ctx);
PubSubItem* subscribe_pubsub(PubSub* pubsub, PubSubCallback cb, void* ctx);
/*
Use `unsubscribe_pubsub` to unregister callback.
*/
void unsubscribe_pubsub(PubSubId* pubsub_id);
bool unsubscribe_pubsub(PubSubItem* pubsub_id);
/*
Use `notify_pubsub` to notify subscribers.
*/
void notify_pubsub(PubSub* pubsub, void* arg);
bool notify_pubsub(PubSub* pubsub, void* arg);
/*