Merge branch 'master' of git://git.lumiera.org/LUMIERA into gui

This commit is contained in:
Joel Holdsworth 2008-05-22 19:31:55 +01:00
commit ea32ce0337
49 changed files with 2381 additions and 115 deletions

View file

@ -33,8 +33,10 @@ SUBDIRS =
include $(top_srcdir)/admin/Makefile.am
# core
include $(top_srcdir)/src/proc/Makefile.am
include $(top_srcdir)/src/common/Makefile.am
include $(top_srcdir)/src/lib/Makefile.am
#include $(top_srcdir)/src/backend/Makefile.am
include $(top_srcdir)/src/backend/Makefile.am
# gui
include $(top_srcdir)/src/gui/Makefile.am
@ -43,6 +45,8 @@ include $(top_srcdir)/src/gui/Makefile.am
#include $(top_srcdir)/src...
# tests
include $(top_srcdir)/tests/common/Makefile.am
include $(top_srcdir)/tests/components/Makefile.am
include $(top_srcdir)/tests/Makefile.am
include $(top_srcdir)/tests/plugin/Makefile.am

View file

@ -18,7 +18,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define _GNU_SOURCE
/*
just place any problematic calls where valgrind whines about in main (with comments please)

View file

@ -23,6 +23,8 @@ AC_COPYRIGHT([
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
])
AC_GNU_SOURCE
#
# Required programs
#
@ -37,11 +39,12 @@ AC_PROG_LIBTOOL
# test for headers
#
AC_STDC_HEADERS
AC_CHECK_HEADER([nobug.h], AC_DEFINE(HAVE_NOBUG_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))
ACX_PTHREAD
LIBS="$PTHREAD_LIBS $LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
CC="$PTHREAD_CC"
##AM_CONDITIONAL([HAVE_THREADING], [test x"$acx_pthread_ok" = xyes])
@ -71,9 +74,62 @@ AC_ARG_ENABLE(release, AC_HELP_STRING([--enable-release], [select NoBug RELEASE
nobug_level=alpha
AC_DEFINE(EBUG_ALPHA)
)])])
AC_MSG_RESULT([NoBug build level: $nobug_level])
# END NoBug
# C headers and libraries
AC_LANG_PUSH([C])
AC_CHECK_HEADER([nobug.h],
AC_DEFINE(HAVE_NOBUG_H),
AC_MSG_ERROR([NoBug header missing (http://www.pipapo.org/pipawiki/NoBug)])
)
AC_CHECK_LIB([nobugmt], nobug_thread_id_get,
,
AC_MSG_ERROR([NoBug multithreading library missing (http://www.pipapo.org/pipawiki/NoBug)])
)
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))
AC_LANG_POP([C])
# C++ headers and libraries
AC_LANG_PUSH([C++])
AC_CHECK_HEADER([tr1/memory],
,
AC_MSG_ERROR([std::tr1 proposed standard extension for shared_ptr missing])
)
AC_CHECK_HEADER([boost/shared_ptr.hpp],
,
AC_MSG_ERROR([boost::shared_ptr missing (http://www.boost.org/)])
)
AC_CHECK_HEADER([boost/program_options.hpp],
,
AC_MSG_ERROR([boost::program_options missing (http://www.boost.org/)])
)
# checking for library left out, name contains compiler version here (libboost_program_options-gcc42-mt-1_34_1.so.1.34.1) any ides how to use that?
AC_CHECK_HEADER([boost/regex.hpp],
,
AC_MSG_ERROR([boost::regex missing (http://www.boost.org/)])
)
AC_LANG_POP([C++])
# Print a summary
AC_MSG_RESULT([
Configuration Summary:])
AC_MSG_RESULT([ NoBug build level: $nobug_level])
# Add more summary results here
AC_MSG_RESULT([
Configuration complete, you can now build Lumiera with 'make'
])
############## Internatinalization
#GETTEXT_PACKAGE=gtk-lumiera

View file

@ -21,17 +21,20 @@ 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_SOURCES = \
$(liblumibackend_a_srcdir)/mediaaccessfacade.cpp \
$(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 \
noinst_HEADERS += \
$(liblumibackend_a_srcdir)/mediaaccessfacade.cpp \
$(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

53
src/backend/backend.c Normal file
View file

@ -0,0 +1,53 @@
/*
backend - common lumiera backend things
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 "backend/backend.h"
#include "backend/filehandlecache.h"
#include "backend/filedescriptor.h"
//NOBUG_DEFINE_FLAG_PARENT (backend, lumiera); TODO
NOBUG_DEFINE_FLAG (backend);
NOBUG_DEFINE_FLAG_PARENT (file_all, backend);
int
lumiera_backend_init (void)
{
NOBUG_INIT_FLAG (backend);
NOBUG_INIT_FLAG (file_all);
NOBUG_INIT_FLAG (file);
TRACE (backend);
lumiera_filedescriptor_registry_init ();
int max_entries = 10; TODO("determine by sysconf (_SC_OPEN_MAX) minus some (big) safety margin "
"add some override to run tests with few filehandles");
lumiera_filehandlecache_new (max_entries);
return 0;
}
void
lumiera_backend_destroy (void)
{
TRACE (backend);
lumiera_filedescriptor_registry_destroy ();
lumiera_filehandlecache_delete ();
}

36
src/backend/backend.h Normal file
View file

@ -0,0 +1,36 @@
/*
backend - common lumiera backend things
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.
*/
#ifndef LUMIERA_BACKEND_H
#define LUMIERA_BACKEND_H
#include <nobug.h>
NOBUG_DECLARE_FLAG (backend);
NOBUG_DECLARE_FLAG (file_all);
NOBUG_DECLARE_FLAG (file);
int
lumiera_backend_init (void);
void
lumiera_backend_destroy (void);
#endif

130
src/backend/file.c Normal file
View file

@ -0,0 +1,130 @@
/*
file.c - file handling
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 "lib/mutex.h"
#include "lib/safeclib.h"
#include "backend/file.h"
#include "backend/filehandlecache.h"
#include "backend/filedescriptor.h"
#include <limits.h>
#include <unistd.h>
NOBUG_DEFINE_FLAG_PARENT (file, file_all);
LUMIERA_ERROR_DEFINE(FILE_CHANGED, "File changed unexpected");
LumieraFile
lumiera_file_init (LumieraFile self, const char* name, int flags)
{
TRACE (file);
if (!(self->descriptor = lumiera_filedescriptor_acquire (name, flags)))
return NULL;
self->name = lumiera_strndup (name, PATH_MAX);
return self;
}
LumieraFile
lumiera_file_destroy (LumieraFile self)
{
TRACE (file);
lumiera_filedescriptor_release (self->descriptor);
free ((void*)self->name);
return self;
}
LumieraFile
lumiera_file_new (const char* name, int flags)
{
TRACE (file);
LumieraFile self = lumiera_malloc (sizeof (lumiera_file));
return lumiera_file_init (self, name, flags);
}
void
lumiera_file_delete (LumieraFile self)
{
TRACE (file);
free (lumiera_file_destroy (self));
}
int
lumiera_file_handle_acquire (LumieraFile self)
{
TRACE (file);
REQUIRE (self);
REQUIRE (self->descriptor);
REQUIRE (lumiera_fhcache);
LUMIERA_MUTEX_SECTION (file, self->descriptor->rh, &self->descriptor->lock)
{
if (!self->descriptor->handle)
/* no handle yet, get a new one */
lumiera_filehandlecache_handle_acquire (lumiera_fhcache, self->descriptor);
else
lumiera_filehandlecache_checkout (lumiera_fhcache, self->descriptor->handle);
if (self->descriptor->handle->fd == -1)
{
int fd;
fd = open (self->name, self->descriptor->flags & LUMIERA_FILE_MASK);
if (fd == -1)
{
LUMIERA_ERROR_SET (file, ERRNO);
}
else
{
struct stat st;
if (fstat (fd, &st) == -1)
{
close (fd);
LUMIERA_ERROR_SET (file, ERRNO);
}
else if (self->descriptor->stat.st_dev != st.st_dev || self->descriptor->stat.st_ino != st.st_ino)
{
close (fd);
/* Woops this is not the file we expected to use */
LUMIERA_ERROR_SET (file, FILE_CHANGED);
}
}
self->descriptor->handle->fd = fd;
}
}
return self->descriptor->handle->fd;
}
void
lumiera_file_handle_release (LumieraFile self)
{
TRACE (file);
LUMIERA_MUTEX_SECTION (file, self->descriptor->rh, &self->descriptor->lock)
{
lumiera_filehandlecache_checkin (lumiera_fhcache, self->descriptor->handle);
}
}

123
src/backend/file.h Normal file
View file

@ -0,0 +1,123 @@
/*
file.h - interface to files by filename
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.
*/
#ifndef LUMIERA_FILE_H
#define LUMIERA_FILE_H
#include "lib/mutex.h"
#include "lib/llist.h"
#include "lib/error.h"
NOBUG_DECLARE_FLAG (file);
LUMIERA_ERROR_DECLARE(FILE_CHANGED);
/**
* @file
* File management
* Handling Files is splitted into different classes:
* 1. The 'lumiera_file' class which acts as interface to the outside for managing files.
* 'lumiera_file' is addressed by the name of the file. Since files can have more than one name (hardlinks)
* many 'lumiera_file' can point to a single 'lumiera_filedescriptor'
* 2. The 'lumiera_filedescriptor' class which does the real work managing the file in the back.
* 3. Since OS-filehandles are a limited resource we access the lazily as 'lumiera_filehandle' which are
* managed in a 'lumiera_filehandlecache'
*/
typedef struct lumiera_file_struct lumiera_file;
typedef lumiera_file* LumieraFile;
#include "backend/filehandle.h"
#include "backend/filedescriptor.h"
#define LUMIERA_FILE_READONLY (O_RDONLY | O_LARGEFILE | O_NOATIME)
#define LUMIERA_FILE_READWRITE (O_RDWR | O_LARGEFILE | O_NOATIME)
#define LUMIERA_FILE_CREATE (O_RDWR | O_LARGEFILE | O_NOATIME | O_CREAT | O_EXCL)
#define LUMIERA_FILE_RECREATE (O_RDWR | O_LARGEFILE | O_NOATIME | O_CREAT | O_TRUNC)
/* creat and excl flags will be masked out for descriptor lookup */
#define LUMIERA_FILE_MASK ~(O_CREAT | O_EXCL | O_TRUNC)
struct lumiera_file_struct
{
const char* name;
LumieraFiledescriptor descriptor;
};
/**
* Initialize a file structure.
* @param self pointer to the file structure
* @param name filename
* @param flags open flags
* @return self
*/
LumieraFile
lumiera_file_init (LumieraFile self, const char* name, int flags);
/**
* Destroy a file structure.
* frees all associated resources, releases the filedescriptor etc.
* @param self file structure to be destroyed
* @return self
*/
LumieraFile
lumiera_file_destroy (LumieraFile self);
/**
* Allocate a new file structure.
* @param name filename
* @param flags open flags
* @return new file structure
*/
LumieraFile
lumiera_file_new (const char* name, int flags);
/**
* Frees a file structure.
* @param self file structure to be freed
*/
void
lumiera_file_delete (LumieraFile self);
/**
* Get a POSIX filehandle for a file.
* Filehandles are opened on demand and must be acquired for use.
* Using filehandles is refcounted and might be nested.
* After using them they must be released which puts them back into filehandlecache aging.
* @param self file structure
* @return POSIX filehandle or -1 on error, check lumiera_error() to retrieve the errorcode
* Currently only LUMIERA_ERROR_ERRNO will be raised but this might change in future.
* Opening files can fail for many reasons and at any time!
*/
int
lumiera_file_handle_acquire (LumieraFile self);
/**
* Put filehandle back into cache aging.
* @param self file which handle to be released
*/
void
lumiera_file_handle_release (LumieraFile self);
#endif

