More discipline for models and requests.

- Must explicitly call new finish() API on model before compiling
  or freeing.

- Must not modify a request once start() has been called on it.

Bug: 63905942
Test: nn/runtime/tests, nn/common/operations tests
Change-Id: Ifc6e614bda647d729e8702023a02613e629ca6a0
diff --git a/runtime/NeuralNetworks.cpp b/runtime/NeuralNetworks.cpp
index 3393292..3ac8476 100644
--- a/runtime/NeuralNetworks.cpp
+++ b/runtime/NeuralNetworks.cpp
@@ -112,6 +112,7 @@
               "ANEURALNETWORKS_UNEXPECTED_NULL may have changed");
 static_assert(ANEURALNETWORKS_BAD_DATA == 4, "ANEURALNETWORKS_BAD_DATA may have changed");
 static_assert(ANEURALNETWORKS_OP_FAILED == 5, "ANEURALNETWORKS_OP_FAILED may have changed");
+static_assert(ANEURALNETWORKS_BAD_STATE == 6, "ANEURALNETWORKS_BAD_STATE may have changed");
 
 // Make sure that the constants are compatible with the values defined in
 // hardware/interfaces/neuralnetworks/1.0/types.hal.
@@ -350,6 +351,15 @@
     delete m;
 }
 
+int ANeuralNetworksModel_finish(ANeuralNetworksModel* model) {
+    if (!model) {
+        LOG(ERROR) << "ANeuralNetworksModel_finish passed a nullptr";
+        return ANEURALNETWORKS_UNEXPECTED_NULL;
+    }
+    ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
+    return m->finish();
+}
+
 int ANeuralNetworksModel_addOperand(ANeuralNetworksModel* model,
                                     const ANeuralNetworksOperandType* type) {
     if (!model || !type) {
@@ -443,13 +453,10 @@
     }
 
     ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
-    CompilationBuilder* c = m->createCompilation();
-    if (c == nullptr) {
-        *compilation = nullptr;
-        return ANEURALNETWORKS_OUT_OF_MEMORY;
-    }
+    CompilationBuilder* c = nullptr;
+    int result = m->createCompilation(&c);
     *compilation = reinterpret_cast<ANeuralNetworksCompilation*>(c);
-    return ANEURALNETWORKS_NO_ERROR;
+    return result;
 }
 
 void ANeuralNetworksCompilation_free(ANeuralNetworksCompilation* compilation) {
@@ -503,13 +510,10 @@
     }
 
     CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
-    RequestBuilder* r = c->createRequest();
-    if (r == nullptr) {
-        *request = nullptr;
-        return ANEURALNETWORKS_OUT_OF_MEMORY;
-    }
+    RequestBuilder* r = nullptr;
+    int result = c->createRequest(&r);
     *request = reinterpret_cast<ANeuralNetworksRequest*>(r);
-    return ANEURALNETWORKS_NO_ERROR;
+    return result;
 }
 
 void ANeuralNetworksRequest_free(ANeuralNetworksRequest* request) {