From dd7595a3475407a7fa96a97393bae8c5220e8762 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Wed, 4 Jan 2012 18:41:13 +1000 Subject: Add the base Enlightenment Foundation Libraries - eina, eet, evas, ecore, embryo, and edje. Note that embryo wont be used, but I'm not sure yet if you can build edje without it. --- libraries/evas/src/bin/Makefile.am | 43 + libraries/evas/src/bin/Makefile.in | 750 +++++++++++++ libraries/evas/src/bin/evas_cserve_main.c | 1684 +++++++++++++++++++++++++++++ libraries/evas/src/bin/evas_cserve_tool.c | 160 +++ 4 files changed, 2637 insertions(+) create mode 100644 libraries/evas/src/bin/Makefile.am create mode 100644 libraries/evas/src/bin/Makefile.in create mode 100644 libraries/evas/src/bin/evas_cserve_main.c create mode 100644 libraries/evas/src/bin/evas_cserve_tool.c (limited to 'libraries/evas/src/bin') diff --git a/libraries/evas/src/bin/Makefile.am b/libraries/evas/src/bin/Makefile.am new file mode 100644 index 0000000..987e14b --- /dev/null +++ b/libraries/evas/src/bin/Makefile.am @@ -0,0 +1,43 @@ +MAINTAINERCLEANFILES = Makefile.in + +if EVAS_CSERVE + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/lib/cserve \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ +@EINA_CFLAGS@ \ +@FREETYPE_CFLAGS@ \ +@FRIBIDI_CFLAGS@ \ +@EET_CFLAGS@ \ +@FONTCONFIG_CFLAGS@ \ +@pthread_cflags@ \ +@PIXMAN_CFLAGS@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +bin_PROGRAMS = evas_cserve evas_cserve_tool + +evas_cserve_SOURCES = \ +evas_cserve_main.c + +evas_cserve_LDADD = \ +$(top_builddir)/src/lib/libevas.la \ +@pthread_libs@ \ +@EINA_LIBS@ + +evas_cserve_tool_LDFLAGS = + +evas_cserve_tool_SOURCES = \ +evas_cserve_tool.c + +evas_cserve_tool_LDADD = \ +$(top_builddir)/src/lib/libevas.la \ +@pthread_libs@ \ +@EINA_LIBS@ + +endif diff --git a/libraries/evas/src/bin/Makefile.in b/libraries/evas/src/bin/Makefile.in new file mode 100644 index 0000000..885bfc4 --- /dev/null +++ b/libraries/evas/src/bin/Makefile.in @@ -0,0 +1,750 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@EVAS_CSERVE_TRUE@bin_PROGRAMS = evas_cserve$(EXEEXT) \ +@EVAS_CSERVE_TRUE@ evas_cserve_tool$(EXEEXT) +subdir = src/bin +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \ + $(top_srcdir)/m4/efl_coverage.m4 \ + $(top_srcdir)/m4/efl_doxygen.m4 \ + $(top_srcdir)/m4/efl_fnmatch.m4 \ + $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \ + $(top_srcdir)/m4/evas_check_engine.m4 \ + $(top_srcdir)/m4/evas_check_loader.m4 \ + $(top_srcdir)/m4/evas_converter.m4 \ + $(top_srcdir)/m4/evas_dither.m4 \ + $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am__evas_cserve_SOURCES_DIST = evas_cserve_main.c +@EVAS_CSERVE_TRUE@am_evas_cserve_OBJECTS = evas_cserve_main.$(OBJEXT) +evas_cserve_OBJECTS = $(am_evas_cserve_OBJECTS) +@EVAS_CSERVE_TRUE@evas_cserve_DEPENDENCIES = \ +@EVAS_CSERVE_TRUE@ $(top_builddir)/src/lib/libevas.la +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am__evas_cserve_tool_SOURCES_DIST = evas_cserve_tool.c +@EVAS_CSERVE_TRUE@am_evas_cserve_tool_OBJECTS = \ +@EVAS_CSERVE_TRUE@ evas_cserve_tool.$(OBJEXT) +evas_cserve_tool_OBJECTS = $(am_evas_cserve_tool_OBJECTS) +@EVAS_CSERVE_TRUE@evas_cserve_tool_DEPENDENCIES = \ +@EVAS_CSERVE_TRUE@ $(top_builddir)/src/lib/libevas.la +evas_cserve_tool_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(evas_cserve_tool_LDFLAGS) $(LDFLAGS) \ + -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(evas_cserve_SOURCES) $(evas_cserve_tool_SOURCES) +DIST_SOURCES = $(am__evas_cserve_SOURCES_DIST) \ + $(am__evas_cserve_tool_SOURCES_DIST) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@ +DIRECTFB_LIBS = @DIRECTFB_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@ +ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@ +EDB_CFLAGS = @EDB_CFLAGS@ +EDB_LIBS = @EDB_LIBS@ +EDJE_CFLAGS = @EDJE_CFLAGS@ +EDJE_LIBS = @EDJE_LIBS@ +EET_CFLAGS = @EET_CFLAGS@ +EET_LIBS = @EET_LIBS@ +EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@ +EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@ +EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@ +EGREP = @EGREP@ +EINA_CFLAGS = @EINA_CFLAGS@ +EINA_LIBS = @EINA_LIBS@ +EVAS_CFLAGS = @EVAS_CFLAGS@ +EVAS_LIBS = @EVAS_LIBS@ +EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@ +EVIL_CFLAGS = @EVIL_CFLAGS@ +EVIL_LIBS = @EVIL_LIBS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GL_EET_CFLAGS = @GL_EET_CFLAGS@ +GL_EET_LIBS = @GL_EET_LIBS@ +GREP = @GREP@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@ +LINEBREAK_LIBS = @LINEBREAK_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MODULE_ARCH = @MODULE_ARCH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIXMAN_CFLAGS = @PIXMAN_CFLAGS@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHM_OPEN_LINK = @SHM_OPEN_LINK@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +VMAJ = @VMAJ@ +WIN32_CFLAGS = @WIN32_CFLAGS@ +WIN32_CPPFLAGS = @WIN32_CPPFLAGS@ +XCB_CFLAGS = @XCB_CFLAGS@ +XCB_GL_CFLAGS = @XCB_GL_CFLAGS@ +XCB_GL_LIBS = @XCB_GL_LIBS@ +XCB_LIBS = @XCB_LIBS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +altivec_cflags = @altivec_cflags@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dlopen_libs = @dlopen_libs@ +docdir = @docdir@ +dvidir = @dvidir@ +edje_cc = @edje_cc@ +efl_doxygen = @efl_doxygen@ +efl_have_doxygen = @efl_have_doxygen@ +evas_engine_buffer_cflags = @evas_engine_buffer_cflags@ +evas_engine_buffer_libs = @evas_engine_buffer_libs@ +evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@ +evas_engine_direct3d_libs = @evas_engine_direct3d_libs@ +evas_engine_directfb_cflags = @evas_engine_directfb_cflags@ +evas_engine_directfb_libs = @evas_engine_directfb_libs@ +evas_engine_fb_cflags = @evas_engine_fb_cflags@ +evas_engine_fb_libs = @evas_engine_fb_libs@ +evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@ +evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@ +evas_engine_gl_common_libs = @evas_engine_gl_common_libs@ +evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@ +evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@ +evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@ +evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@ +evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@ +evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@ +evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@ +evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@ +evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@ +evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@ +evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@ +evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@ +evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@ +evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@ +evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@ +evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@ +evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@ +evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@ +evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@ +evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@ +evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@ +evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@ +evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@ +evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@ +evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@ +evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@ +evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@ +evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@ +evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@ +evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@ +evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@ +evas_image_loader_edb_libs = @evas_image_loader_edb_libs@ +evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@ +evas_image_loader_eet_libs = @evas_image_loader_eet_libs@ +evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@ +evas_image_loader_generic_libs = @evas_image_loader_generic_libs@ +evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@ +evas_image_loader_gif_libs = @evas_image_loader_gif_libs@ +evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@ +evas_image_loader_ico_libs = @evas_image_loader_ico_libs@ +evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@ +evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@ +evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@ +evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@ +evas_image_loader_png_cflags = @evas_image_loader_png_cflags@ +evas_image_loader_png_libs = @evas_image_loader_png_libs@ +evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@ +evas_image_loader_psd_libs = @evas_image_loader_psd_libs@ +evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@ +evas_image_loader_svg_libs = @evas_image_loader_svg_libs@ +evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@ +evas_image_loader_tga_libs = @evas_image_loader_tga_libs@ +evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@ +evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@ +evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@ +evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@ +evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@ +evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@ +exec_prefix = @exec_prefix@ +have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@ +have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@ +have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@ +have_evas_engine_software_x11 = @have_evas_engine_software_x11@ +have_evas_engine_software_xcb = @have_evas_engine_software_xcb@ +have_evas_engine_software_xlib = @have_evas_engine_software_xlib@ +have_lcov = @have_lcov@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +lt_enable_auto_import = @lt_enable_auto_import@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfig_requires_private = @pkgconfig_requires_private@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_cflags = @pthread_cflags@ +pthread_libs = @pthread_libs@ +release_info = @release_info@ +requirement_evas = @requirement_evas@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +version_info = @version_info@ +MAINTAINERCLEANFILES = Makefile.in +@EVAS_CSERVE_TRUE@AM_CPPFLAGS = \ +@EVAS_CSERVE_TRUE@-I. \ +@EVAS_CSERVE_TRUE@-I$(top_srcdir)/src/lib \ +@EVAS_CSERVE_TRUE@-I$(top_srcdir)/src/lib/include \ +@EVAS_CSERVE_TRUE@-I$(top_srcdir)/src/lib/cserve \ +@EVAS_CSERVE_TRUE@-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +@EVAS_CSERVE_TRUE@-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +@EVAS_CSERVE_TRUE@-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ +@EVAS_CSERVE_TRUE@@EINA_CFLAGS@ \ +@EVAS_CSERVE_TRUE@@FREETYPE_CFLAGS@ \ +@EVAS_CSERVE_TRUE@@FRIBIDI_CFLAGS@ \ +@EVAS_CSERVE_TRUE@@EET_CFLAGS@ \ +@EVAS_CSERVE_TRUE@@FONTCONFIG_CFLAGS@ \ +@EVAS_CSERVE_TRUE@@pthread_cflags@ \ +@EVAS_CSERVE_TRUE@@PIXMAN_CFLAGS@ + +@EVAS_CSERVE_TRUE@AM_CFLAGS = @WIN32_CFLAGS@ +@EVAS_CSERVE_TRUE@evas_cserve_SOURCES = \ +@EVAS_CSERVE_TRUE@evas_cserve_main.c + +@EVAS_CSERVE_TRUE@evas_cserve_LDADD = \ +@EVAS_CSERVE_TRUE@$(top_builddir)/src/lib/libevas.la \ +@EVAS_CSERVE_TRUE@@pthread_libs@ \ +@EVAS_CSERVE_TRUE@@EINA_LIBS@ + +@EVAS_CSERVE_TRUE@evas_cserve_tool_LDFLAGS = +@EVAS_CSERVE_TRUE@evas_cserve_tool_SOURCES = \ +@EVAS_CSERVE_TRUE@evas_cserve_tool.c + +@EVAS_CSERVE_TRUE@evas_cserve_tool_LDADD = \ +@EVAS_CSERVE_TRUE@$(top_builddir)/src/lib/libevas.la \ +@EVAS_CSERVE_TRUE@@pthread_libs@ \ +@EVAS_CSERVE_TRUE@@EINA_LIBS@ + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/bin/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +evas_cserve$(EXEEXT): $(evas_cserve_OBJECTS) $(evas_cserve_DEPENDENCIES) + @rm -f evas_cserve$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(evas_cserve_OBJECTS) $(evas_cserve_LDADD) $(LIBS) +evas_cserve_tool$(EXEEXT): $(evas_cserve_tool_OBJECTS) $(evas_cserve_tool_DEPENDENCIES) + @rm -f evas_cserve_tool$(EXEEXT) + $(AM_V_CCLD)$(evas_cserve_tool_LINK) $(evas_cserve_tool_OBJECTS) $(evas_cserve_tool_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_cserve_main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_cserve_tool.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libraries/evas/src/bin/evas_cserve_main.c b/libraries/evas/src/bin/evas_cserve_main.c new file mode 100644 index 0000000..7d4d95a --- /dev/null +++ b/libraries/evas/src/bin/evas_cserve_main.c @@ -0,0 +1,1684 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#ifdef _WIN32 +# include +#endif + +#ifdef BUILD_PTHREAD +#include +#endif + +#include "Evas.h" +#include "evas_cs.h" + +#define D(...) EINA_LOG_DOM_DBG(_evas_cserve_bin_log_dom, __VA_ARGS__) +#ifdef ERR +#undef ERR +#endif +#define ERR(...) EINA_LOG_DOM_ERR(_evas_cserve_bin_log_dom, __VA_ARGS__) +#ifdef DBG +#undef DBG +#endif +#define DBG(...) EINA_LOG_DOM_DBG(_evas_cserve_bin_log_dom, __VA_ARGS__) +#ifdef WRN +#undef WRN +#endif +#define WRN(...) EINA_LOG_DOM_WARN(_evas_cserve_bin_log_dom, __VA_ARGS__) + +#ifdef CSERVE_BIN_DEFAULT_COLOR +#undef CSERVE_BIN_DEFAULT_COLOR +#endif +#define CSERVE_BIN_DEFAULT_COLOR EINA_COLOR_BLUE +// fixme:'s +// +// preload - make it work (both) + +// +// pants! + +typedef struct _Img Img; +typedef struct _Lopt Lopt; +typedef struct _Load_Inf Load_Inf; + +struct _Lopt +{ + int scale_down_by; // if > 1 then use this + double dpi; // if > 0.0 use this + int w, h; // if > 0 use this + struct { + int x, y, w, h; + } region; +}; + +struct _Img +{ + Image_Entry ie; + int ref; + int dref; + int usage; + Mem *mem; + const char *key; + time_t cached; + struct { + const char *file; + const char *key; + time_t modtime; + time_t last_stat; + } file; + struct { + int load1saved, load2saved; + double load1, load2; + } stats; + Lopt load_opts; + struct { + int w, h; + void *data; + Eina_Bool alpha : 1; + } image; + int incache; + LK(lock); + Eina_Bool dead : 1; + Eina_Bool active : 1; + Eina_Bool useless : 1; + Eina_Bool killme : 1; +}; + +struct _Load_Inf +{ + Img *img; + Client *c; +}; + +// config +static int stat_res_interval = 2; + +static time_t t_now = 0; + +static int server_id = 0; + +LK(strshr_freeme_lock); +static int strshr_freeme_count = 0; +static int strshr_freeme_alloc = 0; +static const char **strshr_freeme = NULL; + +static int cache_cleanme = 0; +static Evas_Cache_Image *cache = NULL; + +static Eina_Hash *active_images = NULL; +LK(cache_lock); +static Eina_List *cache_images = NULL; +static int cache_usage = 0; +static int cache_max_usage = 1 * 1024; +static int cache_max_adjust = 0; +static int cache_item_timeout = -1; +static int cache_item_timeout_check = -1; +static Mem *stat_mem = NULL; +static int _evas_cserve_bin_log_dom = -1; +static Eina_List *stat_mems = NULL; + +static void cache_clean(void); + +#ifndef _WIN32 +static double +get_time(void) +{ + struct timeval timev; + + gettimeofday(&timev, NULL); + return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000); +} +#else +static double +get_time(void) +{ + return (double)GetTickCount()/1000.0; +} +#endif + +static int mem_total = 0; +static int mem_free = 0; +static int mem_buffers = 0; +static int mem_cached = 0; + +static void +meminfo_check(void) +{ + FILE *f; + char buf[1024]; + int v; + + f = fopen("/proc/meminfo", "r"); + if (!f) return; + if (!fgets(buf, sizeof(buf), f)) goto done; + v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done; + mem_total = v; + if (!fgets(buf, sizeof(buf), f)) goto done; + v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done; + mem_free = v; + if (!fgets(buf, sizeof(buf), f)) goto done; + v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done; + mem_buffers = v; + if (!fgets(buf, sizeof(buf), f)) goto done; + v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done; + mem_cached = v; + done: + fclose(f); +} + +static int stats_dirty = 0; +static int saved_loads = 0; +static double saved_load_time = 0; +static double saved_load_lifetime = 0; + +static int saved_loaddatas = 0; +static double saved_loaddata_time = 0; +static double saved_loaddata_lifetime = 0; + +static int saved_memory = 0; +static int saved_memory_peak = 0; +static int alloced_memory = 0; +static int alloced_memory_peak = 0; +static int real_memory = 0; +static int real_memory_peak = 0; + +static Eina_Bool +stats_hash_image_cb(const Eina_Hash *hash __UNUSED__, + const void *key __UNUSED__, + void *data, void *fdata __UNUSED__) +{ + Img *img = data; + + + saved_load_time += img->stats.load1 * img->stats.load1saved; + saved_loaddata_time += img->stats.load2 * img->stats.load2saved; + if (img->ref > 1) + saved_memory += img->image.w * img->image.h * sizeof(DATA32) * (img->ref - 1); + if (img->mem) + { + alloced_memory += img->image.w * img->image.h * sizeof(DATA32); + real_memory += (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) >> 12) << 12; + } + return 1; +} + +static void +stats_calc(void) +{ + Img *img; + Eina_List *l; + + if (!stats_dirty) return; + stats_dirty = 0; + saved_loads = 0; + saved_load_time = 0; + saved_loaddatas = 0; + saved_loaddata_time = 0; + saved_memory = 0; + alloced_memory = 0; + real_memory = 0; + + if (active_images) + eina_hash_foreach(active_images, stats_hash_image_cb, NULL); + LKL(cache_lock); + EINA_LIST_FOREACH(cache_images, l, img) + { + saved_loads += img->stats.load1saved; + saved_load_time += img->stats.load1 * img->stats.load1saved; + saved_loaddatas += img->stats.load2saved; + saved_loaddata_time += img->stats.load2 * img->stats.load2saved; + if (img->mem) + { + alloced_memory += img->image.w * img->image.h * sizeof(DATA32); + real_memory += (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) >> 12) << 12; + } + } + LKU(cache_lock); + if (saved_memory > saved_memory_peak) + saved_memory_peak = saved_memory; + if (real_memory > real_memory_peak) + real_memory_peak = real_memory; + if (alloced_memory > alloced_memory_peak) + alloced_memory_peak = alloced_memory; +} + +static void +stats_update(void) +{ + stats_dirty = 1; +} + +static void +stats_lifetime_update(Img *img) +{ + saved_load_lifetime += img->stats.load1 * img->stats.load1saved; + saved_loaddata_lifetime += img->stats.load2 * img->stats.load2saved; +} + +static void +stat_clean(Mem *m) +{ + int *ints; + int size, pid, *ids, count, i; + + ints = (int *)m->data; + size = ints[0]; + if (!evas_cserve_mem_resize(m, size)) return; + ints = (int *)m->data; + pid = ints[1]; + count = (size - (2 * sizeof(int))) / sizeof(int); + ids = ints + 2; + for (i = 0; i < count; i++) + evas_cserve_mem_del(pid, ids[i]); +} + +static int +stat_init(Mem *m) +{ + int *ints; + + ints = (int *)m->data; + + if (!evas_cserve_mem_resize(m, 2 * sizeof(int))) return 0; + ints[0] = 2 * sizeof(int); + ints[1] = getpid(); + msync(m->data, 2 * sizeof(int), MS_SYNC | MS_INVALIDATE); + return 1; +} + +static int +stat_update(Mem *m) +{ + Eina_List *l; + Mem *m2; + int *ints, *ids, i; + + ints = (int *)m->data; + ints[0] = (2 * sizeof(int)) + (eina_list_count(stat_mems) * sizeof(int)); + if (!evas_cserve_mem_resize(m, ints[0])) return 0; + ints = (int *)m->data; + ids = ints + 2; + i = 0; + EINA_LIST_FOREACH(stat_mems, l, m2) + { + ids[i] = m2->id; + i++; + } + msync(m->data, ints[0], MS_SYNC | MS_INVALIDATE); + return 1; +} + +static Image_Entry * +_img_alloc(void) +{ + Img *img; + + img = calloc(1, sizeof(Img)); + LKI(img->lock); + return (Image_Entry *)img; +} + +static void +_img_dealloc(Image_Entry *ie) +{ + Img *img = (Img *)ie; + LKD(img->lock); + free(img); +} + +static int +_img_surface_alloc(Image_Entry *ie, unsigned int w, unsigned int h) +{ + Img *img = (Img *)ie; + + img->mem = evas_cserve_mem_new(w * h * sizeof(DATA32), NULL); + if (!img->mem) return -1; + img->image.data = img->mem->data + img->mem->offset; + + stat_mems = eina_list_append(stat_mems, img->mem); + stat_update(stat_mem); + return 0; +} + +static void +_img_surface_delete(Image_Entry *ie) +{ + Img *img = (Img *)ie; + + if (!img->mem) return; + + stat_mems = eina_list_remove(stat_mems, img->mem); + stat_update(stat_mem); + + evas_cserve_mem_free(img->mem); + img->mem = NULL; + img->image.data = NULL; +} + +static DATA32 * +_img_surface_pixels(Image_Entry *ie) +{ + Img *img = (Img *)ie; + + return img->image.data; +} + +static int +_img_load(Image_Entry *ie) +{ + return evas_common_load_rgba_image_module_from_file(ie); +} + +static void +_img_unload(Image_Entry *ie __UNUSED__) +{ +} + +static void +_img_dirty_region(Image_Entry *ie __UNUSED__, unsigned int x __UNUSED__, unsigned int y __UNUSED__, unsigned int w __UNUSED__, unsigned int h __UNUSED__) +{ +} + +static int +_img_dirty(Image_Entry *dst __UNUSED__, const Image_Entry *src __UNUSED__) +{ + return 0; +} + +static int +_img_size_set(Image_Entry *dst __UNUSED__, const Image_Entry *src __UNUSED__, unsigned int w __UNUSED__, unsigned int h __UNUSED__) +{ + return 0; +} + +static int +_img_copied_data(Image_Entry *ie __UNUSED__, unsigned int w __UNUSED__, unsigned int h __UNUSED__, DATA32 *image_data __UNUSED__, int alpha __UNUSED__, int cspace __UNUSED__) +{ + return 0; +} + +static int +_img_data(Image_Entry *ie __UNUSED__, unsigned int w __UNUSED__, unsigned int h __UNUSED__, DATA32 *image_data __UNUSED__, int alpha __UNUSED__, int cspace __UNUSED__) +{ + return 0; +} + +static int +_img_color_space(Image_Entry *ie __UNUSED__, int cspace __UNUSED__) +{ + return 0; +} + +static int +_img_load_data(Image_Entry *ie) +{ + return evas_common_load_rgba_image_data_from_file(ie); +} + +static int +_img_mem_size_get(Image_Entry *ie __UNUSED__) +{ + return 1; +} + +static void +img_init(void) +{ + const Evas_Cache_Image_Func cache_funcs = + { + _img_alloc,//Image_Entry *(*alloc)(void); + _img_dealloc,//void (*dealloc)(Image_Entry *im); + /* The cache provide some helpers for surface manipulation. */ + _img_surface_alloc,//int (*surface_alloc)(Image_Entry *im, unsigned int w, unsigned int h); + _img_surface_delete,//void (*surface_delete)(Image_Entry *im); + _img_surface_pixels,//DATA32 *(*surface_pixels)(Image_Entry *im); + /* The cache is doing the allocation and deallocation, you must just do the rest. */ + _img_load,//int (*constructor)(Image_Entry *im); + _img_unload,//void (*destructor)(Image_Entry *im); + _img_dirty_region,//void (*dirty_region)(Image_Entry *im, unisnged int x, unisnged int y, unisnged int w, unsigned int h); + /* Only called when references > 0. Need to provide a fresh copie of im. */ + /* The destination surface does have a surface, but no allocated pixel data. */ + _img_dirty,//int (*dirty)(Image_Entry *dst, const Image_Entry *src); + /* Only called when references == 1. We will call drop on im'. */ + /* The destination surface does not have any surface. */ + _img_size_set,//int (*size_set)(Image_Entry *dst, const Image_Entry *src, unisnged int w, unisnged int h); + /* The destination surface does not have any surface. */ + _img_copied_data,//int (*copied_data)(Image_Entry *dst, unisnged int w, unisnged int h, DATA32 *image_data, int alpha, int cspace); + /* The destination surface does not have any surface. */ + _img_data,//int (*data)(Image_Entry *dst, unsigned int w, unisgned int h, DATA32 *image_data, int alpha, int cspace); + _img_color_space,//int (*color_space)(Image_Entry *dst, int cspace); + /* This function need to update im->w and im->h. */ + _img_load_data,//int (*load)(Image_Entry *im); + _img_mem_size_get,//int (*mem_size_get)(Image_Entry *im); + NULL,//void (*debug)(const char *context, Image_Entry *im); + }; + + active_images = eina_hash_string_superfast_new(NULL); + cache = evas_cache_image_init(&cache_funcs); + LKI(cache_lock); + LKI(strshr_freeme_lock); +} + +static void +img_shutdown(void) +{ + evas_cache_image_shutdown(cache); + cache = NULL; + // FIXME: shutdown properly + LKD(strshr_freeme_lock); + LKI(cache_lock); +} + +static Img * +img_new(const char *file, const char *key, RGBA_Image_Loadopts *load_opts, const char *bufkey) +{ + Img *img; + struct stat st; + int ret; + Image_Entry *ie; + int err = 0; + double t; + + DBG("... stat %s", file); + ret = stat(file, &st); + if (ret < 0) return NULL; + DBG("... load header"); + t = get_time(); + ie = evas_cache_image_request(cache, file, key, load_opts, &err); + t = get_time() - t; + DBG("... header done"); + if (!ie) return NULL; + DBG("... ie->cache = %p", ie->cache); + img = (Img *)ie; + img->stats.load1 = t; + img->key = eina_stringshare_add(bufkey); + img->file.modtime = st.st_mtime; + img->file.last_stat = t_now; + img->file.file = eina_stringshare_add(file); + if (key) img->file.key = eina_stringshare_add(key); + img->load_opts.scale_down_by = load_opts->scale_down_by; + img->load_opts.dpi = load_opts->dpi; + img->load_opts.w = load_opts->w; + img->load_opts.h = load_opts->h; + img->image.w = ie->w; + img->image.h = ie->h; + img->image.alpha = ie->flags.alpha; + img->ref = 1; + img->active = 1; + img->usage = sizeof(Img) + strlen(img->key) + 1 + + strlen(img->file.file) + 1; + if (img->file.key) img->usage += strlen(img->file.key) + 1; + eina_hash_direct_add(active_images, img->key, img); + return img; +} + +static void +img_loaddata(Img *img) +{ + double t; + + if (img->mem) return; + t = get_time(); + LKL(cache_lock); + evas_cache_image_load_data((Image_Entry *)img); + t = get_time() - t; + img->stats.load2 = t; + if (img->image.data) + msync(img->image.data, img->image.w * img->image.h * sizeof(DATA32), MS_SYNC | MS_INVALIDATE); + if (!img->active) cache_usage -= img->usage; + img->usage += + (4096 * (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) / 4096)) + + sizeof(Mem); + if (!img->active) cache_usage += img->usage; + LKU(cache_lock); + cache_clean(); +} + +static void +img_free(Img *img) +{ + if (img->incache > 0) + { + ERR("EEEEEEEEEEEEEEEEK!"); + ERR("EEEEEEEEEEEEEEEEK! %p '%s' still in cache", + img, img->file.file); + ERR("EEEEEEEEEEEEEEEEK!"); + return; + } + stats_lifetime_update(img); + stats_update(); + + LKL(strshr_freeme_lock); + strshr_freeme_count += 3; + if (strshr_freeme_count > strshr_freeme_alloc) + { + const char **tmp; + + strshr_freeme_alloc += 32; + tmp = realloc(strshr_freeme, strshr_freeme_alloc * sizeof(const char **)); + if (tmp) strshr_freeme = tmp; + else + { + ERR("realloc of strshr_freeme failed for %i items", + strshr_freeme_alloc); + strshr_freeme_alloc -= 32; + strshr_freeme_count -= 3; + return; + } + } + strshr_freeme[strshr_freeme_count - 3] = img->key; + strshr_freeme[strshr_freeme_count - 2] = img->file.file; + strshr_freeme[strshr_freeme_count - 1] = img->file.key; + LKU(strshr_freeme_lock); + + evas_cache_image_drop((Image_Entry *)img); +} + +static void +cache_clean(void) +{ + DBG("... cache clean!!! do"); + LKL(cache_lock); + while ((cache_usage > ((cache_max_usage + cache_max_adjust) * 1024)) && + (cache_images)) + { + Img *img; + Eina_List *l; + + DBG("... clean loop %i > %i", cache_usage, (cache_max_usage + cache_max_adjust) * 1024); + l = eina_list_last(cache_images); // THREAD: called from thread. happens to be safe as it uses no unlocked shared resources + if (!l) break; + img = l->data; + if (!img) break; + LKL(img->lock); + DBG("... REMOVE %p '%s'", img, img->file.file); +#ifdef BUILD_PTHREAD + img->killme = 1; + img->useless = 1; + img->dead = 1; + cache_cleanme++; + LKU(img->lock); +#else + cache_images = eina_list_remove_list(cache_images, l); // FIXME: called from thread + img->incache--; + cache_usage -= img->usage; + DBG("... IMG FREE %p", img); + img_free(img); +#endif + } + LKU(cache_lock); +} + +static void +cache_timeout(time_t t) +{ + Eina_List *l, *l_next; + Img *img; + + if (cache_item_timeout < 0) return; + LKL(cache_lock); + EINA_LIST_FOREACH_SAFE(cache_images, l, l_next, img) + { + LKL(img->lock); + if ((t - img->cached) > cache_item_timeout) + { + cache_images = eina_list_remove_list(cache_images, l); + img->incache--; + cache_usage -= img->usage; + img_free(img); + } + else + LKU(img->lock); + } + LKU(cache_lock); +} + +static void +mem_cache_adjust(void) +{ + int pval = cache_max_adjust; + int max = 0; + int mem_used; + + if (mem_total <= 0) return; + mem_used = mem_total - mem_free - mem_cached - mem_buffers; +#if 0 // this lets the image cache to grow to fill all real free ram, if + // there is any (ie ram unused by disk cache) + if (mem_free < mem_total) + { + cache_max_adjust = mem_free; + return; + } +#endif + + max = ((mem_free + mem_cached + mem_buffers) / 8) - cache_max_usage; + if (max < 0) max = 0; + if (max > cache_max_usage) max = cache_max_usage; + cache_max_adjust = max - cache_max_usage; + + if (cache_max_adjust < -cache_max_usage) + cache_max_adjust = -cache_max_usage; + DBG("... cache_max_adjust = %i", cache_max_adjust); + if (pval != cache_max_adjust) + { + DBG("... cache clean"); + // FIXME lock problem + cache_clean(); + } +} + +static void +img_cache(Img *img) +{ + eina_hash_del(active_images, img->key, img); + if (img->dead) + { + DBG("... img %p '%s' dead", img , img->file.file); + img_free(img); + return; + } + if ((cache_usage + img->usage) > ((cache_max_usage + cache_max_adjust) * 1024)) + { + DBG("... img %p '%s' too big for cache", img , img->file.file); + img_free(img); + return; + } + DBG("... img %p '%s' cached += %i", img , img->file.file, img->usage); + if (img->incache > 0) + { + ERR("EEEEEEEEEEEEEEEEK!"); + ERR("EEEEEEEEEEEEEEEEK! %p '%s' already in cache", + img, img->file.file); + ERR("EEEEEEEEEEEEEEEEK!"); + return; + } + LKL(cache_lock); + cache_images = eina_list_prepend(cache_images, img); + LKU(cache_lock); + img->incache++; + cache_usage += img->usage; + img->active = 0; + img->cached = t_now; + // FIXME: lock problem + if (cache_usage > ((cache_max_usage + cache_max_adjust) * 1024)) + cache_clean(); +} + +static void +img_dead(Img *img) +{ + if (img->active) return; + LKL(cache_lock); + cache_images = eina_list_remove(cache_images, img); + LKU(cache_lock); + img->incache--; + cache_usage -= img->usage; + img_free(img); +} + +static Eina_Bool +img_ok(Img *img) +{ + struct stat st; + int ret; + + if (img->dead) return 0; + if ((t_now > img->file.last_stat) && + ((t_now - img->file.last_stat) < stat_res_interval)) return 1; + img->file.last_stat = t_now; + ret = stat(img->file.file, &st); + img->file.last_stat = t_now; + if (ret < 0) + { + img->dead = 1; + img_dead(img); + return 0; + } + if (st.st_mtime != img->file.modtime) + { + img->dead = 1; + img_dead(img); + return 0; + } + return 1; +} + +static Img * +img_load(const char *file, const char *key, RGBA_Image_Loadopts *load_opts) +{ + Img *img; + char buf[8192]; + Eina_List *l, *l_next; + + if (!file) return NULL; + DBG("... img_load '%s'", file); + if (key) DBG("... ... key '%s'", key); + if (key) + snprintf(buf, sizeof(buf), "%s///::/%s/\001/%i/%1.8f/%ix%i", + file, key, + load_opts->scale_down_by, + load_opts->dpi, + load_opts->w, load_opts->h); + else + snprintf(buf, sizeof(buf), "%s///\001/%i/%1.8f/%ix%i", + file, + load_opts->scale_down_by, + load_opts->dpi, + load_opts->w, load_opts->h); + DBG("... find '%s'", buf); + img = eina_hash_find(active_images, buf); + if ((img) && (img_ok(img))) + { + DBG("... found!"); + img->stats.load1saved++; + img->ref++; + DBG("... stats update"); + stats_update(); + DBG("... return %p", img); + return img; + } + + // FIXME: keep hash of cached images too + LKL(cache_lock); + EINA_LIST_FOREACH_SAFE(cache_images, l, l_next, img) + { + if (!strcmp(img->key, buf)) + { + LKL(img->lock); + if (img_ok(img)) + { + DBG("... found cached"); + cache_images = eina_list_remove_list(cache_images, l); + img->incache--; + cache_usage -= img->usage; + img->active = 1; + img->stats.load1saved++; + img->ref++; + eina_hash_direct_add(active_images, img->key, img); + DBG("... sats update"); + stats_update(); + DBG("... return %p", img); + LKU(img->lock); + LKU(cache_lock); + return img; + } + LKU(img->lock); + } + } + LKU(cache_lock); + DBG("... ned new img"); + return img_new(file, key, load_opts, buf); +} + +static void +img_unload(Img *img) +{ + if (img->ref == 0) + { + ERR("EEEEEEEEEEEEEEEEK!"); + ERR("EEEEEEEEEEEEEEEEK! %p '%s' already @ ref 0", + img, img->file.file); + ERR("EEEEEEEEEEEEEEEEK!"); + return; + } + img->ref--; + DBG("... img ref-- = %i", img->ref); + if (img->ref == 0) + { + DBG("... img cache %p '%s'", img, img->file.file); + img_cache(img); + } +} + +static void +img_unloaddata(Img *img) +{ + DBG("img_unloaddata() %p '%s'", img, img->file.file); + if ((img->dref <= 0) && (img->useless) && (img->mem)) + { + Image_Entry *ie = (Image_Entry *)img; + + DBG("... really do forced unload"); + if (!img->active) cache_usage -= img->usage; + img->usage -= + (4096 * (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) / 4096)) + + sizeof(Mem); + if (!img->active) cache_usage += img->usage; + evas_cserve_mem_free(img->mem); + stat_mems = eina_list_remove(stat_mems, img->mem); + img->mem = NULL; + img->image.data = NULL; + img->dref = 0; + DBG("... done"); + + ie->flags.loaded = 0; + ie->allocated.w = 0; + ie->allocated.h = 0; + } +} + +static void +img_useless(Img *img) +{ + DBG("img_useless() %p", img); + img->useless = 1; + if (img->dref <= 0) img_unloaddata(img); +} + +static void +img_forcedunload(Img *img) +{ + DBG("img_forcedunload() %p", img); + img->dead = 1; + img_unload(img); +} + +static void +img_preload(Img *img) +{ + DBG("img_preload() %p", img); +} + +static void +client_del(void *data, Client *c) +{ + Eina_List *images; + Img *img; + + images = data; + DBG("... CLIENT DEL %i", c->pid); + EINA_LIST_FREE(images, img) + { + DBG("... unloaddata img %p", img); + img_unloaddata(img); + DBG("... unload img %p", img); + img_unload(img); + } +} + +static Eina_Bool +getinfo_hash_image_cb(const Eina_Hash *hash __UNUSED__, + const void *key __UNUSED__, + void *data, void *fdata __UNUSED__) +{ + Img *img = data; + Eina_List **list = fdata; + + *list = eina_list_append(*list, img); + return 1; +} + +#ifdef BUILD_PTHREAD +static void * +load_data_thread(void *data) +{ + Load_Inf *li = data; + Img *img = li->img; + Client *c = li->c; + Op_Loaddata_Reply msg; + + free(li); + LKL(img->lock); + if (img->mem) + { + memset(&msg, 0, sizeof(msg)); + msg.mem.id = img->mem->id; + msg.mem.offset = img->mem->offset; + msg.mem.size = img->mem->size; + DBG("... reply"); + evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg)); + LKU(c->lock); + return NULL; + } + img_loaddata(img); + memset(&msg, 0, sizeof(msg)); + if (img->mem) + { + msg.mem.id = img->mem->id; + msg.mem.offset = img->mem->offset; + msg.mem.size = img->mem->size; + } + else + msg.mem.id = msg.mem.offset = msg.mem.size = 0; + LKU(img->lock); + DBG("... reply"); + evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg)); + LKU(c->lock); + return NULL; +} +#endif + +static int +message(void *fdata __UNUSED__, Server *s __UNUSED__, Client *c, int opcode, int size, unsigned char *data) +{ + // copy data into local aligned buffer... in case. + unsigned char *tdata = alloca(size + 16); + memcpy(tdata, data, size); + + t_now = time(NULL); + DBG("message @ %i...", (int)t_now); + switch (opcode) + { + case OP_INIT: + { + Op_Init *rep; + Op_Init msg; + + memset(&msg, 0, sizeof(msg)); + msg.pid = getpid(); + msg.server_id = server_id; + msg.handle = c; + rep = (Op_Init *)tdata; + c->pid = rep->pid; + if (rep->server_id == 1) // 2nd channel conn + { + c->client_main = rep->handle; + } + c->func = client_del; + c->data = NULL; + DBG("OP_INIT %i", c->pid); + DBG("... reply"); + evas_cserve_client_send(c, OP_INIT, sizeof(msg), (unsigned char *)(&msg)); + } + break; + case OP_LOAD: + { + Op_Load *rep; + Op_Load_Reply msg; + Img *img; + RGBA_Image_Loadopts lopt; + char *file = NULL, *key = NULL; + + memset(&lopt, 0, sizeof lopt); + DBG("OP_LOAD %i", c->pid); + rep = (Op_Load *)tdata; + file = (char*) (data + sizeof(Op_Load)); + key = file + strlen(file) + 1; + if (key[0] == 0) key = NULL; + lopt.scale_down_by = rep->lopt.scale_down_by; + lopt.dpi = rep->lopt.dpi; + lopt.w = rep->lopt.w; + lopt.h = rep->lopt.h; + lopt.region.x = rep->lopt.region.x; + lopt.region.y = rep->lopt.region.y; + lopt.region.w = rep->lopt.region.w; + lopt.region.h = rep->lopt.region.h; + DBG("... img_load '%s'", file); + if (key) DBG("'%s'", (char *)key); + else DBG(" '%s'", ""); + DBG(" lopt { %i %1.1f %i %i { %i %i %i %i}}", + lopt.scale_down_by, lopt.dpi, lopt.w, lopt.h, + lopt.region.x, lopt.region.y, lopt.region.w, lopt.region.h); + img = img_load(file, key, &lopt); + DBG("... img_load = %p", img); + if (img) + { + DBG("... add image to client list"); + if (c->client_main) + c->client_main->data = eina_list_append(c->client_main->data, img); + else + c->data = eina_list_append(c->data, img); + } + memset(&msg, 0, sizeof(msg)); + msg.handle = img; + if ((img) && (img->mem)) + { + msg.mem.id = img->mem->id; + msg.mem.offset = img->mem->offset; + msg.mem.size = img->mem->size; + img->stats.load2saved++; + stats_update(); + } + else + msg.mem.id = msg.mem.offset = msg.mem.size = 0; + if (img) + { + msg.image.w = img->image.w; + msg.image.h = img->image.h; + msg.image.alpha = img->image.alpha; + } + DBG("... reply"); + evas_cserve_client_send(c, OP_LOAD, sizeof(msg), (unsigned char *)(&msg)); + } + break; + case OP_UNLOAD: + { + Op_Unload *rep; + Img *img; + + DBG("OP_UNLOAD %i", c->pid); + rep = (Op_Unload *)tdata; + img = rep->handle; + if ((img) && (rep->server_id == server_id)) + { + Eina_Bool doflush = 0; + + DBG("... remove %p from list", img); + if (c->client_main) + c->client_main->data = eina_list_remove(c->client_main->data, img); + else + c->data = eina_list_remove(c->data, img); + DBG("... unload %p", img); + LKL(img->lock); + img->ref++; + img_unload(img); + img->ref--; + if (img->ref == 0) doflush = 1; + LKU(img->lock); + if (doflush) + img_cache(img); + cache_clean(); + } + } + break; + case OP_LOADDATA: + { + Op_Loaddata *rep; + Op_Loaddata_Reply msg; + Img *img; + + DBG("OP_LOADDATA %i", c->pid); + rep = (Op_Loaddata *)tdata; + img = rep->handle; + if ((img) && (rep->server_id == server_id)) + { + if (img->mem) + { + DBG("... load saved - cached %p", img); + img->stats.load2saved++; + stats_update(); + memset(&msg, 0, sizeof(msg)); + if (img->mem) + { + msg.mem.id = img->mem->id; + msg.mem.offset = img->mem->offset; + msg.mem.size = img->mem->size; + } + else + msg.mem.id = msg.mem.offset = msg.mem.size = 0; + DBG("... reply"); + evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg)); + } + else + { +#ifdef BUILD_PTHREAD + pthread_t tid; + pthread_attr_t attr; + Load_Inf *li; + + DBG("... load data %p", img); + pthread_attr_init(&attr); + li = calloc(1, sizeof(Load_Inf)); + if (li) + { + li->img= img; + li->c = c; + LKL(c->lock); + if (pthread_create(&tid, &attr, load_data_thread, li)) + { + perror("pthread_create()"); + } + else + pthread_detach(tid); + } + pthread_attr_destroy(&attr); +#else + img_loaddata(img); + memset(&msg, 0, sizeof(msg)); + if (img->mem) + { + msg.mem.id = img->mem->id; + msg.mem.offset = img->mem->offset; + msg.mem.size = img->mem->size; + } + else + msg.mem.id = msg.mem.offset = msg.mem.size = 0; + DBG("... reply"); + evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg)); +#endif + } + } + else + { + msg.mem.id = msg.mem.offset = msg.mem.size = 0; + evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg)); + } + } + break; + case OP_UNLOADDATA: + { + Op_Unloaddata *rep; + Img *img; + + DBG("OP_UNLOADDATA %i", c->pid); + rep = (Op_Unloaddata *)tdata; + img = rep->handle; + if ((img) && (rep->server_id == server_id)) + { + DBG("... dref--"); + LKL(img->lock); + img->dref--; + if (img->dref < 0) img->dref = 0; + DBG("... unload data %p '%s'", img, img->file.file); + img_unloaddata(img); + LKU(img->lock); + } + } + break; + case OP_USELESSDATA: + { + Op_Unloaddata *rep; + Img *img; + + DBG("OP_USELESSDATA %i", c->pid); + rep = (Op_Unloaddata *)tdata; + img = rep->handle; + if ((img) && (rep->server_id == server_id)) + { + DBG("... dref--"); + LKL(img->lock); + img->dref--; + if (img->dref < 0) img->dref = 0; + DBG("... useless %p", img); + img_useless(img); + LKU(img->lock); + } + } + break; + case OP_PRELOAD: + { + Op_Preload *rep; + Img *img; + + DBG("OP_PRELOAD %i", c->pid); + rep = (Op_Preload *)tdata; + img = rep->handle; + if ((img) && (rep->server_id == server_id)) + { + LKL(img->lock); + if (c->client_main) + c->client_main->data = eina_list_remove(c->client_main->data, img); + else + c->data = eina_list_remove(c->data, img); + // FIXME: preload doesn't work async + img_preload(img); + LKU(img->lock); + } + } + case OP_FORCEDUNLOAD: + { + Op_Forcedunload *rep; + Img *img; + + DBG("OP_FORCEDUNLOAD %i", c->pid); + rep = (Op_Forcedunload *)tdata; + img = rep->handle; + if ((img) && (rep->server_id == server_id)) + { + Eina_Bool doflush = 0; + + LKL(img->lock); + DBG("remove %p from list", img); + if (c->client_main) + c->client_main->data = eina_list_remove(c->client_main->data, img); + else + c->data = eina_list_remove(c->data, img); + DBG("... forced unload now"); + img->ref++; + img_forcedunload(img); + img->ref--; + if (img->ref == 0) doflush = 1; + LKU(img->lock); + if (doflush) + img_cache(img); + cache_clean(); + } + } + break; + case OP_GETCONFIG: + { + Op_Getconfig_Reply msg; + + DBG("OP_GETCONFIG %i", c->pid); + msg.cache_max_usage = cache_max_usage; + msg.cache_item_timeout = cache_item_timeout; + msg.cache_item_timeout_check = cache_item_timeout_check; + DBG("... reply"); + evas_cserve_client_send(c, OP_GETCONFIG, sizeof(msg), (unsigned char *)(&msg)); + } + break; + case OP_SETCONFIG: + { + Op_Setconfig *rep; + + DBG("OP_SETCONFIG %i", c->pid); + rep = (Op_Setconfig *)tdata; + cache_max_usage = rep->cache_max_usage; + cache_item_timeout = rep->cache_item_timeout; + cache_item_timeout_check = rep->cache_item_timeout_check; + DBG("... cache timeout"); + cache_timeout(t_now); + DBG("... cache clean"); + cache_clean(); + } + break; + case OP_GETSTATS: + { + Op_Getstats_Reply msg; + + DBG("OP_GETSTATS %i", c->pid); + stats_calc(); + msg.saved_memory = saved_memory; + msg.wasted_memory = (real_memory - alloced_memory); + msg.saved_memory_peak = saved_memory_peak; + msg.wasted_memory_peak = (real_memory_peak - alloced_memory_peak); + msg.saved_time_image_header_load = saved_load_lifetime + saved_load_time; + msg.saved_time_image_data_load = saved_loaddata_lifetime + saved_loaddata_time; + DBG("... reply"); + evas_cserve_client_send(c, OP_GETSTATS, sizeof(msg), (unsigned char *)(&msg)); + } + break; + case OP_GETINFO: + { + Op_Getinfo_Reply *msg; + int len; + Eina_List *imgs = NULL, *l; + Img *img; + + DBG("OP_GETINFO %i", c->pid); + len = sizeof(Op_Getinfo_Reply); + DBG("... foreach"); + if (active_images) + eina_hash_foreach(active_images, getinfo_hash_image_cb, &imgs); + DBG("... walk foreach list output"); + LKL(cache_lock); + EINA_LIST_FOREACH(cache_images, l, img) + { + imgs = eina_list_append(imgs, img); + } + LKU(cache_lock); + DBG("... walk image cache"); + EINA_LIST_FOREACH(imgs, l, img) + { + len += sizeof(Op_Getinfo_Item); + if (img->file.file) len += strlen(img->file.file); + len++; + if (img->file.key) len += strlen(img->file.key); + len++; + } + DBG("... malloc msg"); + msg = calloc(1, len); + if (msg) + { + unsigned char *p; + + DBG("... init msg"); + p = (unsigned char *)msg; + msg->active.mem_total = 0; + msg->active.count = 0; + msg->cached.mem_total = 0; + msg->cached.count = 0; + p += sizeof(Op_Getinfo_Reply); + DBG("... walk all imgs"); + EINA_LIST_FOREACH(imgs, l, img) + { + Op_Getinfo_Item it; + + LKL(img->lock); + DBG("... img %p", img); + memset(&it, 0, sizeof(Op_Getinfo_Item)); + it.file_key_size = 0; + if (img->file.file) + { + strcpy((char *)p + sizeof(Op_Getinfo_Item) + it.file_key_size, img->file.file); + it.file_key_size += strlen(img->file.file); + } + p[sizeof(Op_Getinfo_Item) + it.file_key_size] = 0; + it.file_key_size += 1; + if (img->file.key) + { + strcpy((char *)p + sizeof(Op_Getinfo_Item) + it.file_key_size, img->file.key); + it.file_key_size += strlen(img->file.key); + } + p[sizeof(Op_Getinfo_Item) + it.file_key_size] = 0; + it.file_key_size += 1; + + it.w = img->image.w; + it.h = img->image.h; + it.file_mod_time = img->file.modtime; + it.file_checked_time = img->file.last_stat; + if (!img->active) + it.cached_time = img->cached; + else + it.cached_time = 0; + it.refcount = img->ref; + it.data_refcount = img->dref; + it.memory_footprint = img->usage; + it.head_load_time = img->stats.load1; + it.data_load_time = img->stats.load2; + it.alpha = img->image.alpha; + if (img->image.data) + it.data_loaded = 1; + else + it.data_loaded = 0; + it.active = img->active; + if (it.active) + { + msg->active.count++; + msg->active.mem_total += img->usage; + } + else + { + msg->cached.count++; + msg->cached.mem_total += img->usage; + } + it.dead = img->dead; + it.useless = img->useless; + DBG("... memcpy %p %p %zu ", + p, &it, sizeof(Op_Getinfo_Item)); + memcpy(p, &it, sizeof(Op_Getinfo_Item)); + DBG("... memcpy done %p", img); + p += sizeof(Op_Getinfo_Item) + it.file_key_size; + LKU(img->lock); + } + DBG("... walk all imgs done"); + msg->active.mem_total = + (msg->active.mem_total + 1023) / 1024; + msg->cached.mem_total = + (msg->cached.mem_total + 1023) / 1024; + DBG("... reply"); + evas_cserve_client_send(c, OP_GETINFO, len, (unsigned char *)msg); + free(msg); + } + else + { + DBG("... reply empty"); + evas_cserve_client_send(c, OP_GETINFO, 0, NULL); + } + DBG("... free imgs list"); + if (imgs) eina_list_free(imgs); + } + break; + default: + DBG("OP_... UNKNOWN??? %i opcode: %i", c->pid, opcode); + break; + } + return 0; +} + +static void +parse_args(int argc, char **argv) +{ + int i; + + for (i = 1; i < argc; i++) + { + if ((!strcmp(argv[i], "-h")) || + (!strcmp(argv[i], "-help")) || + (!strcmp(argv[i], "--help"))) + { + printf("Options:\n" + "\t-h This help\n" + "\t-csize Size of speculative cache (Kb)\n" + "\t-ctime Maximum life of a cached image (seconds)\n" + "\t-ctimecheck Time between checking the cache for timeouts (seconds)\n" + "\t-debug Enable debug logging\n" + "\n"); + exit(0); + } + else if ((!strcmp(argv[i], "-csize")) && (i < (argc - 1))) + { + i++; + cache_max_usage = atoi(argv[i]); + } + else if ((!strcmp(argv[i], "-ctime")) && (i < (argc - 1))) + { + i++; + cache_item_timeout = atoi(argv[i]); + } + else if ((!strcmp(argv[i], "-ctimecheck")) && (i < (argc - 1))) + { + i++; + cache_item_timeout_check = atoi(argv[i]); + } + else if (!strcmp(argv[i], "-debug")) + { + eina_log_level_set(EINA_LOG_LEVEL_DBG); + } + } +} + +static int exit_flag = 0; + +static void +exit_handler(int x __UNUSED__, siginfo_t *info __UNUSED__, void *data __UNUSED__) +{ + exit_flag = 1; +} + +static void +pipe_handler(int x __UNUSED__, siginfo_t *info __UNUSED__, void *data __UNUSED__) +{ +} + +static void +signal_init(void) +{ + struct sigaction action, old_action; + + action.sa_handler = NULL; + action.sa_sigaction = exit_handler; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGINT, &action, &old_action); + + action.sa_handler = NULL; + action.sa_sigaction = exit_handler; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGTERM, &action, &old_action); + + action.sa_handler = NULL; + action.sa_sigaction = exit_handler; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGQUIT, &action, &old_action); + + action.sa_handler = NULL; + action.sa_sigaction = pipe_handler; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGPIPE, &action, &old_action); + + // SIGUSR1 + // SIGUSR2 + // SIGHUP + + // SIGCHLD + + // SIGSEGV + // SIGILL + // SIGBUS + // SIGFPE + // SIGABRT +} + +static void +signal_shutdown(void) +{ +} + +int +main(int argc, char **argv) +{ + Server *s; + time_t last_check, t, t_next; + pid_t pid; + + t = time(NULL); + pid = getpid(); + t ^= (pid << 24) | (pid << 16) | (pid << 8) | (pid); + srand(t); + server_id = rand(); + + parse_args(argc, argv); + + unsetenv("EVAS_CSERVE"); + + eina_init(); + _evas_cserve_bin_log_dom = eina_log_domain_register + ("evas_cserve_bin", CSERVE_BIN_DEFAULT_COLOR); + if (_evas_cserve_bin_log_dom < 0) + { + EINA_LOG_ERR("impossible to create a log domain."); + eina_shutdown(); + exit(1); + } + + DBG("evas init..."); + evas_init(); + DBG("img init..."); + img_init(); + DBG("signal init..."); + signal_init(); + DBG("cserve add..."); + s = evas_cserve_server_add(); + if (!s) + { + ERR("ERROR: server socket init fail. abort."); + goto error; + } + DBG("mem open (status)..."); + stat_mem = evas_cserve_mem_open(0, 0, "status", sizeof(int), 0); + if (stat_mem) + { + WRN("WARNING: previous evas_cserve left garbage. cleaning up."); + stat_clean(stat_mem); + evas_cserve_mem_close(stat_mem); + stat_mem = NULL; + } + DBG("mem new (status)..."); + stat_mem = evas_cserve_mem_new(sizeof(int), "status"); + if (!stat_mem) + { + ERR("ERROR: cannot create status shmseg. abort."); + goto error; + } + DBG("init status..."); + if (!stat_init(stat_mem)) + { + ERR("cannot init status shmseg. abort."); + evas_cserve_mem_free(stat_mem); + stat_mem = NULL; + goto error; + } + + DBG("cset server message handler..."); + evas_cserve_server_message_handler_set(s, message, NULL); + last_check = time(NULL); + t_next = 0; + if (cache_item_timeout_check > 0) t_next = cache_item_timeout_check; + DBG("LOOP!!! ..."); + for (;;) + { + /* fixme: timeout 0 only her - future use timeouts for timed + * housekeping */ + if (exit_flag) break; + DBG("wait for messages..."); + evas_cserve_server_wait(s, t_next * 1000000); + if (exit_flag) break; + t = time(NULL); + t_next = t - last_check; + if ((cache_item_timeout_check > 0) && + ((t_next) >= cache_item_timeout_check)) + { + DBG("check timeout of items..."); + t_next = cache_item_timeout_check; + + last_check = t; + DBG("cache timeout..."); + cache_timeout(t); + DBG("meminfo check..."); + meminfo_check(); + DBG("mem cache adjust..."); + mem_cache_adjust(); + } + if ((t_next <= 0) && (cache_item_timeout_check > 0)) + t_next = 1; + DBG("sleep for %isec...", (int)t_next); + + LKL(strshr_freeme_lock); + if (strshr_freeme_count > 0) + { + int i; + + for (i = 0; i < strshr_freeme_count; i++) + eina_stringshare_del(strshr_freeme[i]); + strshr_freeme_count = 0; + } + LKU(strshr_freeme_lock); + + LKL(cache_lock); + if (cache_cleanme) + { + Eina_List *l; + Img *img; + Eina_List *kills = NULL; + + EINA_LIST_FOREACH(cache_images, l, img) + { + LKL(img->lock); + if (img->killme) + kills = eina_list_append(kills, img); + LKU(img->lock); + } + while (kills) + { + img = kills->data; + kills = eina_list_remove_list(kills, kills); + LKL(img->lock); + cache_images = eina_list_remove(cache_images, img); + img->incache--; + cache_usage -= img->usage; + DBG("... IMG FREE %p", img); + img_free(img); + } + cache_cleanme = 0; + } + LKU(cache_lock); + } + DBG("end loop..."); + error: + DBG("cleanup..."); + if (stat_mem) + { + DBG("clean mem stat..."); + stat_clean(stat_mem); + } + DBG("signal shutdown..."); + signal_shutdown(); + DBG("img shutdown..."); + img_shutdown(); + if (stat_mem) + { + DBG("free stat mem..."); + evas_cserve_mem_free(stat_mem); + stat_mem = NULL; + } + if (s) + { + DBG("del server..."); + evas_cserve_server_del(s); + } + DBG("evas shutdown..."); + evas_shutdown(); + eina_log_domain_unregister(_evas_cserve_bin_log_dom); + DBG("eina shutdown..."); + eina_shutdown(); + DBG("exit.."); + return 0; +} diff --git a/libraries/evas/src/bin/evas_cserve_tool.c b/libraries/evas/src/bin/evas_cserve_tool.c new file mode 100644 index 0000000..acaa703 --- /dev/null +++ b/libraries/evas/src/bin/evas_cserve_tool.c @@ -0,0 +1,160 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "evas_cs.h" + +int _cserve_tool_log_dom = -1; + +int +main(int argc, char **argv) +{ + int i; + + evas_init(); + if (!evas_cserve_init()) + { + printf("ERROR: Cannot connect to cserve. abort\n"); + exit(-1); + } + + for (i = 1; i < argc; i++) + { + if ((!strcmp(argv[i], "-h")) || + (!strcmp(argv[i], "-help")) || + (!strcmp(argv[i], "--help"))) + { + printf("Options:\n" + "\t-h This help\n" + "\tgetconfig Get configuration values\n" + "\tsetconfig CSIZE CTIME CTIMECHECK Set the config values\n" + "\tgetstats Get current cache statistics\n" + "\tgetinfo Get current cache content info\n" + ); + exit(0); + } + else if ((!strcmp(argv[i], "getconfig"))) + { + Op_Getconfig_Reply config; + + if (!evas_cserve_raw_config_get(&config)) + { + printf("ERROR: cannot fetch config.\n"); + exit(-1); + } + printf("-REPLY-\n"); + printf("csize: %i\n", config.cache_max_usage); + printf("ctime: %i\n", config.cache_item_timeout); + printf("ctimecheck: %i\n", config.cache_item_timeout_check); + printf("-OK-\n"); + } + else if ((!strcmp(argv[i], "setconfig")) && (i < (argc - 3))) + { + Op_Setconfig config; + + i++; + config.cache_max_usage = atoi(argv[i]); + i++; + config.cache_item_timeout = atoi(argv[i]); + i++; + config.cache_item_timeout_check = atoi(argv[i]); + if (!evas_cserve_raw_config_set(&config)) + { + printf("ERROR: cannot set config.\n"); + exit(-1); + } + } + else if ((!strcmp(argv[i], "getstats"))) + { + Op_Getstats_Reply stats; + + if (!evas_cserve_raw_stats_get(&stats)) + { + printf("ERROR: cannot fetch stats.\n"); + exit(-1); + } + printf("-REPLY-\n"); + printf("saved_memory: %i Kb\n", stats.saved_memory / 1024); + printf("wasted_memory: %i Kb\n", stats.wasted_memory / 1024); + printf("saved_memory_peak: %i Kb\n", stats.saved_memory_peak / 1024); + printf("wasted_memory_peak: %i Kb\n", stats.wasted_memory_peak / 1024); + printf("saved_time_image_header_load: %1.3f sec\n", stats.saved_time_image_header_load); + printf("saved_time_image_data_load: %1.3f sec\n", stats.saved_time_image_data_load); + printf("-OK-\n"); + } + else if ((!strcmp(argv[i], "getinfo"))) + { + Op_Getinfo_Reply *info; + unsigned char *p; + int h, j; + + info = evas_cserve_raw_info_get(); + if (!info) + { + printf("ERROR: cannot fetch info.\n"); + exit(-1); + } + j = info->active.count + info->cached.count; + printf("-REPLY-\n"); + printf("active_count: %i\n", info->active.count); + printf("active_memory: %i Kb\n", info->active.mem_total); + printf("cache_count: %i\n", info->cached.count); + printf("cache_memory: %i Kb\n", info->cached.mem_total); + p = (unsigned char *)info; + p += sizeof(Op_Getinfo_Reply); + for (h = 0; h < j; h++) + { + Op_Getinfo_Item it; + char *file, *key, buf[512]; + struct tm *ltm; + + memcpy(&it, p, sizeof(Op_Getinfo_Item)); + file = (char*) (p + sizeof(Op_Getinfo_Item)); + key = file + strlen(file) + 1; + printf("-IMAGE- [#%i]\n", h); + printf(" file : %s\n", file); + printf(" key : %s\n", key); + printf(" size : %i x %i\n", it.w, it.h); + printf(" active : %i\n", (int)it.active); + printf(" memory used: %i bytes (%i Kb)\n", it.memory_footprint, (it.memory_footprint + 1023) / 1024); + printf(" has alpha : %i\n", (int)it.alpha); + printf(" data loaded: %i\n", (int)it.data_loaded); + printf(" dead : %i\n", (int)it.dead); + printf(" useless : %i\n", (int)it.useless); + printf(" image refs : %i\n", it.refcount); + printf(" data refs : %i\n", it.data_refcount); + printf(" header load: %1.5f sec\n", it.head_load_time); + printf(" data load : %1.5f sec\n", it.data_load_time); + if (it.cached_time == 0) + printf(" cached at : N/A\n"); + else + { + ltm = localtime(&(it.cached_time)); + if (ltm) + { + strftime(buf, sizeof(buf), "%Y.%m.%d %T", ltm); + printf(" cached at : %s\n", buf); + } + } + ltm = localtime(&(it.file_mod_time)); + if (ltm) + { + strftime(buf, sizeof(buf), "%Y.%m.%d %T", ltm); + printf(" file mod at: %s\n", buf); + } + ltm = localtime(&(it.file_checked_time)); + if (ltm) + { + strftime(buf, sizeof(buf), "%Y.%m.%d %T", ltm); + printf(" file check : %s\n", buf); + } + p += sizeof(Op_Getinfo_Item) + it.file_key_size; + } + free(info); + printf("-OK-\n"); + } + } + evas_cserve_shutdown(); + evas_shutdown(); + return 0; +} -- cgit v1.1