View file

@ -0,0 +1,240 @@
/*
filedescriptor.c - file handling
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 "lib/mutex.h"
#include "lib/safeclib.h"
#include "lib/cuckoo.h"
#include "backend/file.h"
#include "backend/filedescriptor.h"
#include "backend/filehandle.h"
#include "backend/filehandlecache.h"
#include <sys/types.h>
#include <fcntl.h>
#include <limits.h>
#include <unistd.h>
NOBUG_DEFINE_FLAG_PARENT (filedescriptor, file_all);
/*
Filedescriptor registry
This registry stores all acquired filedescriptors for lookup, they will be freed when not referenced anymore.
*/
static Cuckoo registry = NULL;
static lumiera_mutex registry_mutex = {PTHREAD_MUTEX_INITIALIZER};
/*
* setup hashing and compare functions for cuckoo hashing
*/
static size_t
h1 (const void* item, const uint32_t r)
{
const LumieraFiledescriptor i = *(const LumieraFiledescriptor*)item;
return i->stat.st_dev^i->stat.st_ino^(i->flags&LUMIERA_FILE_MASK)
^((i->stat.st_dev^i->stat.st_ino^(i->flags&LUMIERA_FILE_MASK))>>7)^r;
}
static size_t
h2 (const void* item, const uint32_t r)
{
const LumieraFiledescriptor i = *(const LumieraFiledescriptor*)item;
return i->stat.st_dev^i->stat.st_ino^(i->flags&LUMIERA_FILE_MASK)
^((i->stat.st_dev^i->stat.st_ino^(i->flags&LUMIERA_FILE_MASK))>>5)^r;
}
static size_t
h3 (const void* item, const uint32_t r)
{
const LumieraFiledescriptor i = *(const LumieraFiledescriptor*)item;
return i->stat.st_dev^i->stat.st_ino^(i->flags&LUMIERA_FILE_MASK)
^((i->stat.st_dev^i->stat.st_ino^(i->flags&LUMIERA_FILE_MASK))>>3)^r;
}
static int
cmp (const void* keya, const void* keyb)
{
const LumieraFiledescriptor a = *(const LumieraFiledescriptor*)keya;
const LumieraFiledescriptor b = *(const LumieraFiledescriptor*)keyb;
return a->stat.st_dev == b->stat.st_dev && a->stat.st_ino == b->stat.st_ino
&& (a->flags&LUMIERA_FILE_MASK) == (b->flags&LUMIERA_FILE_MASK);
}
void
lumiera_filedescriptor_registry_init (void)
{
NOBUG_INIT_FLAG (filedescriptor);
TRACE (filedescriptor);
REQUIRE (!registry);
registry = cuckoo_new (h1, h2, h3, cmp,
sizeof (LumieraFiledescriptor),
3);
if (!registry)
LUMIERA_DIE (NO_MEMORY);
}
void
lumiera_filedescriptor_registry_destroy (void)
{
TRACE (filedescriptor);
REQUIRE (!cuckoo_nelements (registry));
if (registry)
cuckoo_free (registry);
registry = NULL;
}
LumieraFiledescriptor
lumiera_filedescriptor_acquire (const char* name, int flags)
{
TRACE (filedescriptor, "%s", name);
REQUIRE (registry, "not initialized");
lumiera_mutexacquirer registry_lock;
lumiera_mutexacquirer_init_mutex (&registry_lock, &registry_mutex, LUMIERA_LOCKED);
lumiera_filedescriptor fdesc;
fdesc.flags = flags;
if (stat (name, &fdesc.stat) != 0)
{
if (errno == ENOENT && flags&O_CREAT)
{
char* dir = lumiera_tmpbuf_strndup (name, PATH_MAX);
char* slash = dir;
while ((slash = strchr (slash+1, '/')))
{
*slash = '\0';
INFO (filedescriptor, "try creating dir: %s", dir);
if (mkdir (dir, 0777) == -1 && errno != EEXIST)
{
LUMIERA_ERROR_SET (filedescriptor, ERRNO);
goto efile;
}
*slash = '/';
}
int fd;
INFO (filedescriptor, "try creating file: %s", name);
fd = creat (name, 0777);
if (fd == -1)
{
LUMIERA_ERROR_SET (filedescriptor, ERRNO);
goto efile;
}
close (fd);
if (stat (name, &fdesc.stat) != 0)
{
/* finally, no luck */
LUMIERA_ERROR_SET (filedescriptor, ERRNO);
goto efile;
}
}
}
/* lookup/create descriptor */
LumieraFiledescriptor dest = &fdesc;
LumieraFiledescriptor* found = cuckoo_find (registry, &dest);
if (!found)
{
TRACE (filedescriptor, "Descriptor not found");
dest = lumiera_filedescriptor_new (&fdesc);
if (!dest)
goto ecreate;
cuckoo_insert (registry, &dest);
}
else
{
TRACE (filedescriptor, "Descriptor already existing");
dest = *found;
++dest->refcount;
}
lumiera_mutexacquirer_unlock (&registry_lock);
return dest;
efile:
ecreate:
lumiera_mutexacquirer_unlock (&registry_lock);
return NULL;
}
void
lumiera_filedescriptor_release (LumieraFiledescriptor self)
{
TRACE (filedescriptor);
if (!--self->refcount)
lumiera_filedescriptor_delete (self);
}
LumieraFiledescriptor
lumiera_filedescriptor_new (LumieraFiledescriptor template)
{
LumieraFiledescriptor self = lumiera_malloc (sizeof (lumiera_filedescriptor));
TRACE (filedescriptor, "at %p", self);
self->stat = template->stat;
self->flags = template->flags;
lumiera_mutex_init (&self->lock);
self->refcount = 1;
self->handle = 0;
const char* type = "mutex";
const char* name = "filedescriptor";
RESOURCE_ANNOUNCE (filedescriptor, type, name, self, self->rh);
return self;
}
void
lumiera_filedescriptor_delete (LumieraFiledescriptor self)
{
TRACE (filedescriptor, "%p", self);
lumiera_mutexacquirer registry_lock;
lumiera_mutexacquirer_init_mutex (&registry_lock, &registry_mutex, LUMIERA_LOCKED);
REQUIRE (self->refcount == 0);
RESOURCE_FORGET (filedescriptor, self->rh);
cuckoo_remove (registry, cuckoo_find (registry, &self));
TODO ("destruct other members (WIP)");
TODO ("release filehandle");
lumiera_mutex_destroy (&self->lock);
free (self);
lumiera_mutexacquirer_unlock (&registry_lock);
}

View file

@ -0,0 +1,113 @@
/*
filedescriptor.h - file handling
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.
*/
#ifndef LUMIERA_FILEDESCRIPTOR_H
#define LUMIERA_FILEDESCRIPTOR_H
#include "lib/mutex.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
typedef struct lumiera_filedescriptor_struct lumiera_filedescriptor;
typedef lumiera_filedescriptor* LumieraFiledescriptor;
#include "backend/filehandle.h"
#include "backend/file.h"
/**
* @file
* Filedescriptors.
* Filedescriptors are the underlying working horse in accessing files.
* All information associated with managing a file is kept here.
*/
struct lumiera_filedescriptor_struct
{
struct stat stat; /* create after first open, maintained metadata, MUST BE FIRST! */
int flags; /* open flags, must be masked for reopen */
lumiera_mutex lock; /* locks operations on this file descriptor */
unsigned refcount; /* reference counter, all users sans registry */
LumieraFilehandle handle;
//LumieraFileMap mappings;
//LumieraWriteBuffer writebuffer;
RESOURCE_HANDLE (rh);
};
/**
* Initialize the global filedescriptor registry.
* All filedescriptors are looked up by dev/ino/open-flags in a hashtable. Opening hardlinked
* files will be targeted to the same filedescriptor.
* This function never fails but dies on error.
*/
void
lumiera_filedescriptor_registry_init (void);
/**
* Destroy and free the global filedescriptor registry.
* Never fails.
*/
void
lumiera_filedescriptor_registry_destroy (void);
/**
* Find existing filedescriptor or create one
* @param name name of the file
* @param flags opening flags for the filedescriptor
* @return descriptor on success or NULL on error
*/
LumieraFiledescriptor
lumiera_filedescriptor_acquire (const char* name, int flags);
/**
* Release a filedescriptor.
* @param self filedescriptor to be released
*/
void
lumiera_filedescriptor_release (LumieraFiledescriptor self);
/**
* Allocate a new filedescriptor cloned from a template
* @param template the source filedescriptor
* @return the constrccted filedescriptor
*/
LumieraFiledescriptor
lumiera_filedescriptor_new (LumieraFiledescriptor template);
/**
* Delete a filedescriptor
* Called whenever its reference count drops to zero.
* @param self the filedescriptor to be deleted
*/
void
lumiera_filedescriptor_delete (LumieraFiledescriptor self);
#endif

70
src/backend/filehandle.c Normal file
View file

@ -0,0 +1,70 @@
/*
filehandle - filehandle management and caching
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 "lib/llist.h"
#include "lib/safeclib.h"
#include "backend/file.h"
#include "backend/filehandle.h"
#include "backend/filedescriptor.h"
#include <unistd.h>
NOBUG_DEFINE_FLAG_PARENT (filehandle, file_all);
LumieraFilehandle
lumiera_filehandle_new ()
{
LumieraFilehandle self = lumiera_malloc (sizeof (lumiera_filehandle));
TRACE (filehandle, "%p", self);
llist_init (&self->cachenode);
self->fd = -1;
self->use_cnt = 1;
self->descriptor = NULL;
return self;
}
void*
lumiera_filehandle_destroy_node (LList node)
{
TRACE (filehandle);
REQUIRE (llist_is_empty (node));
LumieraFilehandle self = (LumieraFilehandle)node;
REQUIRE (self->use_cnt == 0);
if (self->fd >= 0)
close (self->fd);
self->fd = -1;
self->descriptor = NULL;
return self;
}
int
lumiera_filehandle_get (LumieraFilehandle self)
{
REQUIRE (self->descriptor);
return -1;
}

69
src/backend/filehandle.h Normal file
View file

@ -0,0 +1,69 @@
/*
filehandle - filehandle management and caching
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.
*/
#ifndef LUMIERA_FILEHANDLE_H
#define LUMIERA_FILEHANDLE_H
#include "lib/error.h"
#include "lib/llist.h"
typedef struct lumiera_filehandle_struct lumiera_filehandle;
typedef lumiera_filehandle* LumieraFilehandle;
#include "backend/filedescriptor.h"
/**
* @file
* Filehandles.
* Filehandles manage the underlying POSIX filehandle for a filedescriptor.
* Since we want to support handling of more files than POSIX filehandles are available on a common system
* the filehandles are opened, cached and closed on demand, see 'filehandlecache'.
*/
/**
* File handles
*/
struct lumiera_filehandle_struct
{
llist cachenode;
int fd;
unsigned use_cnt;
LumieraFiledescriptor descriptor;
};
/**
* Allocate a new filehandle structure.
* @return new filehandle structure
*/
LumieraFilehandle
lumiera_filehandle_new ();
/**
* destroy the resources associated eith a filehandle structure.
* This function is used by the filehandlecache to recycle filehandle structs.
* @param node pointer to the cachenode member of a struct filehandle
* @return pointer to the start of the memory of the destroyed filehandle
*/
void*
lumiera_filehandle_destroy_node (LList node);
#endif

