Skip to content

Commit 24fa8e2

Browse files
authored
Merge pull request atomvm#609 from pguyot/w22/destroy-esp32-nifs-and-ports
Implement destruction of esp32 nifs/ports
2 parents f18c79a + 7edf9b5 commit 24fa8e2

File tree

12 files changed

+62
-20
lines changed

12 files changed

+62
-20
lines changed

src/platforms/esp32/components/avm_builtins/gpio_driver.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ static void IRAM_ATTR gpio_isr_handler(void *arg)
513513
xQueueSendFromISR(event_queue, &arg, NULL);
514514
}
515515

516-
REGISTER_PORT_DRIVER(gpio, gpio_driver_init, gpio_driver_create_port)
516+
REGISTER_PORT_DRIVER(gpio, gpio_driver_init, NULL, gpio_driver_create_port)
517517

518518
#endif
519519

@@ -685,7 +685,7 @@ const struct Nif *gpio_nif_get_nif(const char *nifname)
685685
return NULL;
686686
}
687687

688-
REGISTER_NIF_COLLECTION(gpio, NULL, gpio_nif_get_nif)
688+
REGISTER_NIF_COLLECTION(gpio, NULL, NULL, gpio_nif_get_nif)
689689
#endif
690690

691691
#endif

src/platforms/esp32/components/avm_builtins/i2c_driver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,6 @@ static NativeHandlerResult i2cdriver_consume_mailbox(Context *ctx)
471471
return cmd == I2CCloseCmd ? NativeTerminate : NativeContinue;
472472
}
473473

474-
REGISTER_PORT_DRIVER(i2c, i2c_driver_init, i2c_driver_create_port)
474+
REGISTER_PORT_DRIVER(i2c, i2c_driver_init, NULL, i2c_driver_create_port)
475475

476476
#endif

src/platforms/esp32/components/avm_builtins/ledc_nif.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,6 @@ const struct Nif *ledc_nif_get_nif(const char *nifname)
475475
return NULL;
476476
}
477477

478-
REGISTER_NIF_COLLECTION(ledc, NULL, ledc_nif_get_nif)
478+
REGISTER_NIF_COLLECTION(ledc, NULL, NULL, ledc_nif_get_nif)
479479

480480
#endif

src/platforms/esp32/components/avm_builtins/network_driver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,6 @@ Context *network_driver_create_port(GlobalContext *global, term opts)
822822

823823
#ifdef CONFIG_AVM_ENABLE_NETWORK_PORT_DRIVER
824824

825-
REGISTER_PORT_DRIVER(network, network_driver_init, network_driver_create_port)
825+
REGISTER_PORT_DRIVER(network, network_driver_init, NULL, network_driver_create_port)
826826

827827
#endif

src/platforms/esp32/components/avm_builtins/nvs_nif.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,6 @@ static int write_atom_c_string(Context *ctx, char *buf, size_t bufsize, term t)
308308
return 0;
309309
}
310310

311-
REGISTER_NIF_COLLECTION(nvs, nvs_nif_init, nvs_nif_get_nif)
311+
REGISTER_NIF_COLLECTION(nvs, nvs_nif_init, NULL, nvs_nif_get_nif)
312312

313313
#endif

src/platforms/esp32/components/avm_builtins/rtc_slow_nif.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,6 @@ static const struct Nif esp_rtc_slow_set_binary_nif = {
9494
.nif_ptr = nif_esp_rtc_slow_set_binary
9595
};
9696

97-
void rtc_slow_nif_init(GlobalContext *gloabl)
98-
{
99-
// no-op
100-
}
101-
10297
const struct Nif *rtc_slow_nif_get_nif(const char *nifname)
10398
{
10499
if (strcmp("esp:rtc_slow_get_binary/0", nifname) == 0) {
@@ -112,6 +107,6 @@ const struct Nif *rtc_slow_nif_get_nif(const char *nifname)
112107
return NULL;
113108
}
114109

115-
REGISTER_NIF_COLLECTION(rtc_slow, rtc_slow_nif_init, rtc_slow_nif_get_nif)
110+
REGISTER_NIF_COLLECTION(rtc_slow, NULL, NULL, rtc_slow_nif_get_nif)
116111

117112
#endif

src/platforms/esp32/components/avm_builtins/socket_driver.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ typedef struct SocketListener
6060
// To make thread model explicit, functions that are passed Context *ctx are
6161
// called from this context.
6262
static void socket_driver_init(GlobalContext *global);
63+
static void socket_driver_destroy(GlobalContext *global);
6364
static Context *socket_driver_create_port(GlobalContext *global, term opts);
6465

6566
static NativeHandlerResult socket_consume_mailbox(Context *ctx);
@@ -283,6 +284,7 @@ void socket_driver_init(GlobalContext *glb)
283284
EventListener *socket_listener = malloc(sizeof(EventListener));
284285

285286
struct ESP32PlatformData *platform = glb->platform_data;
287+
platform->socket_listener = socket_listener;
286288
socket_listener->sender = netconn_events;
287289
socket_listener->handler = socket_events_handler;
288290
sys_register_listener(glb, socket_listener);
@@ -293,6 +295,21 @@ void socket_driver_init(GlobalContext *glb)
293295
TRACE("Socket driver init: done\n");
294296
}
295297

