diff -urN rt_v37/cg.py rt_v38/cg.py --- rt_v37/cg.py 2018-05-12 21:24:49.000000000 +0900 +++ rt_v38/cg.py 2018-05-16 23:42:46.000000000 +0900 @@ -42,6 +42,8 @@ eye_f = way.liss_eye() wh2eye = lstx.opt( [ ax.wh_map(w, h), fcx.new(dz), ax.zoom_z(-1), ax.rot_x(90) ] ) + rt.del_cache() + n = cnt.n while cnt.up(): i = cnt.cur() @@ -61,7 +63,7 @@ img.cli_vwt.close() fn = name + '.mp4' # ! - if ut.get_size(fn) > 3*1024*1024: + if ut.exists(fn) and ut.get_size(fn) > 3*1024*1024: img.video_to_d1v3M(fn) if n > 1 and (w,h,cnt.fps) != (640,480,30): diff -urN rt_v37/dat.c rt_v38/dat.c --- rt_v37/dat.c 2018-05-09 21:31:17.000000000 +0900 +++ rt_v38/dat.c 2018-05-16 23:42:46.000000000 +0900 @@ -135,25 +135,31 @@ return bp; } +static pthread_mutex_t lock_func = PTHREAD_MUTEX_INITIALIZER; + struct data * data_get(void) { + pthread_mutex_lock(&lock_func); if(data.lst == NULL){ char *b = get_prop("data", NULL); unpack_data(b, &data); free(b); } + pthread_mutex_unlock(&lock_func); return &data; } struct lights * lights_get(void) { + pthread_mutex_lock(&lock_func); if(lights.lst == NULL){ char *b = get_prop("lights", NULL); unpack_lights(b, &lights); free(b); } + pthread_mutex_unlock(&lock_func); return &lights; } @@ -211,4 +217,17 @@ FREE_LST(*lights, "lights"); } +void +free_all(void) +{ + pthread_mutex_lock(&lock_func); + if(data.lst){ + free_data(&data); + } + if(lights.lst){ + free_lights(&lights); + } + pthread_mutex_unlock(&lock_func); +} + /* EOF */ diff -urN rt_v37/dat.h rt_v38/dat.h --- rt_v37/dat.h 2018-05-09 21:31:17.000000000 +0900 +++ rt_v38/dat.h 2018-05-16 23:42:46.000000000 +0900 @@ -68,6 +68,7 @@ void free_data_one(struct data_one *d); void free_data(struct data *data); void free_lights(struct lights *lights); +void free_all(void); /**/ diff -urN rt_v37/rt.c rt_v38/rt.c --- rt_v37/rt.c 2018-05-12 12:52:49.000000000 +0900 +++ rt_v38/rt.c 2018-05-16 23:42:46.000000000 +0900 @@ -410,6 +410,19 @@ write_n(fd, &sz, sizeof(sz)); } +void +srv_del_cache(int fd) +{ + int sz; + + read_n(fd, &sz, sizeof(sz)); + + free_all(); /* dat.c */ + + sz = 0; + write_n(fd, &sz, sizeof(sz)); +} + int main(int ac, char **av) { @@ -418,12 +431,13 @@ srv_calc_diff, srv_get_col, srv_set_cols, + srv_del_cache, }; if(arg_is(ac, av, 1, "boot")){ char *name = arg_s(ac, av, "name", "srv.rt"); int port = arg_i(ac, av, "port", -1); - int do_lock_func = 1; + int do_lock_func = 0; if(port < 0){ char *buf = get_prop(name, NULL), *bp = buf; bp = COPY_FROM_BP(bp, port); diff -urN rt_v37/rt.py rt_v38/rt.py --- rt_v37/rt.py 2018-05-12 10:29:09.000000000 +0900 +++ rt_v38/rt.py 2018-05-16 23:39:41.000000000 +0900 @@ -20,6 +20,7 @@ lights_get = lambda : ut.dic_cache( srv_dic, 'lights', lambda : val.cli.get_prop('lights') ) data_one_get = lambda idx: data_get()[idx] +del_cache = lambda : srv_dic.clear() def map_col(idx, l_nv_g, rev, sec): d = data_one_get(idx) @@ -121,8 +122,6 @@ if idx < 0: return [] - #data = ut.dic_cache( srv_dic, 'data', lambda : val.cli.get_prop('data') ) - #d = data[idx] d = data_one_get(idx) rtd = d.get('rtd', {}) crsp = l_nv_g.p @@ -202,6 +201,7 @@ { 'cmd': 'calc_diff', 'func': calc_diff, 'args': '(i4,xyz,xyz,f8)', 'rets': 'f8' }, { 'cmd': 'get_col', 'func': get_col, 'args': '(line,f8,f8,i4)', 'rets': 'col' }, { 'cmd': 'set_cols', 'func': set_cols, 'args':'(xyz,lx,f8,f8,i4,i4,i4,i4)' }, + { 'cmd': 'del_cache', 'func': del_cache }, ] cli = sock.new_client('srv.rt', cmd_infs) @@ -225,6 +225,10 @@ clis = ut.map_lst( add_cli_info, zip(clis, rates) ) +def del_cache(): + for cli in clis: + cli.del_cache() + if __name__ == "__main__": if ut.arg_is(1, 'boot'): name = ut.arg_s('name', 'srv.rt') diff -urN rt_v37/sock.c rt_v38/sock.c --- rt_v37/sock.c 2018-05-12 01:58:09.000000000 +0900 +++ rt_v38/sock.c 2018-05-16 23:38:55.000000000 +0900 @@ -163,12 +163,38 @@ return n; } +#define LOCK_FDS_N 64 +pthread_mutex_t lock_fds[ LOCK_FDS_N ]; +int lock_fds_inited = 0; + +static void +lock_fd(int fd) +{ + if(!lock_fds_inited){ + int i; + for(i=0; i 0){ @@ -185,6 +211,9 @@ if(rets_sz){ *rets_sz = sz; } + + unlock_fd(fd); + return buf; /* need free_or_stk(buf, rets_sz) diff -urN rt_v37/srvs.py rt_v38/srvs.py --- rt_v37/srvs.py 2018-05-11 05:48:58.000000000 +0900 +++ rt_v38/srvs.py 2018-05-16 23:42:46.000000000 +0900 @@ -101,6 +101,13 @@ if name not in names: print('srvs.kill ? ' + name) return + + s = 'lock_' + name + if name != 'srv.val': + boot_conn_val() + while not val.cli.s_try_lock(s): + ut.sleep(1) + if get_pid(name) < 0: cmd = get_cmd(name) print('boot ' + cmd) @@ -109,6 +116,9 @@ pid = proc.pid set_pid(name, pid) + if name != 'srv.val': + val.cli.s_unlock(s) + def setup(): boot_conn_val() for (name, inf) in infs[1:]: diff -urN rt_v37/ut.py rt_v38/ut.py --- rt_v37/ut.py 2018-05-12 12:03:56.000000000 +0900 +++ rt_v38/ut.py 2018-05-16 23:42:46.000000000 +0900 @@ -36,6 +36,7 @@ return v dic_cache = lambda d, k, f_v: d.get(k) if k in d else dic_set( d, k, f_v() ) +dic_cache_pop = lambda d, k, def_val=None: d.pop(k) if k in d else def_val if_not_set = lambda d, k, v: dic_cache(d, k, lambda : v) diff -urN rt_v37/val.py rt_v38/val.py --- rt_v37/val.py 2018-05-06 14:01:24.000000000 +0900 +++ rt_v38/val.py 2018-05-16 23:42:46.000000000 +0900 @@ -86,7 +86,7 @@ (sinf, v) = pks.ref(sinf, v, idxs) return (sinf, v) -def set_prop_bytes_idxs(s, idxs, pkd_byets): +def set_prop_bytes_idxs(s, idxs, pkd_bytes): org_str = get_prop_typ_str_idxs(s, idxs) if not idxs: @@ -121,6 +121,19 @@ v = get_prop_idxs_v(s, idxs) return v_len(v) + +# prop lock + +def s_try_lock(s): + if has_prop(s): + return 0 + typ_str = 'i4' + set_prop_bytes( s, typ_str, pks.pack_org_str(typ_str, 1) ) + return 1 + +def s_unlock(s): + del_prop(s) + cmd_infs = [ { 'cmd': 'geti', 'func': geti, 'args': '(str)', 'rets': 'i4' }, { 'cmd': 'gets', 'func': gets, 'args': '(i4)', 'rets': 'str' }, @@ -143,6 +156,10 @@ { 'cmd': 'get_prop_bytes_idxs', 'func': get_prop_bytes_idxs, 'args': '(str,[i4])', 'rets': '(str,bytes)' }, { 'cmd': 'get_prop_typ_str_idxs', 'func': get_prop_typ_str_idxs, 'args': '(str,[i4])', 'rets': 'str' }, { 'cmd': 'get_prop_n_idxs', 'func': get_prop_n_idxs, 'args': '(str,[i4])', 'rets': 'i4' }, + + # prop lock + { 'cmd': 's_try_lock', 'func': s_try_lock, 'args': '(str)', 'rets': 'i4' }, + { 'cmd': 's_unlock', 'func': s_unlock, 'args': '(str)' }, ] def new_client():