View file

@ -0,0 +1,138 @@
/*
filehandlecache - filehandle management and caching
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 "lib/safeclib.h"
#include "backend/file.h"
#include "backend/filehandlecache.h"
NOBUG_DEFINE_FLAG_PARENT (filehandlecache, file_all);
/* errors */
LUMIERA_ERROR_DEFINE (FILEHANDLECACHE_NOHANDLE, "No filehandle available");
LumieraFilehandlecache lumiera_fhcache = NULL;
void
lumiera_filehandlecache_new (int max_entries)
{
REQUIRE (!lumiera_fhcache, "Filehandlecache already initialized");
NOBUG_INIT_FLAG (filehandlecache);
lumiera_fhcache = lumiera_malloc (sizeof (lumiera_filehandlecache));
lumiera_mrucache_init (&lumiera_fhcache->cache, lumiera_filehandle_destroy_node);
lumiera_fhcache->available = max_entries;
lumiera_fhcache->checked_out = 0;
lumiera_mutex_init (&lumiera_fhcache->lock);
RESOURCE_ANNOUNCE (filehandlecache, "mutex", "filehandlecache", lumiera_fhcache, lumiera_fhcache->rh);
}
void
lumiera_filehandlecache_delete (void)
{
if (lumiera_fhcache)
{
REQUIRE (!lumiera_fhcache->checked_out, "Filehandles in use at shutdown");
RESOURCE_FORGET (filehandlecache, lumiera_fhcache->rh);
lumiera_mrucache_destroy (&lumiera_fhcache->cache);
lumiera_mutex_destroy (&lumiera_fhcache->lock);
free (lumiera_fhcache);
lumiera_fhcache = NULL;
}
}
LumieraFilehandle
lumiera_filehandlecache_handle_acquire (LumieraFilehandlecache self, LumieraFiledescriptor desc)
{
TRACE (filehandlecache);
LumieraFilehandle ret = NULL;
LUMIERA_MUTEX_SECTION (filehandlecache, self->rh, &self->lock)
{
if (self->available <= 0 && self->cache.cached)
{
/* pop a filehandle from cache */
ret = lumiera_mrucache_pop (&self->cache);
if (self->available < 0)
/* try to free overallocated filehandles */
self->available -= self->available + lumiera_mrucache_age (&self->cache, -self->available);
}
else
{
/* allocate new filehandle if we are below the limit or no cached handles are available (overallocating) */
ret = lumiera_filehandle_new ();
if (!ret)
LUMIERA_ERROR_SET (filehandlecache, FILEHANDLECACHE_NOHANDLE);
else
--self->available;
}
ret->use_cnt = 1;
ret->descriptor = desc;
desc->handle = ret;
++self->checked_out;
}
return ret;
}
LumieraFilehandle
lumiera_filehandlecache_checkout (LumieraFilehandlecache self, LumieraFilehandle handle)
{
REQUIRE (self);
REQUIRE (handle);
/* This function is called with the associated descriptor locked, nothing can modify 'handle' */
if (!handle->use_cnt)
{
/* lock cache and checkout */
LUMIERA_MUTEX_SECTION (filehandlecache, self->rh, &self->lock)
{
lumiera_mrucache_checkout (&self->cache, &handle->cachenode);
}
}
++handle->use_cnt;
++self->checked_out;
return handle;
}
void
lumiera_filehandlecache_checkin (LumieraFilehandlecache self, LumieraFilehandle handle)
{
REQUIRE (self);
REQUIRE (handle);
REQUIRE (handle->use_cnt);
/* This function is called with the associated descriptor locked, nothing can modify 'self' */
if (!--handle->use_cnt)
{
/* lock cache and checin */
LUMIERA_MUTEX_SECTION (filehandlecache, self->rh, &self->lock)
{
--self->checked_out;
lumiera_mrucache_checkin (&self->cache, &handle->cachenode);
}
}
}

View file

@ -0,0 +1,108 @@
/*
filehandlecache - filehandle management and caching
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.
*/
#ifndef LUMIERA_FILEHANDLECACHE_H
#define LUMIERA_FILEHANDLECACHE_H
#include "lib/error.h"
#include "lib/mrucache.h"
#include "lib/mutex.h"
typedef struct lumiera_filehandlecache_struct lumiera_filehandlecache;
typedef lumiera_filehandlecache* LumieraFilehandlecache;
#include "backend/filehandle.h"
/**
* @file
* Filehandle management and caching
* The number of filehandles a program can held open is usually limited, since we want to support
* using a less limited number of files and closing/opening for each operation is expensive, we
* provide a cache to keep the most frequent used files open and gracefully close/recycle unused filehandles.
* The filehandlecache defined here protects all operations on the cache with a mutex.
*/
/*
File handle cache manages file handles
*/
struct lumiera_filehandlecache_struct
{
lumiera_mrucache cache;
int available;
int checked_out;
lumiera_mutex lock;
RESOURCE_HANDLE (rh);
};
extern LumieraFilehandlecache lumiera_fhcache;
/**
* Initializes the filehandle cache.
* @param max_entries number how much filehandles shall be managed
* The number of elements the cache can hold is static and should be
* determined by sysconf (_SC_OPEN_MAX) minus some (big) safety margin.
*/
void
lumiera_filehandlecache_new (int max_entries);
/**
* Delete the filehandle cache.
* No filehandles in the cache must be locked, this would be a fatal error.
* The handles are closed automatically.
*/
void
lumiera_filehandlecache_delete (void);
/**
* Get a fresh filehandle.
* @param self pointer to the cache
* @return the new filehandle
*/
LumieraFilehandle
lumiera_filehandlecache_handle_acquire (LumieraFilehandlecache self, LumieraFiledescriptor desc);
/**
* Add filehande back to cache, the filehandle becomes subject of aging.
* @param self pointer to the cache
* @param handle filehandle to be put back
*/
void
lumiera_filehandlecache_add_filehandle (LumieraFilehandlecache self, LumieraFilehandle handle);
/**
* Remove a filehandle from cache aging
* Filehandles which are subject of cache aging must be checked out before they can be used.
* @param self the filehandlecache
* @param handle the filehandle to be checked out
*/
LumieraFilehandle
lumiera_filehandlecache_checkout (LumieraFilehandlecache self, LumieraFilehandle handle);
/**
* Put a filehandle into the cache
* Filehandles which are checked in are subject of cache aging and might get destroyed and reused.
* @param self the filehandlecache
* @param handle the filehandle to be checked in
*/
void
lumiera_filehandlecache_checkin (LumieraFilehandlecache self, LumieraFilehandle handle);
#endif

88
src/backend/mmap.h Normal file
View file

@ -0,0 +1,88 @@
/*
mmap.h - memory mapped acces to files
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.
*/
#ifndef LUMIERA_MMAP_H
#define LUMIERA_MMAP_H
#include "lib/llist.h"
typedef struct lumiera_mmap_struct lumiera_mmap;
typedef lumiera_mmap* LumieraMMap;
#include "backend/filedescriptor.h"
#include <nobug.h>
#include <sys/mman.h>
NOBUG_DECLARE_FLAG (mmap);
/**
* @file
* MMap objects cover a memory maped range in a file
*/
/**
* mmaped area
*
*/
struct lumiera_mmap_struct
{
/** used for the mrucache when checked in the cache OR for attaching owners when checked out **/
llist cachenode;
/** all mmaps of a file are chained in this list, used to find ranges **/
llist searchnode;
off_t start;
size_t size;
void* address;
/** array with refcounters per page **/
unsigned short* refmap;
/** 0 when this mmap is in cache, else the count of attached owners **/
unsigned use_cnt;
//RESOURCE_HANDLE (rh);
};
LumieraMMap
lumiera_mmap_init (LumieraMMap self, LumieraFile file, LList acquirer, off_t start, size_t size, size_t chunksize);
LumieraMMap
lumiera_mmap_new (LumieraFile file, LList acquirer, off_t start, size_t size, size_t chunksize);
void*
lumiera_mmap_destroy_node (LList node);
#endif
/*
// Local Variables:
// mode: C
// c-file-style: "gnu"
// indent-tabs-mode: nil
// End:
*/

136
src/backend/mmapcache.h Normal file
View file

@ -0,0 +1,136 @@
/*
mmapcache.h - handle aging of mmap objects
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.
*/
#ifndef LUMIERA_MMAPCACHE_H
#define LUMIERA_MMAPCACHE_H
#include "lib/error.h"
#include "lib/mrucache.h"
#include "lib/mutex.h"
typedef struct lumiera_mmapcache_struct lumiera_mmapcache;
typedef lumiera_mmapcache* LumieraMMapcache;
#include "backend/mmap.h"
#include <nobug.h>
/**
* @file
* Mmapcache stores a MRU cache of all established mmaped memory regions which are currently not in use.
* The mmapcache also manages the upper limit about how much memory can be mmaped.
*/
struct lumiera_mmapcache_struct
{
lumiera_mrucache cache;
size_t limit;
size_t total;
size_t cached;
lumiera_mutex lock;
RESOURCE_HANDLE (rh);
};
extern LumieraMMapcache lumiera_mcache;
/**
* Initializes the mmapcache.
* @param limit the mmapcache will drop elements when the sum of all mmapings gives over limit
*/
void
lumiera_mmapcache_new (size_t limit);
/**
* Delete the mmap cache.
* No mmaps in the cache must be locked, this would be a fatal error.
* The handles are closed automatically.
*/
void
lumiera_mmapcache_delete (void);
/**
* Get a fresh mmap object.
* when mmaped_limit is reached, the oldest mmap object gets dropped else a new allocated object
* is returned
* @param self pointer to the cache
* @return the new mmap
*/
LumieraMMap
lumiera_mmapcache_mmap_acquire (LumieraMMapcache self);
/**
* Announce a new mmap object to the cache quotas.
* Update the statistics kept in the cache,
* the map object is still considered to be checked out
* @param self pointer to the cache
* @param map object to be announced
*/
void
lumiera_mmapcache_announce (LumieraMMapcache self, LumieraMMap map);
/**
* Remove a mmap object from the cache quotas.
* Update the statistics kept in the cache,
* called by mmap's destructor only
* @param self pointer to the cache
* @param map object to be removed
*/
void
lumiera_mmapcache_forget (LumieraMMapcache self, LumieraMMap map);
/**
* Destroy and free the nelem oldest elements.
* Used to free up resources and memory.
* @param self cache where to free elements.
* @return nelem-(numer of elements which got freed), that is 0 if all requested elements got freed
*/
int
lumiera_mmapcache_age (LumieraMMapcache self);
/**
* Remove a mmap from cache aging
* Mmaps which are subject of cache aging must be checked out before they can be used.
* @param self the mmapcache
* @param handle the mmap to be checked out
*/
LumieraMMap
lumiera_mmapcache_checkout (LumieraMMapcache self, LumieraMMap handle);
/**
* Put a mmap into the cache
* Mmaps which are checked in are subject of cache aging and might get destroyed and reused.
* @param self the mmapcache
* @param handle the mmap to be checked in
*/
void
lumiera_mmapcache_checkin (LumieraMMapcache self, LumieraMMap handle);
#endif
/*
// Local Variables:
// mode: C
// c-file-style: "gnu"
// indent-tabs-mode: nil
// End:
*/

