withZoneArena<R> function

R withZoneArena<R>(
  1. R computation(
      ),
    1. [Allocator wrappedAllocator = calloc]
    )

    Creates a zoned Arena to manage native resources.

    The arena is availabe through zoneArena.

    If the isolate is shut down, through Isolate.kill(), resources are not cleaned up.

    Implementation

    R withZoneArena<R>(R Function() computation,
        [Allocator wrappedAllocator = calloc]) {
      final arena = Arena(wrappedAllocator);
      var arenaHolder = [arena];
      bool isAsync = false;
      try {
        return runZoned(() {
          final result = computation();
          if (result is Future) {
            isAsync = true;
            return result.whenComplete(() {
              arena.releaseAll();
            }) as R;
          }
          return result;
        }, zoneValues: {#_arena: arenaHolder});
      } finally {
        if (!isAsync) {
          arena.releaseAll();
          arenaHolder.clear();
        }
      }
    }