JNIEXPORT void JNICALL Java_go_Seq_ensure(JNIEnv *env, jobject obj, jint size) { mem *m = mem_get(env, obj); if (m == NULL || m->off+size > m->cap) { m = mem_ensure(m, size); (*env)->SetLongField(env, obj, memptr_id, (jlong)(uintptr_t)m); } }
uint8_t *mem_write(JNIEnv *env, jobject obj, uint32_t size, uint32_t alignment) { mem *m = mem_get(env, obj); if (m == NULL) { LOG_FATAL("mem_write on NULL mem"); } if (m->off != m->len) { LOG_FATAL("write can only append to seq, size: (off=%d, len=%d, size=%d", m->off, m->len, size); } uint32_t offset = align(m->off, alignment); m = mem_ensure(m, offset - m->off + size); uint8_t *res = m->buf+offset; m->off = offset+size; m->len = offset+size; return res; }
static void *pin_array(JNIEnv *env, jobject obj, jobject arr) { mem *m = mem_get(env, obj); if (m == NULL) { m = mem_ensure(m, 64); } pinned *p = (pinned*) malloc(sizeof(pinned)); if (p == NULL) { LOG_FATAL("pin_array malloc failed"); } p->ref = (*env)->NewGlobalRef(env, arr); if ((*env)->IsInstanceOf(env, p->ref, jbytearray_clazz)) { p->ptr = (*env)->GetByteArrayElements(env, p->ref, NULL); } else { LOG_FATAL("unsupported array type"); } p->next = m->pinned; m->pinned = p; return p->ptr; }