118
src/backend/mmapings.h Normal file
View file

@ -0,0 +1,118 @@
/*
mmapings.h - manage ranges of mmaped areas on a filedescriptor
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.
*/
#ifndef LUMIERA_MMAPINGS_H
#define LUMIERA_MMAPINGS_H
#include "lib/mutex.h"
#include "lib/llist.h"
typedef struct lumiera_mmapings_struct lumiera_mmapings;
typedef lumiera_mmapings* LumieraMMapings;
#include "backend/filedescriptor.h"
#include "backend/mmap.h"
#include <nobug.h>
/**
* @file
* Keeps all mmaped areas
*
*/
struct lumiera_mmapings_struct
{
/** mmaped ranges are kept in an list sorted by the size of the mmaping, might be improved to a tree someday **/
llist mmaps;
/** sum of all mmaped areas, areas might be overlapping **/
// size_t vsz;
/**
* chunkssize is the smallest granularity which is used for mmapping files, it
* should reflect the intended file usage, that is 'pagesize' for small or non growing
* files and some MB for media files. Must be a 2's exponent of pagesize.
**/
size_t chunksize;
LumieraFiledescriptor descriptor;
lumiera_mutex lock;
RESOURCE_HANDLE (rh);
};
/**
* initialize mmapings container
*
*/
LumieraMMapings
lumiera_mmapings_init (LumieraMMapings self, LumieraFile file, size_t chunksize);
/**
* destroy mmapings container and free all resources.
*
*/
LumieraMMapings
lumiera_mmapings_destroy (LumieraMMapings self);
/**
* allocate and initialize new mmapings container
*
*/
LumieraMMapings
lumiera_mmapings_new (LumieraFile file, size_t chunksize);
/**
* destroy and free mmapings container and all its resources
*
*/
void
lumiera_mmapings_delete (LumieraMMapings self);
/**
* acquire a mmap which covers the given range
* @param self mmapings where to search
* @param acquirer list node of the new owner which will registered in the mmap
* @param start begin of the required range
* @param size requested size
* @return MMap object covering the requested range or NULL on error
*/
LumieraMMap
lumiera_mmapings_mmap_acquire (LumieraMMapings self, LumieraFile file, LList acquirer, off_t start, size_t size);
/**
* release a previously acquired MMap object
* @param self mmapings to which the map belongs
* @param acquirer holding node
* @param map object to be released
*/
void
lumiera_mmapings_release_mmap (LumieraMMapings self, LList acquirer, LumieraMMap map);
#endif
/*
// Local Variables:
// mode: C
// c-file-style: "gnu"
// indent-tabs-mode: nil
// End:
*/

65
src/common/Makefile.am Normal file
View file

@ -0,0 +1,65 @@
# 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.
# TODO use -Wextra -Werror
liblumicommon_a_srcdir = $(top_srcdir)/src/common
noinst_LIBRARIES += liblumicommon.a
liblumicommon_a_CXXFLAGS = $(CXXFLAGS) -Wall
liblumicommon_a_CPPFLAGS = -I$(top_srcdir)/src/
liblumicommon_a_SOURCES = \
$(liblumicommon_a_srcdir)/time.cpp \
$(liblumicommon_a_srcdir)/util.cpp \
$(liblumicommon_a_srcdir)/visitor.cpp \
$(liblumicommon_a_srcdir)/cmdline.cpp \
$(liblumicommon_a_srcdir)/configrules.cpp \
$(liblumicommon_a_srcdir)/error.cpp \
$(liblumicommon_a_srcdir)/query.cpp \
$(liblumicommon_a_srcdir)/query/mockconfigrules.cpp \
$(liblumicommon_a_srcdir)/test/suite.cpp \
$(liblumicommon_a_srcdir)/test/testoption.cpp
noinst_HEADERS += \
$(liblumicommon_a_srcdir)/cmdline.hpp \
$(liblumicommon_a_srcdir)/factory.hpp \
$(liblumicommon_a_srcdir)/singleton.hpp \
$(liblumicommon_a_srcdir)/singletonpolicies.hpp \
$(liblumicommon_a_srcdir)/singletonpreconfigure.hpp \
$(liblumicommon_a_srcdir)/time.hpp \
$(liblumicommon_a_srcdir)/typelist.hpp \
$(liblumicommon_a_srcdir)/visitor.hpp \
$(liblumicommon_a_srcdir)/visitordispatcher.hpp \
$(liblumicommon_a_srcdir)/visitorpolicies.hpp \
$(liblumicommon_a_srcdir)/configrules.hpp \
$(liblumicommon_a_srcdir)/error.hpp \
$(liblumicommon_a_srcdir)/multithread.hpp \
$(liblumicommon_a_srcdir)/p.hpp \
$(liblumicommon_a_srcdir)/query.hpp \
$(liblumicommon_a_srcdir)/query/mockconfigrules.hpp \
$(liblumicommon_a_srcdir)/singletonfactory.hpp \
$(liblumicommon_a_srcdir)/singletonsubclass.hpp \
$(liblumicommon_a_srcdir)/typelistutil.hpp \
$(liblumicommon_a_srcdir)/util.hpp \
$(liblumicommon_a_srcdir)/test/mockinjector.hpp \
$(liblumicommon_a_srcdir)/test/suite.hpp \
$(liblumicommon_a_srcdir)/test/testoption.hpp \
$(liblumicommon_a_srcdir)/test/run.hpp

View file

@ -21,28 +21,30 @@ noinst_LIBRARIES += liblumi.a
liblumi_a_CFLAGS = $(CFLAGS) -std=gnu99 -Wall -Werror
liblumi_a_CPPFLAGS = -I$(top_srcdir)/src/
liblumi_a_SOURCES = \
$(liblumi_a_srcdir)/plugin.c \
$(liblumi_a_srcdir)/error.c \
$(liblumi_a_srcdir)/mutex.c \
$(liblumi_a_srcdir)/rwlock.c \
$(liblumi_a_srcdir)/condition.c \
$(liblumi_a_srcdir)/references.c \
$(liblumi_a_srcdir)/uuid.c \
$(liblumi_a_srcdir)/safeclib.c \
$(liblumi_a_srcdir)/cuckoo.c \
$(liblumi_a_srcdir)/mrucache.c
liblumi_a_SOURCES = \
$(liblumi_a_srcdir)/plugin.c \
$(liblumi_a_srcdir)/error.c \
$(liblumi_a_srcdir)/mutex.c \
$(liblumi_a_srcdir)/rwlock.c \
$(liblumi_a_srcdir)/condition.c \
$(liblumi_a_srcdir)/references.c \
$(liblumi_a_srcdir)/uuid.c \
$(liblumi_a_srcdir)/safeclib.c \
$(liblumi_a_srcdir)/cuckoo.c \
$(liblumi_a_srcdir)/mrucache.c \
$(liblumi_a_srcdir)/appconfig.cpp
noinst_HEADERS += \
$(liblumi_a_srcdir)/plugin.h \
$(liblumi_a_srcdir)/error.h \
$(liblumi_a_srcdir)/locking.h \
$(liblumi_a_srcdir)/mutex.h \
$(liblumi_a_srcdir)/rwlock.h \
$(liblumi_a_srcdir)/condition.h \
$(liblumi_a_srcdir)/references.h \
$(liblumi_a_srcdir)/uuid.h \
$(liblumi_a_srcdir)/safeclib.h \
$(liblumi_a_srcdir)/cuckoo.h \
$(liblumi_a_srcdir)/mrucache.h
noinst_HEADERS += \
$(liblumi_a_srcdir)/plugin.h \
$(liblumi_a_srcdir)/error.h \
$(liblumi_a_srcdir)/locking.h \
$(liblumi_a_srcdir)/mutex.h \
$(liblumi_a_srcdir)/rwlock.h \
$(liblumi_a_srcdir)/condition.h \
$(liblumi_a_srcdir)/references.h \
$(liblumi_a_srcdir)/uuid.h \
$(liblumi_a_srcdir)/safeclib.h \
$(liblumi_a_srcdir)/cuckoo.h \
$(liblumi_a_srcdir)/mrucache.h \
$(liblumi_a_srcdir)/appconfig.hpp \
$(liblumi_a_srcdir)/lifecycleregistry.hpp

View file

@ -22,7 +22,8 @@
#include "lib/condition.h"
/**
* @file Condition variables
* @file
* Condition variables
*/
LUMIERA_ERROR_DEFINE (CONDITION_DESTROY, "condition destroy failed");

View file

