Merge from backend: wikis, admin-scrits, test.sh
(dont merge any srcfiles)
This commit is contained in:
parent
15bab21da8
commit
a03e3c5e73
23 changed files with 23958 additions and 194 deletions
|
|
@ -29,8 +29,12 @@ SUBDIRS =
|
||||||
# Only use subdirs if really needed, prefer the include scheme below
|
# Only use subdirs if really needed, prefer the include scheme below
|
||||||
#SUBDIRS +=
|
#SUBDIRS +=
|
||||||
|
|
||||||
|
# administrative tools
|
||||||
|
include $(top_srcdir)/admin/Makefile.am
|
||||||
|
|
||||||
# core
|
# core
|
||||||
include $(top_srcdir)/src/lib/Makefile.am
|
include $(top_srcdir)/src/lib/Makefile.am
|
||||||
|
include $(top_srcdir)/src/backend/Makefile.am
|
||||||
|
|
||||||
# plugins
|
# plugins
|
||||||
#include $(top_srcdir)/src...
|
#include $(top_srcdir)/src...
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,7 @@ def configurePlatform(env):
|
||||||
if not conf.CheckLibWithHeader('pthread', 'pthread.h', 'C'):
|
if not conf.CheckLibWithHeader('pthread', 'pthread.h', 'C'):
|
||||||
print 'Did not find the pthread lib or pthread.h, exiting.'
|
print 'Did not find the pthread lib or pthread.h, exiting.'
|
||||||
else:
|
else:
|
||||||
conf.env.Append(CPPFLAGS = ' -DHAVE_PTHREAD_H')
|
conf.env.Append(CPPFLAGS = ' -DHAVE_PTHREAD')
|
||||||
conf.env.Append(CCFLAGS = ' -pthread')
|
conf.env.Append(CCFLAGS = ' -pthread')
|
||||||
|
|
||||||
if conf.CheckCHeader('execinfo.h'):
|
if conf.CheckCHeader('execinfo.h'):
|
||||||
|
|
|
||||||
238
acinclude.m4
Normal file
238
acinclude.m4
Normal file
|
|
@ -0,0 +1,238 @@
|
||||||
|
dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
|
||||||
|
dnl
|
||||||
|
dnl @summary figure out how to build C programs using POSIX threads
|
||||||
|
dnl
|
||||||
|
dnl This macro figures out how to build C programs using POSIX threads.
|
||||||
|
dnl It sets the PTHREAD_LIBS output variable to the threads library and
|
||||||
|
dnl linker flags, and the PTHREAD_CFLAGS output variable to any special
|
||||||
|
dnl C compiler flags that are needed. (The user can also force certain
|
||||||
|
dnl compiler flags/libs to be tested by setting these environment
|
||||||
|
dnl variables.)
|
||||||
|
dnl
|
||||||
|
dnl Also sets PTHREAD_CC to any special C compiler that is needed for
|
||||||
|
dnl multi-threaded programs (defaults to the value of CC otherwise).
|
||||||
|
dnl (This is necessary on AIX to use the special cc_r compiler alias.)
|
||||||
|
dnl
|
||||||
|
dnl NOTE: You are assumed to not only compile your program with these
|
||||||
|
dnl flags, but also link it with them as well. e.g. you should link
|
||||||
|
dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
|
||||||
|
dnl $LIBS
|
||||||
|
dnl
|
||||||
|
dnl If you are only building threads programs, you may wish to use
|
||||||
|
dnl these variables in your default LIBS, CFLAGS, and CC:
|
||||||
|
dnl
|
||||||
|
dnl LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
|
dnl CC="$PTHREAD_CC"
|
||||||
|
dnl
|
||||||
|
dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
|
||||||
|
dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
|
||||||
|
dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
||||||
|
dnl
|
||||||
|
dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
|
||||||
|
dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to
|
||||||
|
dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the
|
||||||
|
dnl default action will define HAVE_PTHREAD.
|
||||||
|
dnl
|
||||||
|
dnl Please let the authors know if this macro fails on any platform, or
|
||||||
|
dnl if you have any other suggestions or comments. This macro was based
|
||||||
|
dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with
|
||||||
|
dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros
|
||||||
|
dnl posted by Alejandro Forero Cuervo to the autoconf macro repository.
|
||||||
|
dnl We are also grateful for the helpful feedback of numerous users.
|
||||||
|
dnl
|
||||||
|
dnl @category InstalledPackages
|
||||||
|
dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
|
||||||
|
dnl @version 2005-06-15
|
||||||
|
dnl @license GPLWithACException
|
||||||
|
|
||||||
|
AC_DEFUN([ACX_PTHREAD], [
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
AC_LANG_SAVE
|
||||||
|
AC_LANG_C
|
||||||
|
acx_pthread_ok=no
|
||||||
|
|
||||||
|
# We used to check for pthread.h first, but this fails if pthread.h
|
||||||
|
# requires special compiler flags (e.g. on True64 or Sequent).
|
||||||
|
# It gets checked for in the link test anyway.
|
||||||
|
|
||||||
|
# First of all, check if the user has set any of the PTHREAD_LIBS,
|
||||||
|
# etcetera environment variables, and if threads linking works using
|
||||||
|
# them:
|
||||||
|
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
|
||||||
|
save_CFLAGS="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
|
||||||
|
AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
|
||||||
|
AC_MSG_RESULT($acx_pthread_ok)
|
||||||
|
if test x"$acx_pthread_ok" = xno; then
|
||||||
|
PTHREAD_LIBS=""
|
||||||
|
PTHREAD_CFLAGS=""
|
||||||
|
fi
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
CFLAGS="$save_CFLAGS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We must check for the threads library under a number of different
|
||||||
|
# names; the ordering is very important because some systems
|
||||||
|
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
|
||||||
|
# libraries is broken (non-POSIX).
|
||||||
|
|
||||||
|
# Create a list of thread flags to try. Items starting with a "-" are
|
||||||
|
# C compiler flags, and other items are library names, except for "none"
|
||||||
|
# which indicates that we try without any flags at all, and "pthread-config"
|
||||||
|
# which is a program returning the flags for the Pth emulation library.
|
||||||
|
|
||||||
|
acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
|
||||||
|
|
||||||
|
# The ordering *is* (sometimes) important. Some notes on the
|
||||||
|
# individual items follow:
|
||||||
|
|
||||||
|
# pthreads: AIX (must check this before -lpthread)
|
||||||
|
# none: in case threads are in libc; should be tried before -Kthread and
|
||||||
|
# other compiler flags to prevent continual compiler warnings
|
||||||
|
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
|
||||||
|
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
|
||||||
|
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
|
||||||
|
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
|
||||||
|
# -pthreads: Solaris/gcc
|
||||||
|
# -mthreads: Mingw32/gcc, Lynx/gcc
|
||||||
|
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
|
||||||
|
# doesn't hurt to check since this sometimes defines pthreads too;
|
||||||
|
# also defines -D_REENTRANT)
|
||||||
|
# ... -mt is also the pthreads flag for HP/aCC
|
||||||
|
# pthread: Linux, etcetera
|
||||||
|
# --thread-safe: KAI C++
|
||||||
|
# pthread-config: use pthread-config program (for GNU Pth library)
|
||||||
|
|
||||||
|
case "${host_cpu}-${host_os}" in
|
||||||
|
*solaris*)
|
||||||
|
|
||||||
|
# On Solaris (at least, for some versions), libc contains stubbed
|
||||||
|
# (non-functional) versions of the pthreads routines, so link-based
|
||||||
|
# tests will erroneously succeed. (We need to link with -pthreads/-mt/
|
||||||
|
# -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
|
||||||
|
# a function called by this macro, so we could check for that, but
|
||||||
|
# who knows whether they'll stub that too in a future libc.) So,
|
||||||
|
# we'll just look for -pthreads and -lpthread first:
|
||||||
|
|
||||||
|
acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test x"$acx_pthread_ok" = xno; then
|
||||||
|
for flag in $acx_pthread_flags; do
|
||||||
|
|
||||||
|
case $flag in
|
||||||
|
none)
|
||||||
|
AC_MSG_CHECKING([whether pthreads work without any flags])
|
||||||
|
;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
AC_MSG_CHECKING([whether pthreads work with $flag])
|
||||||
|
PTHREAD_CFLAGS="$flag"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pthread-config)
|
||||||
|
AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
|
||||||
|
if test x"$acx_pthread_config" = xno; then continue; fi
|
||||||
|
PTHREAD_CFLAGS="`pthread-config --cflags`"
|
||||||
|
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
AC_MSG_CHECKING([for the pthreads library -l$flag])
|
||||||
|
PTHREAD_LIBS="-l$flag"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
save_CFLAGS="$CFLAGS"
|
||||||
|
LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
|
|
||||||
|
# Check for various functions. We must include pthread.h,
|
||||||
|
# since some functions may be macros. (On the Sequent, we
|
||||||
|
# need a special flag -Kthread to make this header compile.)
|
||||||
|
# We check for pthread_join because it is in -lpthread on IRIX
|
||||||
|
# while pthread_create is in libc. We check for pthread_attr_init
|
||||||
|
# due to DEC craziness with -lpthreads. We check for
|
||||||
|
# pthread_cleanup_push because it is one of the few pthread
|
||||||
|
# functions on Solaris that doesn't have a non-functional libc stub.
|
||||||
|
# We try pthread_create on general principles.
|
||||||
|
AC_TRY_LINK([#include <pthread.h>],
|
||||||
|
[pthread_t th; pthread_join(th, 0);
|
||||||
|
pthread_attr_init(0); pthread_cleanup_push(0, 0);
|
||||||
|
pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
|
||||||
|
[acx_pthread_ok=yes])
|
||||||
|
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
CFLAGS="$save_CFLAGS"
|
||||||
|
|
||||||
|
AC_MSG_RESULT($acx_pthread_ok)
|
||||||
|
if test "x$acx_pthread_ok" = xyes; then
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
|
||||||
|
PTHREAD_LIBS=""
|
||||||
|
PTHREAD_CFLAGS=""
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Various other checks:
|
||||||
|
if test "x$acx_pthread_ok" = xyes; then
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
save_CFLAGS="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
|
|
||||||
|
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
|
||||||
|
AC_MSG_CHECKING([for joinable pthread attribute])
|
||||||
|
attr_name=unknown
|
||||||
|
for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
|
||||||
|
AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
|
||||||
|
[attr_name=$attr; break])
|
||||||
|
done
|
||||||
|
AC_MSG_RESULT($attr_name)
|
||||||
|
if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
|
||||||
|
AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
|
||||||
|
[Define to necessary symbol if this constant
|
||||||
|
uses a non-standard name on your system.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([if more special flags are required for pthreads])
|
||||||
|
flag=no
|
||||||
|
case "${host_cpu}-${host_os}" in
|
||||||
|
*-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
|
||||||
|
*solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
|
||||||
|
esac
|
||||||
|
AC_MSG_RESULT(${flag})
|
||||||
|
if test "x$flag" != xno; then
|
||||||
|
PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
CFLAGS="$save_CFLAGS"
|
||||||
|
|
||||||
|
# More AIX lossage: must compile with cc_r
|
||||||
|
AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC})
|
||||||
|
else
|
||||||
|
PTHREAD_CC="$CC"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST(PTHREAD_LIBS)
|
||||||
|
AC_SUBST(PTHREAD_CFLAGS)
|
||||||
|
AC_SUBST(PTHREAD_CC)
|
||||||
|
|
||||||
|
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
|
||||||
|
if test x"$acx_pthread_ok" = xyes; then
|
||||||
|
ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
|
||||||
|
:
|
||||||
|
else
|
||||||
|
acx_pthread_ok=no
|
||||||
|
$2
|
||||||
|
fi
|
||||||
|
AC_LANG_RESTORE
|
||||||
|
])dnl ACX_PTHREAD
|
||||||
24
admin/Makefile.am
Normal file
24
admin/Makefile.am
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Copyright (C) Lumiera.org
|
||||||
|
# 2008, Christian Thaeter <ct@pipapo.org>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License as
|
||||||
|
# published by the Free Software Foundation; either version 2 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
admin_srcdir = $(top_srcdir)/admin
|
||||||
|
|
||||||
|
noinst_PROGRAMS += vgsuppression
|
||||||
|
vgsuppression_SOURCES = $(admin_srcdir)/vgsuppression.c
|
||||||
|
vgsuppression_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror -I$(top_srcdir)/src/
|
||||||
|
vgsuppression_LDADD = liblumi.a -lnobugmt -lpthread -ldl
|
||||||
|
|
||||||
25
admin/headercheck
Executable file
25
admin/headercheck
Executable file
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This is a small tool which checks that all headers are sufficiently standalone
|
||||||
|
# and include anything they need.
|
||||||
|
# In future we might extend this to find out bogus includes by predefining (-D)
|
||||||
|
# headerguards they include, effectively disableing this include for a test.
|
||||||
|
|
||||||
|
find src -name '*.h' | while read header; do
|
||||||
|
echo -e "testing $header"
|
||||||
|
awk 'BEGIN {print "#include \""ARGV[1]"\"\nint main(){"}
|
||||||
|
/^(struct|enum|class).*[^;]$/{print "\t" $0 " test_" NR "; (void) test_"NR";" }
|
||||||
|
END {print "\treturn 0;\n}"}' $header >,headertest.c
|
||||||
|
gcc -D_GNU_SOURCE -DEBUG_ALPHA -std=gnu99 -Werror -Wall -I src -c ,headertest.c
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
|
find src -name '*.hpp' | while read header; do
|
||||||
|
echo -e "testing $header"
|
||||||
|
awk 'BEGIN {print "#include \""ARGV[1]"\"\nint main(){"}
|
||||||
|
/^(struct|enum|class).*[^;]$/{print "\t" $0 " test_" NR "; (void) test_"NR";" }
|
||||||
|
END {print "\treturn 0;\n}"}' $header >,headertest.cpp
|
||||||
|
g++ -D_GNU_SOURCE -DEBUG_ALPHA -Werror -Wall -I src -c ,headertest.cpp
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
135
admin/lumiera_c_skeleton
Executable file
135
admin/lumiera_c_skeleton
Executable file
|
|
@ -0,0 +1,135 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if test $# -lt 2; then
|
||||||
|
cat <<EOF
|
||||||
|
usage:
|
||||||
|
$0 name description...
|
||||||
|
creates C skeleton files name.h and name.c for lumiera
|
||||||
|
and adds them to the Makefile.am in the current dir
|
||||||
|
EOF
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
NAME="$1"
|
||||||
|
NAME_UPPER="$(echo -n ${NAME} | tr [:lower:] [:upper:])"
|
||||||
|
shift
|
||||||
|
DESCRIPTION="$*"
|
||||||
|
|
||||||
|
test -f ${NAME}.h || cat >${NAME}.h <<EOF
|
||||||
|
/*
|
||||||
|
${NAME}.h - ${DESCRIPTION}
|
||||||
|
|
||||||
|
Copyright (C) Lumiera.org
|
||||||
|
$(date +%Y), $(git config user.name) <$(git config user.email)>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LUMIERA_${NAME_UPPER}_H
|
||||||
|
#define LUMIERA_${NAME_UPPER}_H
|
||||||
|
|
||||||
|
//TODO: Support library includes//
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: Forward declarations//
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: Lumiera header includes//
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: System includes//
|
||||||
|
#include <nobug.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
//TODO: declarations go here//
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
// Local Variables:
|
||||||
|
// mode: C
|
||||||
|
// c-file-style: "gnu"
|
||||||
|
// indent-tabs-mode: nil
|
||||||
|
// End:
|
||||||
|
*/
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test -f ${NAME}.c || cat >${NAME}.c <<EOF
|
||||||
|
/*
|
||||||
|
${NAME}.c - ${DESCRIPTION}
|
||||||
|
|
||||||
|
Copyright (C) Lumiera.org
|
||||||
|
$(date +%Y), $(git config user.name) <$(git config user.email)>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//TODO: Support library includes//
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: Lumiera header includes//
|
||||||
|
#include "${PWD##*/}/${NAME}.h"
|
||||||
|
|
||||||
|
//TODO: internal/static forward declarations//
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: System includes//
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
NOBUG_DEFINE_FLAG_PARENT (${NAME}, /*TODO insert parent flag here */);
|
||||||
|
|
||||||
|
|
||||||
|
//code goes here//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Local Variables:
|
||||||
|
// mode: C
|
||||||
|
// c-file-style: "gnu"
|
||||||
|
// indent-tabs-mode: nil
|
||||||
|
// End:
|
||||||
|
*/
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test -f Makefile.am && ed Makefile.am >/dev/null <<EOF
|
||||||
|
/\.c\'/s/\(\$(.*)\)\(.*\)\.c\'/\1\2.c \\\\\\
|
||||||
|
\1\/${NAME}.c/
|
||||||
|
/\.h\'/s/\(\$(.*)\)\(.*\)\.h\'/\1\2.h \\\\\\
|
||||||
|
\1\/${NAME}.h/
|
||||||
|
wq
|
||||||
|
EOF
|
||||||
8
admin/rsync_docs_to_lumieraorg.sh
Executable file
8
admin/rsync_docs_to_lumieraorg.sh
Executable file
|
|
@ -0,0 +1,8 @@
|
||||||
|
#/bin/sh
|
||||||
|
|
||||||
|
echo "syncing tiddlywikis"
|
||||||
|
rsync -rLz --partial --del --exclude backups wiki/ lumiera.org:/var/www/wiki
|
||||||
|
|
||||||
|
echo "syncing doxygen documentation"
|
||||||
|
rsync -rz --partial --del doc/devel/html/ lumiera.org:/var/www/doxy
|
||||||
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
framerate.c - framerate calculations
|
vgsuppression.c - Helper program to generate valgrind suppression files
|
||||||
|
|
||||||
Copyright (C) Lumiera.org
|
Copyright (C) Lumiera.org
|
||||||
2008, Christian Thaeter <ct@pipapo.org>
|
2008, Christian Thaeter <ct@pipapo.org>
|
||||||
|
|
@ -18,13 +18,21 @@
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
#include "lib/error.h"
|
/*
|
||||||
|
just place any problematic calls where valgrind whines about in main (with comments please)
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
#include "lib/safeclib.h"
|
||||||
* @file Framerate calculations.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
LUMIERA_ERROR_DEFINE(FRAMERATE_ILLEGAL_TIME, "invalid time given");
|
int
|
||||||
LUMIERA_ERROR_DEFINE(FRAMERATE_ILLEGAL_FRAME, "invalid frame given");
|
main ()
|
||||||
|
{
|
||||||
|
/* debian etch glibc is lazy about cleaning up TLS */
|
||||||
|
lumiera_tmpbuf_provide (100);
|
||||||
|
lumiera_tmpbuf_freeall ();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
3
admin/vgsuppression_gen.sh
Executable file
3
admin/vgsuppression_gen.sh
Executable file
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
valgrind --leak-check=yes --show-reachable=yes --gen-suppressions=all ./vgsuppression 2>&1 | sed '/==[0-9]*==/d;'
|
||||||
|
|
@ -37,11 +37,15 @@ AC_PROG_LIBTOOL
|
||||||
# test for headers
|
# test for headers
|
||||||
#
|
#
|
||||||
AC_STDC_HEADERS
|
AC_STDC_HEADERS
|
||||||
AC_CHECK_HEADER([pthread.h], AC_DEFINE(HAVE_PTHREAD_H))
|
|
||||||
AC_CHECK_HEADER([nobug.h], AC_DEFINE(HAVE_NOBUG_H))
|
AC_CHECK_HEADER([nobug.h], AC_DEFINE(HAVE_NOBUG_H))
|
||||||
AC_CHECK_HEADER([execinfo.h], AC_DEFINE(HAVE_EXECINFO_H))
|
AC_CHECK_HEADER([execinfo.h], AC_DEFINE(HAVE_EXECINFO_H))
|
||||||
# there is a warning in nobug, disabled til fixed AC_CHECK_HEADER([valgrind/valgrind.h], AC_DEFINE(HAVE_VALGRIND_VALGRIND_H))
|
# there is a warning in nobug, disabled til fixed AC_CHECK_HEADER([valgrind/valgrind.h], AC_DEFINE(HAVE_VALGRIND_VALGRIND_H))
|
||||||
|
|
||||||
|
ACX_PTHREAD
|
||||||
|
##AM_CONDITIONAL([HAVE_THREADING], [test x"$acx_pthread_ok" = xyes])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# user options
|
# user options
|
||||||
#
|
#
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ SUBGROUPING = YES
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Build related configuration options
|
# Build related configuration options
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
EXTRACT_ALL = YES
|
EXTRACT_ALL = NO
|
||||||
EXTRACT_PRIVATE = YES
|
EXTRACT_PRIVATE = YES
|
||||||
EXTRACT_STATIC = YES
|
EXTRACT_STATIC = YES
|
||||||
EXTRACT_LOCAL_CLASSES = YES
|
EXTRACT_LOCAL_CLASSES = YES
|
||||||
|
|
|
||||||
57
doc/devel/nobug_flags.txt
Normal file
57
doc/devel/nobug_flags.txt
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
|
||||||
|
NoBug debugging flags hierachy
|
||||||
|
==============================
|
||||||
|
|
||||||
|
NoBug logging is controlled by flags which can be configured with the
|
||||||
|
NOBUG_LOG environment variable. This flags can be hierachically
|
||||||
|
organized.
|
||||||
|
|
||||||
|
The documentation about this hierachy is maintained here:
|
||||||
|
|
||||||
|
(PLANNED, not all are implemented yet)
|
||||||
|
|
||||||
|
all # global logging
|
||||||
|
lumiera # standard
|
||||||
|
library # all support library
|
||||||
|
plugin # plugin loader
|
||||||
|
backend # all backend
|
||||||
|
file_all # filehandling subsystem
|
||||||
|
file # file access
|
||||||
|
filedescriptor # internal filedescriptors
|
||||||
|
filehandle # posix filehandles
|
||||||
|
filehandlecache # mrucache for filehandles
|
||||||
|
map_all # file mapping subsystem
|
||||||
|
cache_all # caching subsystem
|
||||||
|
scheduler_all # all scheduler
|
||||||
|
threads # threadpool management
|
||||||
|
tasks # work requests
|
||||||
|
hard # high priority queue
|
||||||
|
idle # low priority queue
|
||||||
|
proc # all proc
|
||||||
|
gui # all gui
|
||||||
|
detail # highly expensive logging
|
||||||
|
profiler # performance stats
|
||||||
|
|
||||||
|
event # controling events
|
||||||
|
ui # by user interface
|
||||||
|
script # by script
|
||||||
|
|
||||||
|
Explanation
|
||||||
|
-----------
|
||||||
|
|
||||||
|
We have 2 main log flag hierachies, 'all' and 'event'.
|
||||||
|
* 'all' reflects the application progress and will be used for
|
||||||
|
debugging the application by the programmers. This is exposed in 2
|
||||||
|
subgroups: 'lumiera' which is used for normal application logging
|
||||||
|
and, 'detail' which contains logging which might be time critical,
|
||||||
|
expensive or of very high volume.
|
||||||
|
* 'event' logs user actions like GUI clicking, menu selections giving
|
||||||
|
an idea how a bug was triggered.
|
||||||
|
|
||||||
|
Later on this main hierachies will run in different ringbuffers.
|
||||||
|
|
||||||
|
In Short
|
||||||
|
--------
|
||||||
|
|
||||||
|
use NOBUG_LOG=lumiera
|
||||||
|
|
||||||
37
src/backend/Makefile.am
Normal file
37
src/backend/Makefile.am
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
# Copyright (C) Lumiera.org
|
||||||
|
# 2008, Christian Thaeter <ct@pipapo.org>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License as
|
||||||
|
# published by the Free Software Foundation; either version 2 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
liblumibackend_a_srcdir = $(top_srcdir)/src/backend
|
||||||
|
noinst_LIBRARIES += liblumibackend.a
|
||||||
|
|
||||||
|
liblumibackend_a_CFLAGS = $(CFLAGS) -std=gnu99 -Wall -Werror
|
||||||
|
liblumibackend_a_CPPFLAGS = -I$(top_srcdir)/src/
|
||||||
|
|
||||||
|
liblumibackend_a_SOURCES = \
|
||||||
|
$(liblumibackend_a_srcdir)/backend.c \
|
||||||
|
$(liblumibackend_a_srcdir)/file.c \
|
||||||
|
$(liblumibackend_a_srcdir)/filehandle.c \
|
||||||
|
$(liblumibackend_a_srcdir)/filedescriptor.c \
|
||||||
|
$(liblumibackend_a_srcdir)/filehandlecache.c
|
||||||
|
|
||||||
|
noinst_HEADERS += \
|
||||||
|
$(liblumibackend_a_srcdir)/backend.h \
|
||||||
|
$(liblumibackend_a_srcdir)/file.h \
|
||||||
|
$(liblumibackend_a_srcdir)/filehandle.h \
|
||||||
|
$(liblumibackend_a_srcdir)/filedescriptor.h \
|
||||||
|
$(liblumibackend_a_srcdir)/filehandlecache.h
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
TESTING "test system selftest" cat
|
TESTING "test system selftest" /bin/cat
|
||||||
|
|
||||||
TEST "test cat'ing stdin to stdout" <<END
|
TEST "test cat'ing stdin to stdout" <<END
|
||||||
in: foo: bar
|
in: foo: bar
|
||||||
|
|
@ -7,7 +7,7 @@ return: 0
|
||||||
END
|
END
|
||||||
|
|
||||||
TEST "test stderr, cat'ing noonexistant file" ,nonexistent_file <<END
|
TEST "test stderr, cat'ing noonexistant file" ,nonexistent_file <<END
|
||||||
err: cat: ,nonexistent_file: No such file or directory
|
err: /bin/cat: ,nonexistent_file: No such file or directory
|
||||||
return: 1
|
return: 1
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@ test_error_SOURCES = $(tests_srcdir)/error/errortest.c
|
||||||
test_error_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror -I$(top_srcdir)/src/
|
test_error_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror -I$(top_srcdir)/src/
|
||||||
test_error_LDADD = liblumi.a -lnobugmt -lpthread -ldl
|
test_error_LDADD = liblumi.a -lnobugmt -lpthread -ldl
|
||||||
|
|
||||||
|
|
||||||
check_PROGRAMS += test-locking
|
check_PROGRAMS += test-locking
|
||||||
test_locking_SOURCES = \
|
test_locking_SOURCES = \
|
||||||
$(tests_srcdir)/locking/test-locking.c \
|
$(tests_srcdir)/locking/test-locking.c \
|
||||||
|
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
/*
|
|
||||||
test-locking.c - test locking functions
|
|
||||||
|
|
||||||
Copyright (C) Lumiera.org
|
|
||||||
2008, Christian Thaeter <ct@pipapo.org>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "lib/condition.h"
|
|
||||||
|
|
||||||
LUMIERA_ERROR_DEFINE(TEST, "test error");
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
waiting_thread()
|
|
||||||
{
|
|
||||||
lock;
|
|
||||||
wait;
|
|
||||||
unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
signaling_thread()
|
|
||||||
{
|
|
||||||
signal();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char** argv)
|
|
||||||
{
|
|
||||||
NOBUG_INIT;
|
|
||||||
|
|
||||||
if (argc == 1)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!strcmp(argv[1], "conditionforgotunlock"))
|
|
||||||
{
|
|
||||||
lumiera_condition c;
|
|
||||||
lumiera_condition_init (&c);
|
|
||||||
|
|
||||||
lumiera_conditionlock NOBUG_CLEANUP(lumiera_conditionlock_ensureunlocked) l;
|
|
||||||
lumiera_conditionlock_init (&l, &c, LUMIERA_LOCKED);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
export LC_ALL=C
|
export LC_ALL=C
|
||||||
|
|
||||||
arg0="$0"
|
arg0="$0"
|
||||||
srcdir=$(dirname "$arg0")
|
srcdir="$(dirname "$arg0")"
|
||||||
|
|
||||||
ulimit -S -t 1 -v 524288
|
ulimit -S -t 1 -v 524288
|
||||||
valgrind=""
|
valgrind=""
|
||||||
|
|
@ -45,7 +45,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo ================ ${0##*/} ================
|
echo "================ ${0##*/} ================"
|
||||||
|
|
||||||
TESTCNT=0
|
TESTCNT=0
|
||||||
SKIPCNT=0
|
SKIPCNT=0
|
||||||
|
|
@ -84,7 +84,7 @@ function TEST()
|
||||||
echo "$arg" >>,expect_stderr
|
echo "$arg" >>,expect_stderr
|
||||||
;;
|
;;
|
||||||
'return')
|
'return')
|
||||||
expect_return=$arg
|
expect_return="$arg"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "UNKOWN TEST COMMAND '$cmd'" 1>&2
|
echo "UNKOWN TEST COMMAND '$cmd'" 1>&2
|
||||||
|
|
@ -95,7 +95,7 @@ function TEST()
|
||||||
echo -n "TEST $name: "
|
echo -n "TEST $name: "
|
||||||
echo -en "\nTEST $name: $* " >>,testlog
|
echo -en "\nTEST $name: $* " >>,testlog
|
||||||
|
|
||||||
case $TESTMODE in
|
case "$TESTMODE" in
|
||||||
*FAST*)
|
*FAST*)
|
||||||
if grep "^TEST $name: .* FAILED" ,testlog.pre >&/dev/null; then
|
if grep "^TEST $name: .* FAILED" ,testlog.pre >&/dev/null; then
|
||||||
MSGOK=" (fixed)"
|
MSGOK=" (fixed)"
|
||||||
|
|
@ -121,39 +121,45 @@ function TEST()
|
||||||
|
|
||||||
fails=0
|
fails=0
|
||||||
|
|
||||||
|
|
||||||
if test -f ,send_stdin; then
|
|
||||||
cat ,send_stdin | $valgrind $TESTBIN "$@" 2>,stderr >,stdout
|
|
||||||
else
|
|
||||||
$valgrind $TESTBIN "$@" 2>,stderr >,stdout
|
|
||||||
fi &>/dev/null
|
|
||||||
return=$?
|
|
||||||
|
|
||||||
echo -n >,testtmp
|
echo -n >,testtmp
|
||||||
|
|
||||||
if test -f ,expect_stdout; then
|
if ! test -x $TESTBIN; then
|
||||||
if ! cmp ,expect_stdout ,stdout &>/dev/null; then
|
echo -n >,stdout
|
||||||
echo "unexpected data on stdout" >>,testtmp
|
echo "test binary '$TESTBIN' not found" >,stderr
|
||||||
grep -v ': \(TRACE\|INFO\|NOTICE\|WARNING\|ERR\):' <,stdout >,tmp
|
|
||||||
diff -ua ,expect_stdout ,tmp >>,testtmp
|
|
||||||
rm ,tmp
|
|
||||||
((fails+=1))
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -f ,expect_stderr; then
|
|
||||||
if ! cmp ,expect_stderr ,stderr &>/dev/null; then
|
|
||||||
echo "unexpected data on stderr" >>,testtmp
|
|
||||||
grep -v ': \(TRACE\|INFO\|NOTICE\|WARNING\|ERR\):' <,stderr >,tmp
|
|
||||||
diff -ua ,expect_stderr ,tmp >>,testtmp
|
|
||||||
rm ,tmp
|
|
||||||
((fails+=1))
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $expect_return != $return; then
|
|
||||||
echo "unexpected return value $return" >>,testtmp
|
|
||||||
((fails+=1))
|
((fails+=1))
|
||||||
|
|
||||||
|
else
|
||||||
|
if test -f ,send_stdin; then
|
||||||
|
cat ,send_stdin | $valgrind $TESTBIN "$@" 2>,stderr >,stdout
|
||||||
|
else
|
||||||
|
$valgrind $TESTBIN "$@" 2>,stderr >,stdout
|
||||||
|
fi &>/dev/null
|
||||||
|
return=$?
|
||||||
|
|
||||||
|
if test -f ,expect_stdout; then
|
||||||
|
if ! cmp ,expect_stdout ,stdout &>/dev/null; then
|
||||||
|
echo "unexpected data on stdout" >>,testtmp
|
||||||
|
grep -v ': \(TRACE\|INFO\|NOTICE\|WARNING\|ERR\):' <,stdout >,tmp
|
||||||
|
diff -ua ,expect_stdout ,tmp >>,testtmp
|
||||||
|
rm ,tmp
|
||||||
|
((fails+=1))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -f ,expect_stderr; then
|
||||||
|
if ! cmp ,expect_stderr ,stderr &>/dev/null; then
|
||||||
|
echo "unexpected data on stderr" >>,testtmp
|
||||||
|
grep -v ': \(TRACE\|INFO\|NOTICE\|WARNING\|ERR\):' <,stderr >,tmp
|
||||||
|
diff -ua ,expect_stderr ,tmp >>,testtmp
|
||||||
|
rm ,tmp
|
||||||
|
((fails+=1))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$expect_return" != "$return"; then
|
||||||
|
echo "unexpected return value $return" >>,testtmp
|
||||||
|
((fails+=1))
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test $fails -eq 0; then
|
if test $fails -eq 0; then
|
||||||
|
|
@ -191,7 +197,7 @@ function RUNTESTS()
|
||||||
if test \( ! "${TESTSUITES/*,*/}" \) -a "$TESTSUITES"; then
|
if test \( ! "${TESTSUITES/*,*/}" \) -a "$TESTSUITES"; then
|
||||||
TESTSUITES="{$TESTSUITES}"
|
TESTSUITES="{$TESTSUITES}"
|
||||||
fi
|
fi
|
||||||
for t in $(eval echo $srcdir/*$TESTSUITES*.tests); do
|
for t in $(eval echo "$srcdir/*$TESTSUITES*.tests"); do
|
||||||
echo "$t"
|
echo "$t"
|
||||||
done | sort | uniq | {
|
done | sort | uniq | {
|
||||||
while read i; do
|
while read i; do
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
test time and frame calculations
|
|
||||||
|
|
@ -789,20 +789,19 @@ Look at [[Overview]] for the current design proposal
|
||||||
<pre>DataBackend
|
<pre>DataBackend
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div title="File" modifier="CehTeh" modified="200706271509" created="200706201525" changecount="5">
|
<div title="File" modifier="CehTeh" modified="200803271341" created="200803271035" changecount="2">
|
||||||
<pre>'File' is the superclass of all possible filetypes, it has a weak reference to a FileHandle which is managed in FileHandleCache, on creation only the existence (when reading) or access for write for new files are checked. 'File' stores some generic metadata about the underlying file and intended use. But actual opening is done on demand.
|
<pre>[[File]] associates a filename with the underlying FileDescriptor. This allows [[File]]s which have serveral names (hardlinks) to share a underlying backend.</pre>
|
||||||
|
</div>
|
||||||
|
<div title="FileDescriptor" modifier="CehTeh" modified="200803271036" created="200706201525" changecount="2">
|
||||||
|
<pre>'FileDescriptor' is the superclass of all possible filetypes, it has a weak reference to a FileHandle which is managed in FilehandleCache, on creation only the existence (when reading) or access for write for new files are checked. 'FileDescriptor' stores some generic metadata about the underlying file and intended use. But actual opening is done on demand.
|
||||||
|
|
||||||
Files content is memory mapped into the process address space, this is managed by FileMap objects and a FileMapCache.
|
The content is memory mapped into the process address space, this is managed by FileMap objects and a FileMapCache.
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div title="FileHandle" modifier="CehTeh" modified="200706202208" created="200706201535" changecount="2">
|
<div title="FileHandle" modifier="CehTeh" modified="200706202208" created="200706201535" changecount="2">
|
||||||
<pre>'FileHandle's are managed by the FileHandleCache, they are just storing the underlying OS file handles and managed in a lazy/weak way, (re)opened when needed and aging in the cache when not needed, since the amount of open file handles is limited aged ones will be closed and reused when the system needs to open another file.
|
<pre>'FileHandle's are managed by the FileHandleCache, they are just storing the underlying OS file handles and managed in a lazy/weak way, (re)opened when needed and aging in the cache when not needed, since the amount of open file handles is limited aged ones will be closed and reused when the system needs to open another file.
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div title="FileHandleCache" modifier="CehTeh" modified="200706271508" created="200706201548" changecount="5">
|
|
||||||
<pre>'FileHandleCache' storing a finite maximum number of [[FileHandle]]s as a list. As long the configured maximum of open files is not reached new file handles are stored at the begin of the list. Whenever a filehandle is accessed it is moved to the begin of the list too. Unused filehandles propagate towards the end of the list. When the maximum of open filehandles is reached, aged filehandles are closed and taken from the end.
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
<div title="FileMap" modifier="MichaelPloujnikov" modified="200706270315" created="200706201921" changecount="11">
|
<div title="FileMap" modifier="MichaelPloujnikov" modified="200706270315" created="200706201921" changecount="11">
|
||||||
<pre>Each 'FileMap' object contains many [[Frame]]s. The actual layout depends on the type of the [[File]]. Mappings need to be page aligned while [[Frame]]s can be anywhere within a file and dynamically sized.
|
<pre>Each 'FileMap' object contains many [[Frame]]s. The actual layout depends on the type of the [[File]]. Mappings need to be page aligned while [[Frame]]s can be anywhere within a file and dynamically sized.
|
||||||
|
|
||||||
|
|
@ -816,6 +815,10 @@ FileMap objects are transparent to the application. It will only requests [[Fram
|
||||||
Whenever a FileMap is in use, it is checked out into an in-use list where it is not subject to aging.
|
Whenever a FileMap is in use, it is checked out into an in-use list where it is not subject to aging.
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
<div title="FilehandleCache" modifier="CehTeh" modified="200803271025" created="200706201548" changecount="2">
|
||||||
|
<pre>'FilehandleCache' storing a finite maximum number of [[FileHandle]]s as a list. As long the configured maximum of open files is not reached new file handles are stored at the begin of the list. Whenever a filehandle is accessed it is moved to the begin of the list too. Unused filehandles propagate towards the end of the list. When the maximum of open filehandles is reached, aged filehandles are closed and taken from the end.
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
<div title="Frame" modifier="CehTeh" modified="200706271506" created="200706202115" changecount="13">
|
<div title="Frame" modifier="CehTeh" modified="200706271506" created="200706202115" changecount="13">
|
||||||
<pre>'Frames' are the smallest datablocks handled by the Backend. The application tells the Backend to make [[File]]s available and then only requests Frames from the Backend. All other datastructures of the backend are private.
|
<pre>'Frames' are the smallest datablocks handled by the Backend. The application tells the Backend to make [[File]]s available and then only requests Frames from the Backend. All other datastructures of the backend are private.
|
||||||
|
|
||||||
|
|
@ -1254,7 +1257,7 @@ Storage and logging of EDL's, unlimited undo, database,...
|
||||||
When to Cache and when not to cache, aka instant [[Frame]] reuse
|
When to Cache and when not to cache, aka instant [[Frame]] reuse
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div title="Overview" modifier="CehTeh" modified="200706271504" created="200706200040" changecount="12">
|
<div title="Overview" modifier="CehTeh" modified="200803271022" created="200706200040" changecount="13">
|
||||||
<pre>Whenever Lumiera needs to access data this is done through the DataBackend described here.
|
<pre>Whenever Lumiera needs to access data this is done through the DataBackend described here.
|
||||||
|
|
||||||
There are two main kinds how data is handled:
|
There are two main kinds how data is handled:
|
||||||
|
|
@ -1263,7 +1266,7 @@ There are two main kinds how data is handled:
|
||||||
|
|
||||||
The backend uses memory mapping to make data available to the program. This is little different to more common open/read/write/close file access while giving superior performance and much better memory utilization.
|
The backend uses memory mapping to make data available to the program. This is little different to more common open/read/write/close file access while giving superior performance and much better memory utilization.
|
||||||
|
|
||||||
The data backend must be capable to handle more data than will fit into the memory or even address space on 32 bit architectures. Moreover a project may access more files than the OS can handle at a time, thus the for [[File]]s used by the Backend it needs a FileHandleCache to manage filehandles dynamically.
|
The data backend must be capable to handle more data than will fit into the memory or even address space on 32 bit architectures. Moreover a project may access more files than the OS can handle at a time, thus the for [[File]]s used by the Backend it needs a FilehandleCache to manage filehandles dynamically.
|
||||||
|
|
||||||
Which parts of a File are actually mapped to physical RAM is managed by the kernel, it keeps a FileMapCache to manage the [[FileMap]]s we've set up.
|
Which parts of a File are actually mapped to physical RAM is managed by the kernel, it keeps a FileMapCache to manage the [[FileMap]]s we've set up.
|
||||||
|
|
||||||
|
|
|
||||||
11615
wiki/compatibility.html
Normal file
11615
wiki/compatibility.html
Normal file
File diff suppressed because it is too large
Load diff
138
wiki/index.html
138
wiki/index.html
|
|
@ -776,72 +776,6 @@ for __Running__</pre>
|
||||||
* provide central interface for setting switches and configuration options
|
* provide central interface for setting switches and configuration options
|
||||||
* installing of some or all created artifacts</pre>
|
* installing of some or all created artifacts</pre>
|
||||||
</div>
|
</div>
|
||||||
<div title="LumieraDesignProcess" modifier="MichaelPloujnikov" modified="200706270317" created="200706181202" tags="process" changecount="5">
|
|
||||||
<pre>! Lumiera design process
|
|
||||||
A lightweight formalized process how people can add proposals for the Lumiera development.
|
|
||||||
|
|
||||||
|
|
||||||
!! Description
|
|
||||||
Use the Wiki at http://www.pipapo.org/pipawiki/Lumiera/DesignProcess to make it easy to add proposals in a well defined manner.
|
|
||||||
|
|
||||||
I'd like to introduce a slightly formalized process for the ongoing Lumiera planning:
|
|
||||||
* Every proposal is instantiated as 'Idea', the author gives other people the opportunity to review and comment on it with extreme prejudice, while still working out details.
|
|
||||||
* When the the 'Idea' in a proper form and worked out in most details it becomes a 'Draft'. This 'Draft' need to be carefully reviewed, commented, perhaps corrected and rated by the other Developers.
|
|
||||||
* At some point we may decide that a 'Draft' becomes a 'Final' (I leave it open how this decision shall be done for now). 'Final' Documents will be imported into the repository (this wiki, you are reading such a Document right now!).
|
|
||||||
|
|
||||||
* Sometimes proposals will become dropped for some reason, this is indicated by changing their state to 'Dropped', they still stay in the system for further reference.
|
|
||||||
|
|
||||||
!!! Pros
|
|
||||||
* simple
|
|
||||||
* flexible
|
|
||||||
* no much rules
|
|
||||||
* persistent and at Final stage well documented process
|
|
||||||
|
|
||||||
!!! Cons
|
|
||||||
* could be abused/vandalized (but wiki can use ACL's)
|
|
||||||
* depends on my server, this might be unfavorable or unreliable, ymmv.
|
|
||||||
* will only work if all or almost all involved people agree on this process
|
|
||||||
|
|
||||||
!!! Alternatives
|
|
||||||
We could use some forum, Trac, Mailinglist or whatever instead.
|
|
||||||
|
|
||||||
Just for Design documentation I would give [[Bouml|http://bouml.free.fr/]] a try. For myself, I am not very fond of UML Design tools, while Bouml looks quite promising and we could maintain the UML model in git repositories which would be more favorable than this centralized wiki. The backside is that this needs even more agreement between the developers, everyone has to install and use Bouml (and learn its usage) and design is constrained by a external tool.
|
|
||||||
|
|
||||||
This distributed wiki might be used instead the pipapo.org wiki, investigate that for future.
|
|
||||||
|
|
||||||
!! Rationale
|
|
||||||
Wiki works. It is simple to use and just flexible enough to handle the task. I don't go to install any other software for such tasks on my server. While the design progresses I'd propose to move our work into git repositories and eventually phase this wiki pages out anyways. I'd rather like to start out distributed/git right away .. but git gives us only a fine storage layer, for a design process we need some good presentation layer (later when using git and starting the implementation everyones favorite editor serves for that) I have no better ideas yet to solve the presentation problem other than using this wiki (or maybe Bouml).
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
<div title="LumieraWiki" modifier="Ichthyostega" modified="200708170218" created="200706172308" tags="portal" changecount="29">
|
|
||||||
<pre>This is the entry point to several [[TiddlyWiki]]-Pages containing the developer and design documentation for Lumiera.
|
|
||||||
|
|
||||||
* Cehteh started GitNotes where we will collect some information about git, howto and special setups
|
|
||||||
* since we prefer gpg signed tags in git and not each developer knows gpg well here is a Micro-GPG-HowTo
|
|
||||||
* we maintain (semi-) final design docs in DesignDocumentation
|
|
||||||
* Things get often worked out on IRC, see IRC-Transcripts for decisions made there and not yet put into the proper documentation places
|
|
||||||
|
|
||||||
Please __end your tiddlers in a newline__, this makes merging in git easier since the /pre tag used in tiddlywiki will become on a single line.
|
|
||||||
|
|
||||||
----
|
|
||||||
!Design Draft
|
|
||||||
to get started, we create design drafts emphasizing different aspects and regions of Lumiera
|
|
||||||
|
|
||||||
* Ichthyo focuses mainly on the Render Engine and its interconnection to the EDL, [[see this separate page|renderengine.html]]
|
|
||||||
* Cehteh works on the data backend draft, see [[this page|backend.html]]
|
|
||||||
* Some tools which don't fit somewhere else and are used everywhere are put into a [[Support Library|support_library.html]]
|
|
||||||
* [[Description of the Test System|TestSh]]
|
|
||||||
|
|
||||||
!Coding Structures
|
|
||||||
next we should //start thinking// on how to organize several aspects of the practical coding...
|
|
||||||
* what to do in BOUML? &rarr; [[more|whatInBOUML]]
|
|
||||||
* how to organize packages, files, includes? &rarr; [[more|SrcTreeStructure]]
|
|
||||||
* how to organize the executable to be built?
|
|
||||||
* what coding conventions to prefer? &rarr; [[GNU Style|DesignDocumentation]]
|
|
||||||
* what [[build system|BuildSystem]] to use?
|
|
||||||
* various [[build dependencies|BuildDependenceis]]
|
|
||||||
* TestSuite</pre>
|
|
||||||
</div>
|
|
||||||
<div title="DefaultTiddlers" modifier="CehTeh" modified="200707111115" created="200706172308" changecount="3">
|
<div title="DefaultTiddlers" modifier="CehTeh" modified="200707111115" created="200706172308" changecount="3">
|
||||||
<pre>LumieraWiki
|
<pre>LumieraWiki
|
||||||
ShortCuts</pre>
|
ShortCuts</pre>
|
||||||
|
|
@ -1407,9 +1341,77 @@ config.formatters.push( {
|
||||||
} )
|
} )
|
||||||
//}}}</pre>
|
//}}}</pre>
|
||||||
</div>
|
</div>
|
||||||
<div title="MainMenu" modifier="CehTeh" modified="200707111114" created="200706172305" changecount="4">
|
<div title="LumieraDesignProcess" modifier="MichaelPloujnikov" modified="200706270317" created="200706181202" tags="process" changecount="5">
|
||||||
|
<pre>! Lumiera design process
|
||||||
|
A lightweight formalized process how people can add proposals for the Lumiera development.
|
||||||
|
|
||||||
|
|
||||||
|
!! Description
|
||||||
|
Use the Wiki at http://www.pipapo.org/pipawiki/Lumiera/DesignProcess to make it easy to add proposals in a well defined manner.
|
||||||
|
|
||||||
|
I'd like to introduce a slightly formalized process for the ongoing Lumiera planning:
|
||||||
|
* Every proposal is instantiated as 'Idea', the author gives other people the opportunity to review and comment on it with extreme prejudice, while still working out details.
|
||||||
|
* When the the 'Idea' in a proper form and worked out in most details it becomes a 'Draft'. This 'Draft' need to be carefully reviewed, commented, perhaps corrected and rated by the other Developers.
|
||||||
|
* At some point we may decide that a 'Draft' becomes a 'Final' (I leave it open how this decision shall be done for now). 'Final' Documents will be imported into the repository (this wiki, you are reading such a Document right now!).
|
||||||
|
|
||||||
|
* Sometimes proposals will become dropped for some reason, this is indicated by changing their state to 'Dropped', they still stay in the system for further reference.
|
||||||
|
|
||||||
|
!!! Pros
|
||||||
|
* simple
|
||||||
|
* flexible
|
||||||
|
* no much rules
|
||||||
|
* persistent and at Final stage well documented process
|
||||||
|
|
||||||
|
!!! Cons
|
||||||
|
* could be abused/vandalized (but wiki can use ACL's)
|
||||||
|
* depends on my server, this might be unfavorable or unreliable, ymmv.
|
||||||
|
* will only work if all or almost all involved people agree on this process
|
||||||
|
|
||||||
|
!!! Alternatives
|
||||||
|
We could use some forum, Trac, Mailinglist or whatever instead.
|
||||||
|
|
||||||
|
Just for Design documentation I would give [[Bouml|http://bouml.free.fr/]] a try. For myself, I am not very fond of UML Design tools, while Bouml looks quite promising and we could maintain the UML model in git repositories which would be more favorable than this centralized wiki. The backside is that this needs even more agreement between the developers, everyone has to install and use Bouml (and learn its usage) and design is constrained by a external tool.
|
||||||
|
|
||||||
|
This distributed wiki might be used instead the pipapo.org wiki, investigate that for future.
|
||||||
|
|
||||||
|
!! Rationale
|
||||||
|
Wiki works. It is simple to use and just flexible enough to handle the task. I don't go to install any other software for such tasks on my server. While the design progresses I'd propose to move our work into git repositories and eventually phase this wiki pages out anyways. I'd rather like to start out distributed/git right away .. but git gives us only a fine storage layer, for a design process we need some good presentation layer (later when using git and starting the implementation everyones favorite editor serves for that) I have no better ideas yet to solve the presentation problem other than using this wiki (or maybe Bouml).
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
<div title="LumieraWiki" modifier="Ichthyostega" modified="200708170218" created="200706172308" tags="portal" changecount="29">
|
||||||
|
<pre>This is the entry point to several [[TiddlyWiki]]-Pages containing the developer and design documentation for Lumiera.
|
||||||
|
|
||||||
|
* Cehteh started GitNotes where we will collect some information about git, howto and special setups
|
||||||
|
* since we prefer gpg signed tags in git and not each developer knows gpg well here is a Micro-GPG-HowTo
|
||||||
|
* we maintain (semi-) final design docs in DesignDocumentation
|
||||||
|
* Things get often worked out on IRC, see IRC-Transcripts for decisions made there and not yet put into the proper documentation places
|
||||||
|
|
||||||
|
Please __end your tiddlers in a newline__, this makes merging in git easier since the /pre tag used in tiddlywiki will become on a single line.
|
||||||
|
|
||||||
|
----
|
||||||
|
!Design Draft
|
||||||
|
to get started, we create design drafts emphasizing different aspects and regions of Lumiera
|
||||||
|
|
||||||
|
* Ichthyo focuses mainly on the Render Engine and its interconnection to the EDL, [[see this separate page|renderengine.html]]
|
||||||
|
* Cehteh works on the data backend draft, see [[this page|backend.html]]
|
||||||
|
* Some tools which don't fit somewhere else and are used everywhere are put into a [[Support Library|support_library.html]]
|
||||||
|
* [[Description of the Test System|TestSh]]
|
||||||
|
|
||||||
|
!Coding Structures
|
||||||
|
next we should //start thinking// on how to organize several aspects of the practical coding...
|
||||||
|
* what to do in BOUML? &rarr; [[more|whatInBOUML]]
|
||||||
|
* how to organize packages, files, includes? &rarr; [[more|SrcTreeStructure]]
|
||||||
|
* how to organize the executable to be built?
|
||||||
|
* what coding conventions to prefer? &rarr; [[GNU Style|DesignDocumentation]]
|
||||||
|
* what [[build system|BuildSystem]] to use?
|
||||||
|
* various [[build dependencies|BuildDependenceis]]
|
||||||
|
* TestSuite</pre>
|
||||||
|
</div>
|
||||||
|
<div title="MainMenu" modifier="CehTeh" modified="200803281345" created="200706172305" changecount="6">
|
||||||
<pre>GettingStarted
|
<pre>GettingStarted
|
||||||
[[LumieraWiki]]
|
[[LumieraWiki]]
|
||||||
|
[[Compatibility|compatibility.html]]
|
||||||
|
[[ToDo|todo.html]]
|
||||||
[[Backend|backend.html]]
|
[[Backend|backend.html]]
|
||||||
[[Proc-Layer|renderengine.html]]
|
[[Proc-Layer|renderengine.html]]
|
||||||
[[Support-Library|support_library.html]]
|
[[Support-Library|support_library.html]]
|
||||||
|
|
@ -1432,7 +1434,7 @@ Some of these things work quite well, there is an overall friendly relation betw
|
||||||
|
|
||||||
But there are some bad things too. Notably there is not much progress on the community development. Users don't benefit from new improvements which other people have made. There is a endlessly growing list of bugs and feature requests, when someone sends a patch to the ML he has to invest quite some time to maintain it until it might be merged. Finally we don't know what heroine virtual is working on, until we see his next tarball.
|
But there are some bad things too. Notably there is not much progress on the community development. Users don't benefit from new improvements which other people have made. There is a endlessly growing list of bugs and feature requests, when someone sends a patch to the ML he has to invest quite some time to maintain it until it might be merged. Finally we don't know what heroine virtual is working on, until we see his next tarball.
|
||||||
|
|
||||||
!! Solution for "Cinelerra3" / Lumiera
|
!! Solution for "Cinelerra3" / Lumiera
|
||||||
Cinelerra is heroine's product, this time we should work together with him to make it pleasant and progressing for anyone.
|
Cinelerra is heroine's product, this time we should work together with him to make it pleasant and progressing for anyone.
|
||||||
We are in need of a new development model which is acceptable by all involved people and benefits from the way Cinelerra development worked the years before, without maintaining the bad sides again:
|
We are in need of a new development model which is acceptable by all involved people and benefits from the way Cinelerra development worked the years before, without maintaining the bad sides again:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -643,6 +643,11 @@ TertiaryMid: #999
|
||||||
TertiaryDark: #666
|
TertiaryDark: #666
|
||||||
Error: #f88</pre>
|
Error: #f88</pre>
|
||||||
</div>
|
</div>
|
||||||
|
<div title="Cuckoo" modifier="CehTeh" modified="200803281418" created="200803281417" changecount="2">
|
||||||
|
<pre>This hashing gives guaranteed O(1) lookup complexity and amortized O(1) insert and remove complexity. Hash tables by default grow and shrink automatically. It is posible to preallocate entries and turn automatic shrinking off taking out the memory management factors for insert and remove operations. This implementation uses 3 Tables which exponential growing sizes.
|
||||||
|
|
||||||
|
Hash table utilization is commonly between 40-80% which gives better memory usage and far better locality than trees.</pre>
|
||||||
|
</div>
|
||||||
<div title="DefaultTiddlers" modifier="CehTeh" modified="200707102306" created="200707102301" changecount="2">
|
<div title="DefaultTiddlers" modifier="CehTeh" modified="200707102306" created="200707102301" changecount="2">
|
||||||
<pre>[[SupportLibrary]]</pre>
|
<pre>[[SupportLibrary]]</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -2188,6 +2193,31 @@ config.macros.rssFeedUpdate = {
|
||||||
//}}}
|
//}}}
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
<div title="SafeCLib" modifier="CehTeh" modified="200803281413" created="200803281406" changecount="4">
|
||||||
|
<pre>! Memory allocation
|
||||||
|
* lumiera_malloc()
|
||||||
|
Succceeds or dies, no need for error handling.
|
||||||
|
|
||||||
|
! String functions
|
||||||
|
Small wrapers and extensions to the string.h functions, handle NULL pointers gracefully.
|
||||||
|
* lumiera_strndup()
|
||||||
|
Succceeds or dies, no need for error handling.
|
||||||
|
* lumiera_strncmp() lumiera_streq()
|
||||||
|
Optimized comparing same addresses.
|
||||||
|
|
||||||
|
! Round robin temporary buffers
|
||||||
|
Provides 64 buffers per thread which are recycled with each use, the idea here is to have fast buffers for temporal data without need for explicit heap management or stack waste.
|
||||||
|
|
||||||
|
* lumiera_tmpbuf_provide ()
|
||||||
|
Acquire a temporary buffer. doesn't need to be freed. Stays valid for the next 63 tmpbuf calls.
|
||||||
|
|
||||||
|
* lumiera_tmpbuf_strndup ()
|
||||||
|
Duplicate string to a tmpbuf.
|
||||||
|
|
||||||
|
* lumiera_tmpbuf_sprintf ()
|
||||||
|
Construct a string in a tmpbuf.
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
<div title="SelectingInterfaces" modifier="CehTeh" created="200708120132" changecount="2">
|
<div title="SelectingInterfaces" modifier="CehTeh" created="200708120132" changecount="2">
|
||||||
<pre>Each Plugin can export different Interfaces, even same interfaces with different capabilities like a effect for different color models or such.
|
<pre>Each Plugin can export different Interfaces, even same interfaces with different capabilities like a effect for different color models or such.
|
||||||
|
|
||||||
|
|
@ -2419,7 +2449,7 @@ h1,h2,h3,h4,h5,h6 {
|
||||||
/*}}}*/
|
/*}}}*/
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div title="SupportLibrary" modifier="CehTeh" modified="200709021227" created="200707102314" changecount="9">
|
<div title="SupportLibrary" modifier="CehTeh" modified="200803281414" created="200707102314" changecount="11">
|
||||||
<pre>The Support Library contains all tools we need at various places, but by themselves don't defines a subsystem on their own.
|
<pre>The Support Library contains all tools we need at various places, but by themselves don't defines a subsystem on their own.
|
||||||
|
|
||||||
These things are:
|
These things are:
|
||||||
|
|
@ -2428,7 +2458,8 @@ These things are:
|
||||||
* a wrapper for POSIX Threads
|
* a wrapper for POSIX Threads
|
||||||
** Thread creation joining and canceling
|
** Thread creation joining and canceling
|
||||||
** [[Locking primitives like Condition variables and Mutexes|LockingPrimitives]]
|
** [[Locking primitives like Condition variables and Mutexes|LockingPrimitives]]
|
||||||
* [[Frame and Time handling and calculations|FrameAndTime]]
|
* [[Some tools and wrapers around the C library|SafeCLib]]
|
||||||
|
* [[O(1) hashtable using Cuckoo hashing|Cuckoo]]
|
||||||
|
|
||||||
(... to be continued)
|
(... to be continued)
|
||||||
</pre>
|
</pre>
|
||||||
|
|
|
||||||
11631
wiki/todo.html
Normal file
11631
wiki/todo.html
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue