struct sys * sys_create(const char *path) { struct sys *sys; sys = sys_create_empty(); sys_add_frame(sys, atoms_create()); if (path == NULL || !util_file_exists(path)) return (sys); if (!read_file(sys, path, TRUE)) return (NULL); sys->is_modified = FALSE; return (sys); }
/* this function will be called once by the server during startup */ int session_mem_module_init(u_config_t *config, session_opt_t *so) { ppc_t *ppc; u_config_t *c; const char *v; /* config may be NULL */ dbg_err_if (so == NULL); /* defaults */ so->max_count = 0; /* no limits */ so->mem_limit = 0; /* no limits */ if(config && u_config_get_subkey(config, "memory", &c) == 0) { if((v = u_config_get_subkey_value(c, "max_count")) != NULL) so->max_count = atoi(v); if((v = u_config_get_subkey_value(c, "limit")) != NULL) so->mem_limit = atoi(v); } /* setup ppc parent <-> child channel */ ppc = server_get_ppc(ctx->server); dbg_err_if(ppc == NULL); /* create an atom list to store in-memory session data */ dbg_err_if(atoms_create(&so->atoms)); /* register PPC commands callbacks */ dbg_err_if(ppc_register(ppc, PPC_CMD_MSES_SAVE, session_cmd_save, so)); dbg_err_if(ppc_register(ppc, PPC_CMD_MSES_GET, session_cmd_get, so)); dbg_err_if(ppc_register(ppc, PPC_CMD_MSES_DELOLD, session_cmd_delold, so)); dbg_err_if(ppc_register(ppc, PPC_CMD_MSES_REMOVE, session_cmd_remove, so)); return 0; err: return ~0; }
apr_status_t teeterl_init() { xmod_bin_t *mp, *me; apr_initialize(); atexit(apr_terminate); apr_pool_create(&g_mempool, 0); g_xpool = xpool_make(g_mempool); atoms_create(&g_atoms, g_mempool); g_base = code_base_make(g_mempool); module_bins = apr_array_make(g_mempool, 8, sizeof(xmod_bin_t)); //teeterl_add_mod(init_xmod_bin); //... #include "premods.inc" //preload all modules registered to date mp = (xmod_bin_t *)module_bins->elts; me = mp + module_bins->nelts; while (mp < me) { atom_cache_t *cache = atom_cache_make(g_xpool); term_t code = unpack_term(mp->data, mp->size, cache, g_atoms, g_xpool); mp->is_preloaded = 1; if (!code_base_load2(g_base, code)) return APR_EBADF; mp++; } return APR_SUCCESS; }
static int load_from_xyz(struct sys *sys, const char *path, int is_new) { FILE *fp; char *buffer; struct atoms *atoms; struct atom atom; int i, n; if ((fp = fopen(path, "r")) == NULL) { error_set("unable to open %s", path); return (FALSE); } if ((buffer = util_next_line(NULL, fp)) == NULL) { error_set("unexpected end of file"); goto error; } if (sscanf(buffer, "%d", &n) != 1 || n < 1) { error_set("unexpected number of atoms"); goto error; } buffer = util_next_line(buffer, fp); for (i = 0; i < n; i++) { if ((buffer = util_next_line(buffer, fp)) == NULL) { error_set("unexpected end of file"); goto error; } if (!parse_atom_xyz(buffer, &atom)) goto error; sys_add_atom(sys, atom.name, atom.xyz); } if (!is_new) { free(buffer); fclose(fp); return (TRUE); } while ((buffer = util_next_line(buffer, fp)) != NULL) { if (util_is_empty(buffer)) continue; if (sscanf(buffer, "%d", &n) != 1 || n != sys_get_atom_count(sys)) { error_set("unexpected number of atoms"); goto error; } sys_add_frame(sys, atoms_create()); sys_set_frame(sys, sys_get_frame_count(sys) - 1); buffer = util_next_line(buffer, fp); for (i = 0; i < n; i++) { if ((buffer = util_next_line(buffer, fp)) == NULL) { error_set("unexpected end of file"); goto error; } if (!parse_atom_xyz(buffer, &atom)) goto error; atoms = sys_get_atoms(sys, sys->current_frame); atoms_add(atoms, atom.name, atom.xyz); } } sys_set_frame(sys, 0); fclose(fp); return (TRUE); error: free(buffer); fclose(fp); return (FALSE); }