ble works again after sleep - but we are still leaking

This commit is contained in:
geeksville 2020-02-23 13:20:46 -08:00
parent 5f88174dbf
commit f9ce6a53e1
8 changed files with 61 additions and 2 deletions

View File

@ -135,3 +135,7 @@ BLEService *createUpdateService(BLEServer *server)
return service; return service;
} }
void destroyUpdateService() {
resultC = NULL;
}

View File

@ -4,4 +4,5 @@
BLEService *createUpdateService(BLEServer* server); BLEService *createUpdateService(BLEServer* server);
void destroyUpdateService();
void bluetoothRebootCheck(); void bluetoothRebootCheck();

View File

@ -192,6 +192,7 @@ class MySecurity : public BLESecurityCallbacks
void deinitBLE() void deinitBLE()
{ {
batteryLevelC = NULL; // Don't let anyone generate bogus notifies batteryLevelC = NULL; // Don't let anyone generate bogus notifies
destroyUpdateService();
BLEDevice::deinit(false); BLEDevice::deinit(false);
btPool.reset(); btPool.reset();

View File

@ -1,6 +1,8 @@
#include "SimpleAllocator.h" #include "SimpleAllocator.h"
#include "assert.h" #include "assert.h"
SimpleAllocator *activeAllocator;
SimpleAllocator::SimpleAllocator() { reset(); } SimpleAllocator::SimpleAllocator() { reset(); }
void *SimpleAllocator::alloc(size_t size) void *SimpleAllocator::alloc(size_t size)
@ -8,6 +10,7 @@ void *SimpleAllocator::alloc(size_t size)
assert(nextFree + size <= sizeof(bytes)); assert(nextFree + size <= sizeof(bytes));
void *res = &bytes[nextFree]; void *res = &bytes[nextFree];
nextFree += size; nextFree += size;
Serial.printf("Total simple allocs %u\n", nextFree);
return res; return res;
} }
@ -18,3 +21,34 @@ void *operator new(size_t size, SimpleAllocator &p)
{ {
return p.alloc(size); return p.alloc(size);
} }
AllocatorScope::AllocatorScope(SimpleAllocator &a)
{
assert(!activeAllocator);
activeAllocator = &a;
}
AllocatorScope::~AllocatorScope()
{
assert(activeAllocator);
activeAllocator = NULL;
}
/// Global new/delete, uses a simple allocator if it is in scope
void *operator new(size_t sz) throw(std::bad_alloc)
{
void *mem = activeAllocator ? activeAllocator->alloc(sz) : malloc(sz);
if (mem)
return mem;
else
throw std::bad_alloc();
}
void operator delete(void *ptr) throw()
{
if (activeAllocator)
Serial.println("Warning: leaking an active allocator object"); // We don't properly handle this yet
else
free(ptr);
}

View File

@ -31,3 +31,12 @@ public:
void *operator new(size_t size, SimpleAllocator &p); void *operator new(size_t size, SimpleAllocator &p);
/**
* Temporarily makes the specified Allocator be used for _all_ allocations. Useful when calling library routines
* that don't know about pools
*/
class AllocatorScope {
public:
AllocatorScope(SimpleAllocator &a);
~AllocatorScope();
};

View File

@ -319,3 +319,7 @@ BLEService *createMeshBluetoothService(BLEServer *server)
return service; return service;
} }
void destroyMeshBluetoothService() {
meshFromNumCharacteristic = NULL;
}

View File

@ -5,6 +5,7 @@
#include <Arduino.h> #include <Arduino.h>
BLEService *createMeshBluetoothService(BLEServer* server); BLEService *createMeshBluetoothService(BLEServer* server);
void destroyMeshBluetoothService();
/** /**
* Tell any bluetooth clients that the number of rx packets has changed * Tell any bluetooth clients that the number of rx packets has changed

View File

@ -264,6 +264,10 @@ void setup()
void initBluetooth() void initBluetooth()
{ {
DEBUG_MSG("Starting bluetooth\n"); DEBUG_MSG("Starting bluetooth\n");
// FIXME - we are leaking like crazy
// AllocatorScope scope(btPool);
BLEServer *serve = initBLE(getDeviceName(), HW_VENDOR, str(APP_VERSION)); // FIXME, use a real name based on the macaddr BLEServer *serve = initBLE(getDeviceName(), HW_VENDOR, str(APP_VERSION)); // FIXME, use a real name based on the macaddr
createMeshBluetoothService(serve); createMeshBluetoothService(serve);
@ -284,7 +288,8 @@ void setBluetoothEnable(bool on)
} }
else else
{ {
// FIXME - we are leaking like crazy // We have to totally teardown our bluetooth objects to prevent leaks
destroyMeshBluetoothService();
deinitBLE(); deinitBLE();
} }
} }