Skip to content

Commit

Permalink
Merge pull request #5 from samsam2310/dev
Browse files Browse the repository at this point in the history
Reduce unused system call for WASM
samsam2310 authored Jun 6, 2020

Verified

This commit was signed with the committer’s verified signature.
trim21 Trim21
2 parents dda7a84 + 5105e8c commit 3eba807
Showing 10 changed files with 94 additions and 154 deletions.
21 changes: 12 additions & 9 deletions Makefile
Original file line number Diff line number Diff line change
@@ -5,24 +5,24 @@ TS_SRC ::= $(shell find $(SRC_DIR) -name '*.ts')
EM_VERSION = 1.39.8-upstream
EM_DOCKER = docker run --rm -w /src -v $$PWD:/src trzeci/emscripten:$(EM_VERSION)
EMCC = $(EM_DOCKER) emcc
EMXX = $(EM_DOCKER) em++
# EMXX = $(EM_DOCKER) em++
WASM2WAT = $(EM_DOCKER) wasm2wat
EMMAKE = $(EM_DOCKER) emmake
EMCONFIG = $(EM_DOCKER) emconfigure

ZBAR_DEPS = $(ZBAR_SOURCE)/make.done
ZBAR_OBJS = $(ZBAR_SOURCE)/zbar/*.o $(ZBAR_SOURCE)/zbar/*/*.o
ZBAR_INC = -I $(ZBAR_SOURCE)/include/ -I $(ZBAR_SOURCE)/
EMXX_FLAGS = -Os -s WASM=1 -Wall -Werror -s ALLOW_MEMORY_GROWTH=1 \
EMCC_FLAGS = -Os -s WASM=1 -Wall -Werror -s ALLOW_MEMORY_GROWTH=1 \
-s EXPORTED_FUNCTIONS="['_malloc']"

TSC = npx tsc
TSC_FLAGS = -p ./

all: dist/zbar.wasm .ts

debug: $(ZBAR_DEPS) dist/zbar.wast src/module.cc
$(EMXX) $(EMXX_FLAGS) -g2 -o dist/zbar-debug.js src/module.cc $(ZBAR_INC) \
debug: $(ZBAR_DEPS) dist/zbar.wast src/module.c
$(EMCC) $(EMCC_FLAGS) -g2 -o dist/zbar-debug.js src/module.c $(ZBAR_INC) \
$(ZBAR_OBJS)

dist/symbol.test.o: $(ZBAR_DEPS) src/symbol.test.c
@@ -31,20 +31,23 @@ dist/symbol.test.o: $(ZBAR_DEPS) src/symbol.test.c
dist/zbar.wast: dist/zbar.wasm
$(WASM2WAT) dist/zbar.wasm -o dist/zbar.wast

dist/zbar.wasm: $(ZBAR_DEPS) src/module.cc dist/symbol.test.o
$(EMXX) $(EMXX_FLAGS) -o dist/zbar.wasm src/module.cc $(ZBAR_INC) \
dist/zbar.wasm: $(ZBAR_DEPS) src/module.c dist/symbol.test.o
$(EMCC) $(EMCC_FLAGS) -o dist/zbar.wasm src/module.c $(ZBAR_INC) \
$(ZBAR_OBJS)
cp dist/zbar.wasm dist/zbar.wasm.bin

$(ZBAR_DEPS): $(ZBAR_SOURCE)/Makefile
cd $(ZBAR_SOURCE) && $(EMMAKE) make CFLAGS=-Os CXXFLAGS=-Os
cd $(ZBAR_SOURCE) && $(EMMAKE) make CFLAGS=-Os CXXFLAGS=-Os \
DEFS="-DZNO_MESSAGES -DHAVE_CONFIG_H"
touch -m $(ZBAR_DEPS)

$(ZBAR_SOURCE)/Makefile: $(ZBAR_SOURCE)/configure
cd $(ZBAR_SOURCE) && $(EMCONFIG) ./configure --without-x --without-jpeg \
cd $(ZBAR_SOURCE) && $(EMCONFIG) ./configure --without-x --without-xshm \
--without-xv --without-jpeg --without-libiconv-prefix \
--without-imagemagick --without-npapi --without-gtk \
--without-python --without-qt --without-xshm --disable-video \
--disable-pthread
--disable-pthread --disable-assert


$(ZBAR_SOURCE)/configure: $(ZBAR_SOURCE).tar.gz
tar zxvf $(ZBAR_SOURCE).tar.gz
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "zbar.wasm",
"version": "2.0.2",
"version": "2.0.3",
"description": "A wasm build of C/C++ Zbar barcode scanning library.",
"main": "dist/index.js",
"browser": {
3 changes: 3 additions & 0 deletions src/Image.ts
Original file line number Diff line number Diff line change
@@ -39,6 +39,9 @@ export class Image extends CppObject {
const heap = new Uint8Array(inst.memory.buffer);
const data = new Uint8Array(dataBuf);
const len = width * height;
if (len * 4 !== data.byteLength) {
throw Error('dataBuf does not match width and height');
}
const buf = inst.malloc(len);
for (let i = 0; i < len; ++i) {
const r = data[i * 4];
4 changes: 0 additions & 4 deletions src/Symbol.ts
Original file line number Diff line number Diff line change
@@ -67,10 +67,6 @@ class SymbolPtr extends TypePointer {
}

class SymbolSetPtr extends TypePointer {
get nsyms(): number {
return this.HEAP32[this.ptr32 + 1];
}

get head(): SymbolPtr | null {
const ptr = this.HEAPU32[this.ptr32 + 2];
if (!ptr) return null;
75 changes: 1 addition & 74 deletions src/instance.ts
Original file line number Diff line number Diff line change
@@ -2,101 +2,28 @@ import { loadWasmInstance } from './load';
import ZBar from './ZBar';

let inst: ZBar | null = null;
let HEAPU8 = new Uint8Array();
let HEAP32 = new Int32Array();

const UTF8Decoder = new TextDecoder('utf8');
const UTF8ArrayToString = (u8Array: Uint8Array, idx: number): string => {
var endPtr = idx;
while (u8Array[endPtr]) {
++endPtr;
}
return UTF8Decoder.decode(u8Array.subarray(idx, endPtr));
};

export const UTF8ToString = (ptr: number): string => {
return ptr ? UTF8ArrayToString(HEAPU8, ptr) : '';
};

const proc_exit = (x: number) => {
console.error('Proc_exit', x);
throw x;
};

const clock_gettime = (clk_id: number, tp: number): number => {
let now;
if (clk_id === 0) {
now = Date.now();
} else {
/* may need to set errorno, but we just skip the implementation here */
// ___setErrNo(22);
return -1;
}
const now = Date.now();
HEAP32[tp >> 2] = (now / 1e3) | 0;
HEAP32[(tp + 4) >> 2] = ((now % 1e3) * 1e3 * 1e3) | 0;
return 0;
};

const buffers = [null, [], []];
const printCharWithBuffer = (stream: number, curr: number) => {
const buffer: Array<number> = buffers[stream] || [];
if (curr === 0 || curr === 10) {
(stream === 1 ? console.log : console.error)(
UTF8ArrayToString(Uint8Array.from(buffer), 0)
);
buffer.length = 0;
} else {
buffer.push(curr);
}
};

const ___wasi_fd_write = (
fd: number,
iov: number,
iovcnt: number,
pnum: number
): number => {
var num = 0;
for (var i = 0; i < iovcnt; i++) {
var ptr = HEAP32[(iov + i * 8) >> 2];
var len = HEAP32[(iov + (i * 8 + 4)) >> 2];
for (var j = 0; j < len; j++) {
printCharWithBuffer(fd, HEAPU8[ptr + j]);
}
num += len;
}
HEAP32[pnum >> 2] = num;
return 0;
};

const ___wasi_fd_close = () => {
return 0;
};

const ___wasi_fd_seek = () => {
return 0;
};

let lastGrowTimestamp = 0;
const emscripten_notify_memory_growth = (idx: number) => {
if (lastGrowTimestamp) {
console.info('zbar.wasm: Memory Grow: ', inst!.memory.buffer.byteLength);
}
lastGrowTimestamp = Date.now();
HEAPU8 = new Uint8Array(inst!.memory.buffer);
HEAP32 = new Int32Array(inst!.memory.buffer);
};

const importObj = {
env: {
clock_gettime,
emscripten_notify_memory_growth
},
wasi_snapshot_preview1: {
fd_write: ___wasi_fd_write,
fd_close: ___wasi_fd_close,
fd_seek: ___wasi_fd_seek,
proc_exit
}
};

66 changes: 66 additions & 0 deletions src/module.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#include <emscripten.h>
#include <zbar.h>
#include <stdio.h>
#include <stdlib.h>

#define EXPORT EMSCRIPTEN_KEEPALIVE
typedef int int32_t;
typedef unsigned int uint32_t;

EXPORT zbar_image_scanner_t* ImageScanner_create() {
return zbar_image_scanner_create();
}

EXPORT void ImageScanner_destory(zbar_image_scanner_t* scanner) {
zbar_image_scanner_destroy(scanner);
}

EXPORT int ImageScanner_set_config(zbar_image_scanner_t* scanner,
int32_t symbology,
int32_t config,
int32_t value) {
return zbar_image_scanner_set_config(scanner, (zbar_symbol_type_t)(symbology),
(zbar_config_t)(config), value);
}

EXPORT void ImageScanner_enable_cache(zbar_image_scanner_t* scanner,
int enable) {
zbar_image_scanner_enable_cache(scanner, enable);
}

EXPORT void ImageScanner_recycle_image(zbar_image_scanner_t* scanner,
zbar_image_t* image) {
zbar_image_scanner_recycle_image(scanner, image);
}

EXPORT const zbar_symbol_set_t* ImageScanner_get_results(
zbar_image_scanner_t* scanner) {
return zbar_image_scanner_get_results(scanner);
}

EXPORT int ImageScanner_scan(zbar_image_scanner_t* scanner,
zbar_image_t* image) {
return zbar_scan_image(scanner, image);
}

EXPORT zbar_image_t* Image_create(uint32_t width,
uint32_t height,
uint32_t format,
void* data,
uint32_t length,
uint32_t sequence_num) {
zbar_image_t* image = zbar_image_create();
zbar_image_set_size(image, width, height);
zbar_image_set_format(image, format);
zbar_image_set_data(image, data, length, zbar_image_free_data);
zbar_image_set_sequence(image, sequence_num);
return image;
}

EXPORT void Image_destory(zbar_image_t* image) {
zbar_image_destroy(image);
}

EXPORT const zbar_symbol_set_t* Image_get_symbols(zbar_image_t* image) {
return zbar_image_get_symbols(image);
}
65 changes: 0 additions & 65 deletions src/module.cc

This file was deleted.

7 changes: 7 additions & 0 deletions src/test/Image.test.ts
Original file line number Diff line number Diff line change
@@ -25,4 +25,11 @@ test('Image', async () => {
expect(() => {
image.getSymbols();
}).toThrow('Call after destroyed');

await expect(Image.createFromRGBABuffer(2, 2, data.buffer)).rejects.toThrow(
'dataBuf does not match width and height'
);
await expect(Image.createFromGrayBuffer(1, 1, data.buffer)).rejects.toThrow(
'dataBuf does not match width and height'
);
});
1 change: 1 addition & 0 deletions src/test/ImageScanner.test.ts
Original file line number Diff line number Diff line change
@@ -14,6 +14,7 @@ test('ImageScanner', async () => {
expect(scanner.getResults()).toHaveLength(0);
scanner.recycleImage(image);
scanner.enableCache(true);
scanner.enableCache();
scanner.enableCache(false);
expect(
scanner.setConfig(
4 changes: 3 additions & 1 deletion src/test/module.test.ts
Original file line number Diff line number Diff line change
@@ -95,5 +95,7 @@ test('Barcode', async () => {
expect(res[0].decode()).toEqual('9781234567897');

scanner.destroy();
expect(scanImageData(img5, scanner)).rejects.toThrow('Call after destroyed');
await expect(scanImageData(img5, scanner)).rejects.toThrow(
'Call after destroyed'
);
});

0 comments on commit 3eba807

Please sign in to comment.