@ -25,7 +25,8 @@
#include "lib/locking.h"
/**
* @file Condition variables, header
* @file
* Condition variables, header
*/
LUMIERA_ERROR_DECLARE (CONDITION_DESTROY);
@ -167,7 +168,7 @@ lumiera_conditionacquirer_wait (LumieraConditionacquirer self)
* a conditionacquirer must be unlocked before leaving scope
* @param self conditionacquirer associated with a condition variable
*/
static inline int
static inline void
lumiera_conditionacquirer_unlock (LumieraConditionacquirer self)
{
REQUIRE (self);
@ -195,7 +196,7 @@ lumiera_conditionacquirer_signal (LumieraConditionacquirer self)
* signal all waiting threads
* @param self conditionacquirer associated with the condition variable to be signaled
*/
static inline int
static inline void
lumiera_conditionacquirer_broadcast (LumieraConditionacquirer self)
{
REQUIRE (self);

View file

@ -208,6 +208,13 @@ cuckoo_insert_internal_ (Cuckoo self, void* item)
}
size_t
cuckoo_nelements (Cuckoo self)
{
return self->elements;
}
static void
cuckoo_rehash (Cuckoo self)
{

View file

@ -22,7 +22,8 @@
#define CUCKOO_H
/**
* @file Cuckoo hashing
* @file
* Cuckoo hashing
* 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.
@ -105,6 +106,13 @@ cuckoo_destroy (Cuckoo self);
void
cuckoo_free (Cuckoo self);
/**
* Get the number of elements stored in a hash.
* @return number of elements, 0 when empty
*/
size_t
cuckoo_nelements (Cuckoo self);
/**
* Insert an element into a hash.
* amortized O(1) complexity because it may rarely rehash the tables or even grow them.

View file

@ -24,7 +24,8 @@
#include "lib/error.h"
/**
* @file C Error handling in Lumiera.
* @file
* C Error handling in Lumiera.
*/

View file

@ -31,7 +31,8 @@ extern "C" {
#include <stdlib.h>
/**
* @file C Error handling in Lumiera, header.
* @file
* C Error handling in Lumiera, header.
*/

View file

@ -27,7 +27,8 @@
#include <stddef.h>
/**
* @file Intrusive cyclic double linked list
* @file
* Intrusive cyclic double linked list
* There is only one node type which contains a forward and a backward pointer. In a empty initialized node,
* this pointers point to the node itself. Note that these pointers can never ever become NULL.
* This lists are used by using one node as 'root' node where its both pointers are the head/tail pointer to the actual list.

View file

@ -34,7 +34,8 @@ LUMIERA_ERROR_DECLARE (MUTEX_UNLOCK);
LUMIERA_ERROR_DECLARE (MUTEX_DESTROY);
/**
* @file Shared declarations for all locking primitives.
* @file
* Shared declarations for all locking primitives.
*/
/**

View file

@ -21,12 +21,6 @@
#include "lib/mrucache.h"
/**
* @file Most recent used cache
* Elements (addressed by a LList node) are either in the cache and thereby subject of aging
* or checked out under control of the user.
*/
LumieraMruCache
lumiera_mrucache_init (LumieraMruCache self, lumiera_cache_destructor_fn destructor_cb)
@ -43,6 +37,7 @@ lumiera_mrucache_destroy (LumieraMruCache self)
{
LLIST_WHILE_TAIL (&self->cache_list, node)
{
llist_unlink (node);
if (self->destructor_cb)
free (self->destructor_cb (node));
else
@ -52,10 +47,6 @@ lumiera_mrucache_destroy (LumieraMruCache self)
return self;
}
/**
* destroy and free the nelem oldest elements
*/
int
lumiera_mrucache_age (LumieraMruCache self, int nelem)
{

View file

@ -27,14 +27,17 @@
#include <nobug.h>
/**
* @file Most recent used cache
* Elements (addressed by a LList node) are either in the cache and thereby subject of aging
* or checked out under control of the user.
* @file
* Most recent used cache
* Elements (addressed by a LList node) are either checked in the cache and thereby subject of aging
* or checked out under control of the user. Most operations require that the chache is locked. This locking
* must be done from elsewhere.
*/
/**
* Callback function used to destruct/cleanup aged elements.
* shall clean the element sufficiently up to be ready for being freed or reused
* shall clean the element sufficiently up to be ready for being freed or reused,
* this callback function must be reentrant and prepared to be called twice.
* @param node the llist node used to link cache elements (will be empty at call)
* @return pointer to the begin of the element.
*/
@ -50,24 +53,34 @@ typedef struct lumiera_mrucache_struct lumiera_mrucache;
typedef lumiera_mrucache* LumieraMruCache;
/**
* Initialize a mrucache
* Initialize a cache.
* @param self cache to be initialized
* @param destructor_cb function for destructing a cache node, preparing for reuse.
* @return self
*/
LumieraMruCache
lumiera_mrucache_init (LumieraMruCache self, lumiera_cache_destructor_fn destructor_cb);
/**
* Destroy a mrucache
* Destroy a cache.
* frees all checked in items.
* @param self cache to be destroyed
* @return self
*/
LumieraMruCache
lumiera_mrucache_destroy (LumieraMruCache self);
/**
* add an element to a mrucache
* Add an element to a mrucache.
* When added the element is subject of aging and must not be accessed anymore.
* To acces elements they have to be checked out again.
* Checkin and checkout operations must be protected by a lock over the cache.
* @param self cache where to checkin
* @param node a llist member in the cached data which is used as queue in the cache
*/
static inline void
lumiera_mrucache_add (LumieraMruCache self, LList node)
lumiera_mrucache_checkin (LumieraMruCache self, LList node)
{
REQUIRE (self);
REQUIRE (node && llist_is_empty (node));
@ -77,10 +90,47 @@ lumiera_mrucache_add (LumieraMruCache self, LList node)
/**
* Remove an element from a mrucache.
* Schedule an element for fast aging.
* When an element is not longer needed it can be placed at the end of the chache
* aging queue and thus become the first one to be reused when a new element is queried.
* This can be done on a checked out element as well as on an element which is in the cache.
* The cache must be locked for this operation.
* @param self cache
* @param node a llist member in the cached data which is used as queue in the cache
*/
static inline void
lumiera_mrucache_remove (LumieraMruCache self, LList node)
lumiera_mrucache_drop (LumieraMruCache self, LList node)
{
REQUIRE (self);
REQUIRE (node);
if (llist_is_empty (node))
{
/* was not in list, we need to count it */
++self->cached;
}
else
{
/* speedup loop warning :P, this check is costly */
REQUIRE (llist_is_member (&self->cache_list, node), "node must be empty or member of cache");
}
llist_insert_tail (&self->cache_list, node);
if (self->destructor_cb)
self->destructor_cb (node);
}
/**
* Checkout an element from a cache.
* A checked out element is not under cache control anymore until is gets checked in again.
* The code which checked the element out takes ownership of the element.
* The cache must be locked for this operation.
* @param self cache
* @param node a llist member in the cached data which is used as queue in the cache
*/
static inline void
lumiera_mrucache_checkout (LumieraMruCache self, LList node)
{
REQUIRE (self);
REQUIRE (node && llist_is_member (&self->cache_list, node)); /* speedup loop warning :P, this check is costly */
@ -88,8 +138,13 @@ lumiera_mrucache_remove (LumieraMruCache self, LList node)
--self->cached;
}
/**
* destroy the oldest element and return a pointer to it for reuse.
* Destroy the oldest element from the cache and return it.
* This function is used to get a new element by deleting the oldest least used one from the cache.
* The cache must be locked for this operation.
* @param self cache
* @return pointer to the uninitialized memory ready for being reused
*/
static inline void*
lumiera_mrucache_pop (LumieraMruCache self)
@ -98,7 +153,7 @@ lumiera_mrucache_pop (LumieraMruCache self)
if (llist_is_empty (&self->cache_list))
return NULL;
LList node = llist_tail (&self->cache_list);
LList node = llist_tail (&self->cache_list);
llist_unlink (node);
--self->cached;
@ -110,7 +165,11 @@ lumiera_mrucache_pop (LumieraMruCache self)
/**
* destroy and free the nelem oldest elements
* Destroy and free the nelem oldest elements.
* Used to free up resources and memory.
* @param self cache where to free elements.
* @param nelem number of elements wished to be freed
* @return nelem-(numer of elements which got freed), that is 0 if all requested elements got freed
*/
int
lumiera_mrucache_age (LumieraMruCache self, int nelem);

View file

@ -22,7 +22,8 @@
#include "lib/mutex.h"
/**
* @file Mutual exclusion locking.
* @file
* Mutual exclusion locking.
*/
LUMIERA_ERROR_DEFINE (MUTEX_LOCK, "Mutex locking failed");

View file

@ -25,14 +25,18 @@
#include "lib/locking.h"
/**
* @file Mutual exclusion locking, header.
* @file
* Mutual exclusion locking, header.
*/
#define LUMIERA_MUTEX_SECTION(mutex) \
#define LUMIERA_MUTEX_SECTION(flag, handle, mutex) \
RESOURCE_HANDLE (rh_##__LINE__##_); \
lumiera_mutexacquirer lock_##__LINE__##_; \
RESOURCE_ENTER (flag, handle, "acquire mutex", &lock_##__LINE__##_, \
NOBUG_RESOURCE_EXCLUSIVE, rh_##__LINE__##_); \
for (lumiera_mutexacquirer_init_mutex (&lock_##__LINE__##_, mutex, LUMIERA_LOCKED); \
lock_##__LINE__##_.state == LUMIERA_LOCKED; \
lumiera_mutexacquirer_unlock (&lock_##__LINE__##_))
lumiera_mutexacquirer_unlock (&lock_##__LINE__##_), \
({RESOURCE_LEAVE(flag, rh_##__LINE__##_);}))
/**

View file

@ -31,7 +31,8 @@
#include "safeclib.h"
/**
* @file Plugin loader.
* @file
* Plugin loader.
*/

View file

@ -33,7 +33,8 @@ extern "C" {
#include "error.h"
/**
* @file Plugin loader, header.
* @file
* Plugin loader, header.
*/

View file

@ -22,7 +22,8 @@
#include "lib/safeclib.h"
/**
* @file Strong and Weak references
* @file
* Strong and Weak references
* Strong references keep some object alive while they existing
* Weak references become invalidated when the referenced object gets destroyed
*

View file

@ -25,7 +25,8 @@
#include <nobug.h>
/**
* @file Strong and Weak references, header.
* @file
* Strong and Weak references, header.
*/

View file

@ -18,8 +18,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define _GNU_SOURCE
#include <errno.h>
#include "lib/rwlock.h"
@ -31,7 +29,8 @@ LUMIERA_ERROR_DEFINE(RWLOCK_RLOCK, "rlock");
LUMIERA_ERROR_DEFINE(RWLOCK_WLOCK, "wlock");
/**
* @file Read/write locks.
* @file
* Read/write locks.
*/

View file

@ -39,7 +39,8 @@ LUMIERA_ERROR_DECLARE(RWLOCK_RLOCK);
LUMIERA_ERROR_DECLARE(RWLOCK_WLOCK);
/**
* @file Read/write locks, header.
* @file
* Read/write locks, header.
*/

View file

@ -1,7 +1,7 @@
/*
safe_clib.c - Portable and safe wrapers around some clib functions and some tools
Copyright (C) CinelerraCV
Copyright (C) Lumiera.org
2008, Christian Thaeter <ct@pipapo.org>
This program is free software; you can redistribute it and/or
@ -18,8 +18,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define _GNU_SOURCE
#include "error.h"
#include <string.h>
@ -29,7 +27,8 @@
#include <stdarg.h>
/**
* @file Portable and safe wrapers around some clib functions and some tools
* @file
* Portable and safe wrapers around some clib functions and some tools
*/
LUMIERA_ERROR_DEFINE (NO_MEMORY, "Out of Memory!");
@ -41,9 +40,26 @@ LUMIERA_ERROR_DEFINE (NO_MEMORY, "Out of Memory!");
* @return pointer to the allocated memory
*/
void*
lumiera_malloc (size_t sz)
lumiera_malloc (size_t size)
{
void* o = sz? malloc (sz) : NULL;
void* o = size ? malloc (size) : NULL;
if (!o)
LUMIERA_DIE (NO_MEMORY);
return o;
}
/**
* Allocate cleared memory for an array.
* always succeeds or dies
* @param n number of elements
* @param size memory to be allocated
* @return pointer to the allocated memory
*/
void*
lumiera_calloc (size_t n, size_t size)
{
void* o = (n&&size)? calloc (n, size) : NULL;
if (!o)
LUMIERA_DIE (NO_MEMORY);
return o;
@ -122,7 +138,6 @@ static void
lumiera_tmpbuf_destroy (void* buf)
{
lumiera_tmpbuf_freeall ();
free (buf);
}
static void
@ -141,17 +156,13 @@ lumiera_tmpbuf_freeall (void)
{
pthread_once (&lumiera_tmpbuf_tls_once, lumiera_tmpbuf_init);
struct lumiera_tmpbuf_struct* buf = pthread_getspecific (lumiera_tmpbuf_tls_key);
if (!buf)
pthread_setspecific (lumiera_tmpbuf_tls_key,
buf = lumiera_malloc (sizeof (struct lumiera_tmpbuf_struct)));
for (buf->idx = 0; buf->idx < 64; ++buf->idx)
if (buf)
{
free (buf->buffers[buf->idx]);
buf->buffers[buf->idx] = NULL;
buf->sizes[buf->idx] = 0;
pthread_setspecific (lumiera_tmpbuf_tls_key, NULL);
for (int idx = 0; idx < 64; ++idx)
free (buf->buffers[idx]);
free (buf);
}
buf->idx = 0;
}
@ -167,7 +178,7 @@ lumiera_tmpbuf_provide (size_t size)
struct lumiera_tmpbuf_struct* buf = pthread_getspecific (lumiera_tmpbuf_tls_key);
if (!buf)
pthread_setspecific (lumiera_tmpbuf_tls_key,
buf = lumiera_malloc (sizeof (struct lumiera_tmpbuf_struct)));
buf = lumiera_calloc (1, sizeof (struct lumiera_tmpbuf_struct)));
buf->idx = (buf->idx + 1) & 0x3f;
@ -196,7 +207,7 @@ lumiera_tmpbuf_strndup (const char* src, size_t size)
char*
lumiera_tmpbuf_sprintf (size_t size, const char* fmt, ...)
lumiera_tmpbuf_snprintf (size_t size, const char* fmt, ...)
{
va_list args;
@ -205,9 +216,9 @@ lumiera_tmpbuf_sprintf (size_t size, const char* fmt, ...)
va_end (args);
len = len > size ? size : len;
char* buf = lumiera_tmpbuf_provide (len);
char* buf = lumiera_tmpbuf_provide (len+1);
va_start (args, fmt);
vsnprintf (buf, len, fmt, args);
vsnprintf (buf, len+1, fmt, args);
va_end (args);
return buf;

View file

@ -24,7 +24,8 @@
#include <stdlib.h>
/**
* @file Portable and safe wrapers around some clib functions and some tools
* @file
* Portable and safe wrapers around some clib functions and some tools
*/
LUMIERA_ERROR_DECLARE(NO_MEMORY);
@ -38,6 +39,17 @@ void*
lumiera_malloc (size_t sz);
/**
* Allocate cleared memory for an array.
* always succeeds or dies
* @param n number of elements
* @param size memory to be allocated
* @return pointer to the allocated memory
*/
void*
lumiera_calloc (size_t n, size_t size);
/**
* Duplicate a C string.
* always succeeds or dies
@ -84,7 +96,6 @@ lumiera_streq (const char* a, const char* b);
void
lumiera_tmpbuf_freeall (void);
/**
* Query a thread local tmpbuf.
* @param size minimal needed size for the tmpbuf
@ -110,5 +121,5 @@ lumiera_tmpbuf_strndup (const char* src, size_t size);
* @return temporary buffer containing the constructed of the string
*/
char*
lumiera_tmpbuf_sprintf (size_t size, const char* fmt, ...);
lumiera_tmpbuf_snprintf (size_t size, const char* fmt, ...);

251
src/proc/Makefile.am Normal file
View file

@ -0,0 +1,251 @@
# 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.
# TODO use -Wextra -Werror
liblumiproc_a_srcdir = $(top_srcdir)/src/proc
noinst_LIBRARIES += liblumiproc.a
liblumiproc_a_CXXFLAGS = $(CXXFLAGS) -Wall
liblumiproc_a_CPPFLAGS = -I$(top_srcdir)/src/
liblumiproc_a_SOURCES = \
$(liblumiproc_a_srcdir)/controllerfacade.cpp \
$(liblumiproc_a_srcdir)/frame.cpp \
$(liblumiproc_a_srcdir)/stateproxy.cpp \
$(liblumiproc_a_srcdir)/asset.cpp \
$(liblumiproc_a_srcdir)/assetmanager.cpp \
$(liblumiproc_a_srcdir)/nobugcfg.cpp
liblumiprocasset_a_srcdir = $(top_srcdir)/src/proc/asset
noinst_LIBRARIES += liblumiprocasset.a
liblumiprocasset_a_CXXFLAGS = $(CXXFLAGS) -Wall
liblumiprocasset_a_CPPFLAGS = -I$(top_srcdir)/src/
liblumiprocasset_a_SOURCES = \
$(liblumiprocasset_a_srcdir)/codec.cpp \
$(liblumiprocasset_a_srcdir)/compoundmedia.cpp \
$(liblumiprocasset_a_srcdir)/dataset.cpp \
$(liblumiprocasset_a_srcdir)/effect.cpp \
$(liblumiprocasset_a_srcdir)/preview.cpp \
$(liblumiprocasset_a_srcdir)/unknown.cpp \
$(liblumiprocasset_a_srcdir)/clip.cpp \
$(liblumiprocasset_a_srcdir)/meta.cpp \
$(liblumiprocasset_a_srcdir)/category.cpp \
$(liblumiprocasset_a_srcdir)/media.cpp \
$(liblumiprocasset_a_srcdir)/pipe.cpp \
$(liblumiprocasset_a_srcdir)/proc.cpp \
$(liblumiprocasset_a_srcdir)/procpatt.cpp \
$(liblumiprocasset_a_srcdir)/struct.cpp \
$(liblumiprocasset_a_srcdir)/track.cpp
liblumiprocengine_a_srcdir = $(top_srcdir)/src/proc/engine
noinst_LIBRARIES += liblumiprocengine.a
liblumiprocengine_a_CXXFLAGS = $(CXXFLAGS) -Wall
liblumiprocengine_a_CPPFLAGS = -I$(top_srcdir)/src/
liblumiprocengine_a_SOURCES = \
$(liblumiprocengine_a_srcdir)/aframe.cpp \
$(liblumiprocengine_a_srcdir)/arender.cpp \
$(liblumiprocengine_a_srcdir)/codecadapter.cpp \
$(liblumiprocengine_a_srcdir)/exitnode.cpp \
$(liblumiprocengine_a_srcdir)/glbuf.cpp \
$(liblumiprocengine_a_srcdir)/glpipe.cpp \
$(liblumiprocengine_a_srcdir)/glrender.cpp \
$(liblumiprocengine_a_srcdir)/hub.cpp \
$(liblumiprocengine_a_srcdir)/link.cpp \
$(liblumiprocengine_a_srcdir)/mask.cpp \
$(liblumiprocengine_a_srcdir)/pluginadapter.cpp \
$(liblumiprocengine_a_srcdir)/processor.cpp \
$(liblumiprocengine_a_srcdir)/procnode.cpp \
$(liblumiprocengine_a_srcdir)/projector.cpp \
$(liblumiprocengine_a_srcdir)/renderengine.cpp \
$(liblumiprocengine_a_srcdir)/source.cpp \
$(liblumiprocengine_a_srcdir)/trafo.cpp \
$(liblumiprocengine_a_srcdir)/vframe.cpp \
$(liblumiprocengine_a_srcdir)/vrender.cpp
liblumiprocmobject_a_srcdir = $(top_srcdir)/src/proc/mobject
noinst_LIBRARIES += liblumiprocmobject.a
liblumiprocmobject_a_CXXFLAGS = $(CXXFLAGS) -Wall
liblumiprocmobject_a_CPPFLAGS = -I$(top_srcdir)/src/
liblumiprocmobject_a_SOURCES = \
$(liblumiprocmobject_a_srcdir)/builderfacade.cpp \
$(liblumiprocmobject_a_srcdir)/interpolator.cpp \
$(liblumiprocmobject_a_srcdir)/mobject.cpp \
$(liblumiprocmobject_a_srcdir)/parameter.cpp \
$(liblumiprocmobject_a_srcdir)/paramprovider.cpp \
$(liblumiprocmobject_a_srcdir)/placement.cpp
liblumiprocmobjectbuilder_a_srcdir = $(top_srcdir)/src/proc/mobject/builder
noinst_LIBRARIES += liblumiprocmobjectbuilder.a
liblumiprocmobjectbuilder_a_CXXFLAGS = $(CXXFLAGS) -Wall
liblumiprocmobjectbuilder_a_CPPFLAGS = -I$(top_srcdir)/src/
liblumiprocmobjectbuilder_a_SOURCES = \
$(liblumiprocmobjectbuilder_a_srcdir)/assembler.cpp \
$(liblumiprocmobjectbuilder_a_srcdir)/conmanager.cpp \
$(liblumiprocmobjectbuilder_a_srcdir)/nodecreatertool.cpp \
$(liblumiprocmobjectbuilder_a_srcdir)/segmentationtool.cpp \
$(liblumiprocmobjectbuilder_a_srcdir)/toolfactory.cpp
liblumiprocmobjectcontroller_a_srcdir = $(top_srcdir)/src/proc/mobject/controller
noinst_LIBRARIES += liblumiprocmobjectcontroller.a
liblumiprocmobjectcontroller_a_CXXFLAGS = $(CXXFLAGS) -Wall
liblumiprocmobjectcontroller_a_CPPFLAGS = -I$(top_srcdir)/src/
liblumiprocmobjectcontroller_a_SOURCES = \
$(liblumiprocmobjectcontroller_a_srcdir)/pathmanager.cpp \
$(liblumiprocmobjectcontroller_a_srcdir)/renderstate.cpp
liblumiprocmobjectsession_a_srcdir = $(top_srcdir)/src/proc/mobject/session
noinst_LIBRARIES += liblumiprocmobjectsession.a
liblumiprocmobjectsession_a_CXXFLAGS = $(CXXFLAGS) -Wall
liblumiprocmobjectsession_a_CPPFLAGS = -I$(top_srcdir)/src/
liblumiprocmobjectsession_a_SOURCES = \
$(liblumiprocmobjectsession_a_srcdir)/abstractmo.cpp \
$(liblumiprocmobjectsession_a_srcdir)/allocation.cpp \
$(liblumiprocmobjectsession_a_srcdir)/auto.cpp \
$(liblumiprocmobjectsession_a_srcdir)/compoundclip.cpp \
$(liblumiprocmobjectsession_a_srcdir)/effect.cpp \
$(liblumiprocmobjectsession_a_srcdir)/fixedlocation.cpp \
$(liblumiprocmobjectsession_a_srcdir)/label.cpp \
$(liblumiprocmobjectsession_a_srcdir)/meta.cpp \
$(liblumiprocmobjectsession_a_srcdir)/relativelocation.cpp \
$(liblumiprocmobjectsession_a_srcdir)/segment.cpp \
$(liblumiprocmobjectsession_a_srcdir)/simpleclip.cpp \
$(liblumiprocmobjectsession_a_srcdir)/plug.cpp \
$(liblumiprocmobjectsession_a_srcdir)/sessionimpl.cpp \
$(liblumiprocmobjectsession_a_srcdir)/sessmanagerimpl.cpp \
$(liblumiprocmobjectsession_a_srcdir)/edl.cpp \
$(liblumiprocmobjectsession_a_srcdir)/session.cpp \
$(liblumiprocmobjectsession_a_srcdir)/track.cpp \
$(liblumiprocmobjectsession_a_srcdir)/clip.cpp \
$(liblumiprocmobjectsession_a_srcdir)/constraint.cpp \
$(liblumiprocmobjectsession_a_srcdir)/defsmanager.cpp \
$(liblumiprocmobjectsession_a_srcdir)/fixture.cpp \
$(liblumiprocmobjectsession_a_srcdir)/locatingpin.cpp \
$(liblumiprocmobjectsession_a_srcdir)/mobjectfactory.cpp \
$(liblumiprocmobjectsession_a_srcdir)/wish.cpp
noinst_HEADERS += \
$(liblumiproc_a_srcdir)/asset/category.hpp \
$(liblumiproc_a_srcdir)/asset/clip.hpp \
$(liblumiproc_a_srcdir)/asset/codec.hpp \
$(liblumiproc_a_srcdir)/asset/compoundmedia.hpp \
$(liblumiproc_a_srcdir)/asset/dataset.hpp \
$(liblumiproc_a_srcdir)/asset/effect.hpp \
$(liblumiproc_a_srcdir)/asset/preview.hpp \
$(liblumiproc_a_srcdir)/asset/db.hpp \
$(liblumiproc_a_srcdir)/asset/buildinstruct.hpp \
$(liblumiproc_a_srcdir)/asset/media.hpp \
$(liblumiproc_a_srcdir)/asset/meta.hpp \
$(liblumiproc_a_srcdir)/asset/pipe.hpp \
$(liblumiproc_a_srcdir)/asset/proc.hpp \
$(liblumiproc_a_srcdir)/asset/procpatt.hpp \
$(liblumiproc_a_srcdir)/asset/struct.hpp \
$(liblumiproc_a_srcdir)/asset/structfactoryimpl.hpp \
$(liblumiproc_a_srcdir)/asset/track.hpp \
$(liblumiproc_a_srcdir)/asset/unknown.hpp \
$(liblumiproc_a_srcdir)/controllerfacade.hpp \
$(liblumiproc_a_srcdir)/engine/aframe.hpp \
$(liblumiproc_a_srcdir)/engine/arender.hpp \
$(liblumiproc_a_srcdir)/engine/codecadapter.hpp \
$(liblumiproc_a_srcdir)/engine/exitnode.hpp \
$(liblumiproc_a_srcdir)/engine/glbuf.hpp \
$(liblumiproc_a_srcdir)/engine/glpipe.hpp \
$(liblumiproc_a_srcdir)/engine/glrender.hpp \
$(liblumiproc_a_srcdir)/engine/hub.hpp \
$(liblumiproc_a_srcdir)/engine/link.hpp \
$(liblumiproc_a_srcdir)/engine/mask.hpp \
$(liblumiproc_a_srcdir)/engine/pluginadapter.hpp \
$(liblumiproc_a_srcdir)/engine/procnode.hpp \
$(liblumiproc_a_srcdir)/engine/projector.hpp \
$(liblumiproc_a_srcdir)/engine/renderengine.hpp \
$(liblumiproc_a_srcdir)/engine/source.hpp \
$(liblumiproc_a_srcdir)/engine/trafo.hpp \
$(liblumiproc_a_srcdir)/engine/vframe.hpp \
$(liblumiproc_a_srcdir)/engine/vrender.hpp \
$(liblumiproc_a_srcdir)/engine/processor.hpp \
$(liblumiproc_a_srcdir)/frame.hpp \
$(liblumiproc_a_srcdir)/mobject/builder/assembler.hpp \
$(liblumiproc_a_srcdir)/mobject/builder/buildertool.hpp \
$(liblumiproc_a_srcdir)/mobject/builder/conmanager.hpp \
$(liblumiproc_a_srcdir)/mobject/builder/nodecreatertool.hpp \
$(liblumiproc_a_srcdir)/mobject/builder/segmentationtool.hpp \
$(liblumiproc_a_srcdir)/mobject/builder/toolfactory.hpp \
$(liblumiproc_a_srcdir)/mobject/builderfacade.hpp \
$(liblumiproc_a_srcdir)/mobject/controller/pathmanager.hpp \
$(liblumiproc_a_srcdir)/mobject/controller/renderstate.hpp \
$(liblumiproc_a_srcdir)/mobject/interpolator.hpp \
$(liblumiproc_a_srcdir)/mobject/parameter.hpp \
$(liblumiproc_a_srcdir)/mobject/paramprovider.hpp \
$(liblumiproc_a_srcdir)/mobject/session/abstractmo.hpp \
$(liblumiproc_a_srcdir)/mobject/session/allocation.hpp \
$(liblumiproc_a_srcdir)/mobject/session/auto.hpp \
$(liblumiproc_a_srcdir)/mobject/session/compoundclip.hpp \
$(liblumiproc_a_srcdir)/mobject/session/effect.hpp \
$(liblumiproc_a_srcdir)/mobject/session/fixedlocation.hpp \
$(liblumiproc_a_srcdir)/mobject/session/label.hpp \
$(liblumiproc_a_srcdir)/mobject/session/meta.hpp \
$(liblumiproc_a_srcdir)/mobject/session/relativelocation.hpp \
$(liblumiproc_a_srcdir)/mobject/session/simpleclip.hpp \
$(liblumiproc_a_srcdir)/mobject/session/mobjectfactory.hpp \
$(liblumiproc_a_srcdir)/mobject/session/segment.hpp \
$(liblumiproc_a_srcdir)/mobject/session/track.hpp \
$(liblumiproc_a_srcdir)/mobject/session/wish.hpp \
$(liblumiproc_a_srcdir)/mobject/session/clip.hpp \
$(liblumiproc_a_srcdir)/mobject/session/constraint.hpp \
$(liblumiproc_a_srcdir)/mobject/session/defsmanager.hpp \
$(liblumiproc_a_srcdir)/mobject/session/edl.hpp \
$(liblumiproc_a_srcdir)/mobject/session/fixture.hpp \
$(liblumiproc_a_srcdir)/mobject/session/locatingpin.hpp \
$(liblumiproc_a_srcdir)/mobject/session/plug.hpp \
$(liblumiproc_a_srcdir)/mobject/session/sessionimpl.hpp \
$(liblumiproc_a_srcdir)/mobject/session/defsregistry.hpp \
$(liblumiproc_a_srcdir)/mobject/explicitplacement.hpp \
$(liblumiproc_a_srcdir)/mobject/mobject.hpp \
$(liblumiproc_a_srcdir)/mobject/placement.hpp \
$(liblumiproc_a_srcdir)/mobject/session.hpp \
$(liblumiproc_a_srcdir)/stateproxy.hpp \
$(liblumiproc_a_srcdir)/asset.hpp \
$(liblumiproc_a_srcdir)/assetmanager.hpp \
$(liblumiproc_a_srcdir)/lumiera.hpp \
$(liblumiproc_a_srcdir)/nobugcfg.hpp

View file

@ -0,0 +1,26 @@
TESTING "Filedescriptor management" ./test-filedescriptors
echo testdata > ,tmp_testfile
TEST "acquire existing file" acquire_existing <<END
return: 0
END
TEST "acquire existing file twice" acquire_existing_again <<END
return: 0
END
rm ,tmp_testfile
TEST "acquire file, creating it" acquire_create <<END
return: 0
END
rm ,tmp_testfile
TEST "acquire file, creating it, nested dir" acquire_create_dir <<END
return: 0
END
rm ,tmp_testdir -r

13
tests/20filehandle.tests Normal file
View file

@ -0,0 +1,13 @@
TESTING "Filehandle management" ./test-filehandles
TEST "basic filehandle usage" basic <<END
return: 0
END
rm -rf ,tmpdir
TEST "using many filehandles" more <<END
return: 0
END

View file

@ -62,7 +62,7 @@ out: caught error::Logic: LUMIERA_ERROR_FATAL:floundered (test-2).
out: caught error::Invalid: LUMIERA_ERROR_INVALID:invalid input or parameters (test-3).
out: caught lumiera::Error: LUMIERA_ERROR_EXTERNAL:failure in external service (test-4).
out: caught std::runtime_error: test-5
out: caught std::exception: St9exception
out: caught std::exception: std::exception
out: intermediate handler caught: LUMIERA_ERROR_EXTERNAL:failure in external service (test-7).....will rethrow as error::State
out: caught lumiera::Error: LUMIERA_ERROR_STATE:unforseen state -- caused by: LUMIERA_ERROR_EXTERNAL:failure in external service (test-7).
out: intermediate handler caught: LUMIERA_ERROR_EXTERNAL:failure in external service (test-8).....will rethrow as error::State

View file

@ -1,5 +1,5 @@
# Copyright (C) Lumiera.org
# 2007, Christian Thaeter <ct@pipapo.org>
# 2007-2008, Christian Thaeter <ct@pipapo.org>
# Hermann Vosseler <Ichthyostega@web.de>
#
# This program is free software; you can redistribute it and/or
@ -51,9 +51,14 @@ test_references_SOURCES = $(tests_srcdir)/library/test-references.c
test_references_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror -I$(top_srcdir)/src/
test_references_LDADD = liblumi.a -lnobugmt -lpthread -ldl -lm -lrt
#check_PROGRAMS += test-filehandles
#test_filehandles_SOURCES = $(tests_srcdir)/backend/test-filehandles.c
#test_filehandles_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror -I$(top_srcdir)/src/
#test_filehandles_LDADD = liblumibackend.a liblumi.a -lnobugmt -lpthread -ldl -lm
check_PROGRAMS += test-filedescriptors
test_filedescriptors_SOURCES = $(tests_srcdir)/backend/test-filedescriptors.c
test_filedescriptors_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror -I$(top_srcdir)/src/
test_filedescriptors_LDADD = liblumibackend.a liblumi.a -lnobugmt -lpthread -ldl -lm
check_PROGRAMS += test-filehandles
test_filehandles_SOURCES = $(tests_srcdir)/backend/test-filehandles.c
test_filehandles_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror -I$(top_srcdir)/src/
test_filehandles_LDADD = liblumibackend.a liblumi.a -lnobugmt -lpthread -ldl -lm
TESTS = $(tests_srcdir)/test.sh

View file

@ -0,0 +1,89 @@
/*
test-filedescriptors.c
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 "lib/safeclib.h"
#include "backend/backend.h"
#include "backend/filedescriptor.h"
#include "tests/test.h"
TESTS_BEGIN
TEST ("acquire_existing")
{
lumiera_backend_init ();
LumieraFiledescriptor descriptor = lumiera_filedescriptor_acquire (",tmp_testfile", LUMIERA_FILE_READONLY);
if (descriptor)
{
lumiera_filedescriptor_release (descriptor);
lumiera_backend_destroy ();
return 0;
}
else
return 1;
}
TEST ("acquire_existing_again")
{
lumiera_backend_init ();
LumieraFiledescriptor descriptor = lumiera_filedescriptor_acquire (",tmp_testfile", LUMIERA_FILE_READONLY);
if (descriptor)
{
LumieraFiledescriptor descriptor2 = lumiera_filedescriptor_acquire (",tmp_testfile", LUMIERA_FILE_READONLY);
lumiera_filedescriptor_release (descriptor2);
lumiera_filedescriptor_release (descriptor);
lumiera_backend_destroy ();
return 0;
}
else
return 1;
}
TEST ("acquire_create")
{
lumiera_backend_init ();
LumieraFiledescriptor descriptor = lumiera_filedescriptor_acquire (",tmp_testfile", LUMIERA_FILE_CREATE);
if (descriptor)
{
lumiera_filedescriptor_release (descriptor);
lumiera_backend_destroy ();
return 0;
}
else
return 1;
}
TEST ("acquire_create_dir")
{
lumiera_backend_init ();
LumieraFiledescriptor descriptor =
lumiera_filedescriptor_acquire (",tmp_testdir/nested/,tmp_testfile", LUMIERA_FILE_CREATE);
if (descriptor)
{
lumiera_filedescriptor_release (descriptor);
lumiera_backend_destroy ();
return 0;
}
else
return 1;
}
TESTS_END

View file

@ -0,0 +1,87 @@
/*
test-filehandles.c - test filehandle management
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 "lib/llist.h"
#include "lib/safeclib.h"
#include "backend/backend.h"
#include "backend/filehandlecache.h"
#include "tests/test.h"
TESTS_BEGIN
TEST ("basic")
{
lumiera_backend_init ();
LumieraFile file = lumiera_file_new (",tmp_testfile", LUMIERA_FILE_CREATE);
/* get the filehandle */
int fd = lumiera_file_handle_acquire (file);
/* we now 'own'it and can use it */
ENSURE (fd > -1);
printf ("got filehandle #%d\n", fd);
/* put it into aging, can't use anymore */
lumiera_file_handle_release (file);
lumiera_file_delete (file);
lumiera_backend_destroy ();
}
TEST ("more")
{
lumiera_backend_init ();
LumieraFile files[100];
int fds[100];
/*create 100 files*/
for (int i=0; i<100; ++i)
{
files[i]= lumiera_file_new (lumiera_tmpbuf_snprintf (256, ",tmpdir/testfile%d", i), LUMIERA_FILE_CREATE);
}
/* get the filehandles, this gross overallocates filehandles */
for (int i=0; i<100; ++i)
{
fds[i] = lumiera_file_handle_acquire (files[i]);
ENSURE (fds[i] > -1);
printf ("got filehandle #%d\n", fds[i]);
}
/* put them into aging, can't use anymore */
for (int i=0; i<100; ++i)
{
lumiera_file_handle_release (files[i]);
}
/* cleanup */
for (int i=0; i<100; ++i)
{
lumiera_file_delete (files[i]);
}
lumiera_backend_destroy ();
}
TESTS_END

61
tests/common/Makefile.am Normal file
View file

@ -0,0 +1,61 @@
# Copyright (C) Lumiera.org
# 2008, Christian Thaeter <ct@pipapo.org>
# Hermann Vosseler <Ichthyostega@web.de>
#
# 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.
testcommon_srcdir = $(top_srcdir)/tests/common
check_PROGRAMS += test-common
test_common_CPPFLAGS = $(AM_CPPFLAGS) -Wall -I$(top_srcdir)/src -I$(testcommon_srcdir)
test_common_LDADD = \
liblumiproc.a \
liblumiprocengine.a \
liblumiprocmobjectbuilder.a \
liblumiprocmobjectsession.a \
liblumiprocasset.a \
liblumiprocmobject.a \
liblumiprocmobjectcontroller.a \
liblumi.a \
liblumicommon.a \
liblumibackend.a \
-lnobugmt -lpthread -ldl -lboost_program_options-mt -lboost_regex-mt
test_common_SOURCES = \
$(testcommon_srcdir)/appconfigtest.cpp \
$(testcommon_srcdir)/customsharedptrtest.cpp \
$(testcommon_srcdir)/exceptionerrortest.cpp \
$(testcommon_srcdir)/factoryspecialtest.cpp \
$(testcommon_srcdir)/factorytest.cpp \
$(testcommon_srcdir)/helloworldtest.cpp \
$(testcommon_srcdir)/lifecycletest.cpp \
$(testcommon_srcdir)/mainsuite.cpp \
$(testcommon_srcdir)/query/queryutilstest.cpp \
$(testcommon_srcdir)/removefromsettest.cpp \
$(testcommon_srcdir)/sanitizedidentifiertest.cpp \
$(testcommon_srcdir)/singletonsubclasstest.cpp \
$(testcommon_srcdir)/singletontest.cpp \
$(testcommon_srcdir)/singletontestmocktest.cpp \
$(testcommon_srcdir)/test/cmdlinewrappertest.cpp \
$(testcommon_srcdir)/test/testoptiontest.cpp \
$(testcommon_srcdir)/typelisttest.cpp \
$(testcommon_srcdir)/typelistutiltest.cpp \
$(testcommon_srcdir)/visitingtoolconcept.cpp \
$(testcommon_srcdir)/visitingtoolextendedtest.cpp \
$(testcommon_srcdir)/visitingtooltest.cpp
noinst_HEADERS += \
$(testcommon_srcdir)/query/querydiagnostics.hpp \
$(testcommon_srcdir)/testtargetobj.hpp

View file

@ -0,0 +1,72 @@
# Copyright (C) Lumiera.org
# 2008, Christian Thaeter <ct@pipapo.org>
# Hermann Vosseler <Ichthyostega@web.de>
#
# 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.
testcomponents_srcdir = $(top_srcdir)/tests/components
check_PROGRAMS += test-components
test_components_CPPFLAGS = $(AM_CPPFLAGS) -Wall -I$(top_srcdir)/src -I$(testcomponents_srcdir)
test_components_LDADD = \
liblumiproc.a \
liblumiprocengine.a \
liblumiprocmobjectbuilder.a \
liblumiprocmobjectsession.a \
liblumiprocasset.a \
liblumiprocmobject.a \
liblumiprocmobjectcontroller.a \
liblumi.a \
liblumicommon.a \
liblumibackend.a \
-lnobugmt -lpthread -ldl -lboost_program_options-mt -lboost_regex-mt
test_components_SOURCES = \
$(testcomponents_srcdir)/backend/mediaaccessmock.cpp \
$(testcomponents_srcdir)/backend/mediaaccessmocktest.cpp \
$(testcomponents_srcdir)/proc/asset/assetcategorytest.cpp \
$(testcomponents_srcdir)/proc/asset/compoundmediatest.cpp \
$(testcomponents_srcdir)/proc/asset/deleteassettest.cpp \
$(testcomponents_srcdir)/proc/asset/identityofassetstest.cpp \
$(testcomponents_srcdir)/proc/asset/mediastructurequerytest.cpp \
$(testcomponents_srcdir)/proc/asset/basicpipetest.cpp \
$(testcomponents_srcdir)/proc/asset/createassettest.cpp \
$(testcomponents_srcdir)/proc/asset/dependantassetstest.cpp \
$(testcomponents_srcdir)/proc/asset/makecliptest.cpp \
$(testcomponents_srcdir)/proc/asset/orderingofassetstest.cpp \
$(testcomponents_srcdir)/proc/asset/testasset.cpp \
$(testcomponents_srcdir)/proc/engine/sourcenodetest.cpp \
$(testcomponents_srcdir)/proc/mobject/builder/buildertooltest.cpp \
$(testcomponents_srcdir)/proc/mobject/builder/buildsegmenttest.cpp \
$(testcomponents_srcdir)/proc/mobject/controller/rendersegmenttest.cpp \
$(testcomponents_srcdir)/proc/mobject/placementbasictest.cpp \
$(testcomponents_srcdir)/proc/mobject/session/addcliptest.cpp \
$(testcomponents_srcdir)/proc/mobject/session/deletecliptest.cpp \
$(testcomponents_srcdir)/proc/mobject/session/rebuildfixturetest.cpp \
$(testcomponents_srcdir)/proc/mobject/session/sessionmanagertest.cpp \
$(testcomponents_srcdir)/proc/mobject/session/testclip.cpp \
$(testcomponents_srcdir)/proc/mobject/session/defsmanagerimpltest.cpp \
$(testcomponents_srcdir)/proc/mobject/session/defsmanagertest.cpp \
$(testcomponents_srcdir)/proc/mobject/session/defsregistryimpltest.cpp \
$(testcomponents_srcdir)/proc/mobject/session/sessionstructuretest.cpp \
$(testcomponents_srcdir)/mainsuite.cpp
noinst_HEADERS += \
$(testcomponents_srcdir)/backend/mediaaccessmock.hpp \
$(testcomponents_srcdir)/proc/asset/testclipasset.hpp \
$(testcomponents_srcdir)/proc/asset/assetdiagnostics.hpp \
$(testcomponents_srcdir)/proc/asset/testasset.hpp \
$(testcomponents_srcdir)/proc/mobject/session/testclip.hpp \
$(testcomponents_srcdir)/proc/mobject/session/testsession1.hpp

View file

@ -3344,6 +3344,15 @@ Someone might pickup a Doxygen-Maintainer. This is not writing actual documentat
<div title="video player mockup" modifier="Ichthyostega" modified="200804120416" created="200804090216" changecount="4">
<pre>Use the backend, gmerlin/avdecoder and a Player widget to playback videos. This should be a small application which can open and playback many videos from one instance in parallel. Later on scrubbing for this videos might be supported.
The idea here is to show and measure backend and scheduler performance
and beeing a proof of concept for the design. It will run
independent of the Proc layer but needs quite some work on the
backend to be done.
</pre>
</div>
<div title="video player mockup" modifier="CehTeh" modified="200804090218" created="200804090216" changecount="3">
<pre>Use the backend, gmerlin/avdecoder and a Player widget to playback videos. This should be a small application which can open and playback many videos from on instance in parallel. Later on scrubbing for this videos might be supported.
The idea here is to show and measure backend and scheduler performance and beeing a proof of concept for the design. It will run independent of the Proc layer but needs quite some work on the backend to be done.</pre>
</div>
</div>