diff options
Diffstat (limited to 'lem/io/file.c')
-rw-r--r-- | lem/io/file.c | 75 |
1 files changed, 37 insertions, 38 deletions
diff --git a/lem/io/file.c b/lem/io/file.c index b7ad297..471b4a0 100644 --- a/lem/io/file.c +++ b/lem/io/file.c @@ -18,6 +18,7 @@ struct file { struct lem_async a; + lua_State *T; int fd; int ret; union { @@ -61,7 +62,7 @@ file_new(lua_State *T, int fd, int mt) lua_setmetatable(T, -2); /* initialize userdata */ - f->a.T = NULL; + f->T = NULL; f->fd = fd; lem_inputbuf_init(&f->buf); @@ -79,14 +80,6 @@ file_gc_work(struct lem_async *a) close(gc->fd); } -static void -file_gc_reap(struct lem_async *a) -{ - struct file_gc *gc = (struct file_gc *)a; - - free(gc); -} - static int file_gc(lua_State *T) { @@ -98,7 +91,7 @@ file_gc(lua_State *T) gc->fd = f->fd; f->fd = -1; - lem_async_do(&gc->a, NULL, file_gc_work, file_gc_reap); + lem_async_do(&gc->a, file_gc_work, NULL); } return 0; @@ -133,9 +126,9 @@ static void file_close_reap(struct lem_async *a) { struct file *f = (struct file *)a; - lua_State *T = f->a.T; + lua_State *T = f->T; - f->a.T = NULL; + f->T = NULL; f->fd = -1; if (f->ret) { lem_queue(T, io_strerror(T, f->ret)); @@ -155,10 +148,11 @@ file_close(lua_State *T) f = lua_touserdata(T, 1); if (f->fd < 0) return io_closed(T); - if (f->a.T != NULL) + if (f->T != NULL) return io_busy(T); - lem_async_do(&f->a, T, file_close_work, file_close_reap); + f->T = T; + lem_async_do(&f->a, file_close_work, file_close_reap); lua_settop(T, 1); return lua_yield(T, 1); } @@ -190,13 +184,13 @@ static void file_readp_reap(struct lem_async *a) { struct file *f = (struct file *)a; - lua_State *T = f->a.T; + lua_State *T = f->T; int ret; if (f->ret) { enum lem_preason res = f->ret < 0 ? LEM_PCLOSED : LEM_PERROR; - f->a.T = NULL; + f->T = NULL; if (f->readp.p->destroy && (ret = f->readp.p->destroy(T, &f->buf, res)) > 0) { @@ -215,12 +209,12 @@ file_readp_reap(struct lem_async *a) ret = f->readp.p->process(T, &f->buf); if (ret > 0) { - f->a.T = NULL; + f->T = NULL; lem_queue(T, ret); return; } - lem_async_put(&f->a); + lem_async_run(&f->a); } static int @@ -238,7 +232,7 @@ file_readp(lua_State *T) f = lua_touserdata(T, 1); if (f->fd < 0) return io_closed(T); - if (f->a.T != NULL) + if (f->T != NULL) return io_busy(T); p = lua_touserdata(T, 2); @@ -249,8 +243,9 @@ file_readp(lua_State *T) if (ret > 0) return ret; + f->T = T; f->readp.p = p; - lem_async_do(&f->a, T, file_readp_work, file_readp_reap); + lem_async_do(&f->a, file_readp_work, file_readp_reap); return lua_yield(T, lua_gettop(T)); } @@ -273,11 +268,11 @@ static void file_write_reap(struct lem_async *a) { struct file *f = (struct file *)a; - lua_State *T = f->a.T; + lua_State *T = f->T; int top; if (f->ret) { - f->a.T = NULL; + f->T = NULL; lem_queue(T, io_strerror(T, f->ret)); return; } @@ -285,7 +280,7 @@ file_write_reap(struct lem_async *a) top = lua_gettop(T); do { if (f->write.idx == top) { - f->a.T = NULL; + f->T = NULL; lua_pushboolean(T, 1); lem_queue(T, 1); return; @@ -294,7 +289,7 @@ file_write_reap(struct lem_async *a) f->write.str = lua_tolstring(T, ++f->write.idx, &f->write.len); } while (f->write.len == 0); - lem_async_put(&f->a); + lem_async_run(&f->a); } static int @@ -319,17 +314,18 @@ file_write(lua_State *T) f = lua_touserdata(T, 1); if (f->fd < 0) return io_closed(T); - if (f->a.T != NULL) + if (f->T != NULL) return io_busy(T); if (len == 0) { lua_pushboolean(T, 1); return 1; } + f->T = T; f->write.str = str; f->write.len = len; f->write.idx = idx; - lem_async_do(&f->a, T, file_write_work, file_write_reap); + lem_async_do(&f->a, file_write_work, file_write_reap); return lua_yield(T, top); } @@ -355,9 +351,9 @@ static void file_size_reap(struct lem_async *a) { struct file *f = (struct file *)a; - lua_State *T = f->a.T; + lua_State *T = f->T; - f->a.T = NULL; + f->T = NULL; if (f->ret) { lem_queue(T, io_strerror(T, f->ret)); @@ -377,10 +373,11 @@ file_size(lua_State *T) f = lua_touserdata(T, 1); if (f->fd < 0) return io_closed(T); - if (f->a.T != NULL) + if (f->T != NULL) return io_busy(T); - lem_async_do(&f->a, T, file_size_work, file_size_reap); + f->T = T; + lem_async_do(&f->a, file_size_work, file_size_reap); lua_settop(T, 1); return lua_yield(T, 1); @@ -407,9 +404,9 @@ static void file_seek_reap(struct lem_async *a) { struct file *f = (struct file *)a; - lua_State *T = f->a.T; + lua_State *T = f->T; - f->a.T = NULL; + f->T = NULL; if (f->ret) { lem_queue(T, io_strerror(T, f->ret)); @@ -438,14 +435,15 @@ file_seek(lua_State *T) "not an integer in proper range"); if (f->fd < 0) return io_closed(T); - if (f->a.T != NULL) + if (f->T != NULL) return io_busy(T); /* flush input buffer */ lem_inputbuf_init(&f->buf); + f->T = T; f->seek.whence = mode[op]; - lem_async_do(&f->a, T, file_seek_work, file_seek_reap); + lem_async_do(&f->a, file_seek_work, file_seek_reap); lua_settop(T, 1); return lua_yield(T, 1); @@ -475,9 +473,9 @@ static void file_lock_reap(struct lem_async *a) { struct file *f = (struct file *)a; - lua_State *T = f->a.T; + lua_State *T = f->T; - f->a.T = NULL; + f->T = NULL; if (f->ret) { lem_queue(T, io_strerror(T, f->ret)); @@ -511,11 +509,12 @@ file_lock(lua_State *T) "not an integer in proper range"); if (f->fd < 0) return io_closed(T); - if (f->a.T != NULL) + if (f->T != NULL) return io_busy(T); + f->T = T; f->lock.type = mode[op]; - lem_async_do(&f->a, T, file_lock_work, file_lock_reap); + lem_async_do(&f->a, file_lock_work, file_lock_reap); lua_settop(T, 1); return lua_yield(T, 1); |