298+
void socket_driver_destroy(GlobalContext *glb)
299+
{
300+
TRACE("Destroying socket driver\n");
301+
302+
struct ESP32PlatformData *platform = glb->platform_data;
303+
EventListener *socket_listener = platform->socket_listener;
304+
sys_unregister_listener(glb, socket_listener);
305+
vQueueDelete(socket_listener->sender);
306+
free((void *) socket_listener);
307+
308+
synclist_destroy(&platform->sockets);
309+
310+
TRACE("Socket driver destroy: done\n");
311+
}
312+
296313
static struct ListHead *socket_data_preinit(struct ESP32PlatformData *platform)
297314
{
298315
TRACE("socket_data_preinit\n");
@@ -1403,6 +1420,6 @@ static Context *socket_driver_create_port(GlobalContext *global, term opts)
14031420
return ctx;
14041421
}
14051422

1406-
REGISTER_PORT_DRIVER(socket, socket_driver_init, socket_driver_create_port)
1423+
REGISTER_PORT_DRIVER(socket, socket_driver_init, socket_driver_destroy, socket_driver_create_port)
14071424

14081425
#endif

src/platforms/esp32/components/avm_builtins/spi_driver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,6 @@ bool spi_driver_get_peripheral(term spi_port, spi_host_device_t *host_dev, Globa
649649
return true;
650650
}
651651

652-
REGISTER_PORT_DRIVER(spi, spi_driver_init, spi_driver_create_port)
652+
REGISTER_PORT_DRIVER(spi, spi_driver_init, NULL, spi_driver_create_port)
653653

654654
#endif

src/platforms/esp32/components/avm_builtins/uart_driver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,6 @@ static NativeHandlerResult uart_driver_consume_mailbox(Context *ctx)
505505
return is_closed ? NativeTerminate : NativeContinue;
506506
}
507507

508-
REGISTER_PORT_DRIVER(uart, NULL, uart_driver_create_port)
508+
REGISTER_PORT_DRIVER(uart, NULL, NULL, uart_driver_create_port)
509509

510510
#endif

src/platforms/esp32/components/avm_sys/include/esp32_sys.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@
2929

3030
#include "sys.h"
3131

32-
#define REGISTER_PORT_DRIVER(NAME, INIT_CB, CREATE_CB) \
32+
#define REGISTER_PORT_DRIVER(NAME, INIT_CB, DESTROY_CB, CREATE_CB) \
3333
struct PortDriverDef NAME##_port_driver_def = { \
3434
.port_driver_name = #NAME, \
3535
.port_driver_init_cb = INIT_CB, \
36+
.port_driver_destroy_cb = DESTROY_CB, \
3637
.port_driver_create_port_cb = CREATE_CB \
3738
}; \
3839
\
@@ -46,9 +47,10 @@
4647
port_driver_list = &NAME##_port_driver_def_list_item; \
4748
}
4849

49-
#define REGISTER_NIF_COLLECTION(NAME, INIT_CB, RESOLVE_NIF_CB) \
50+
#define REGISTER_NIF_COLLECTION(NAME, INIT_CB, DESTROY_CB, RESOLVE_NIF_CB) \
5051
struct NifCollectionDef NAME##_nif_collection_def = { \
5152
.nif_collection_init_cb = INIT_CB, \
53+
.nif_collection_destroy_cb = DESTROY_CB, \
5254
.nif_collection_resove_nif_cb = RESOLVE_NIF_CB \
5355
}; \
5456
\
@@ -75,17 +77,21 @@ struct EventListener
7577

7678
struct ESP32PlatformData
7779
{
80+
// socket_driver
81+
EventListener *socket_listener;
7882
struct SyncList sockets;
7983
struct ListHead ready_connections;
8084
};
8185

8286
typedef void (*port_driver_init_t)(GlobalContext *global);
87+
typedef void (*port_driver_destroy_t)(GlobalContext *global);
8388
typedef Context *(*port_driver_create_port_t)(GlobalContext *global, term opts);
8489

8590
struct PortDriverDef
8691
{
8792
const char *port_driver_name;
8893
const port_driver_init_t port_driver_init_cb;
94+
const port_driver_destroy_t port_driver_destroy_cb;
8995
const port_driver_create_port_t port_driver_create_port_cb;
9096
};
9197

@@ -96,11 +102,13 @@ struct PortDriverDefListItem
96102
};
97103

98104
typedef void (*nif_collection_init_t)(GlobalContext *global);
105+
typedef void (*nif_collection_destroy_t)(GlobalContext *global);
99106
typedef const struct Nif *(*nif_collection_resolve_nif_t)(const char *name);
100107

101108
struct NifCollectionDef
102109
{
103110
const nif_collection_init_t nif_collection_init_cb;
111+
const nif_collection_destroy_t nif_collection_destroy_cb;
104112
const nif_collection_resolve_nif_t nif_collection_resove_nif_cb;
105113
};
106114

@@ -122,7 +130,9 @@ void sys_event_listener_init(EventListener *listener, void *sender, event_handle
122130
void socket_init(Context *ctx, term opts);
123131

124132
void port_driver_init_all(GlobalContext *global);
133+
void port_driver_destroy_all(GlobalContext *global);
125134
void nif_collection_init_all(GlobalContext *global);
135+
void nif_collection_destroy_all(GlobalContext *global);
126136
const struct Nif *nif_collection_resolve_nif(const char *name);
127137

128138
const void *esp32_sys_mmap_partition(

0 commit comments

Comments
 (0)