lumiera_/src/backend/backend.c
Ichthyostega 4a53ef4cd0 Clean-up: change some long standing TODOs into tickets
makes the test logs way more readable

Believe me: no one will ever notice a "TODO"
entry in the logs, when it showed up for
more than some months.

Thus I've created some new tickets, mostly
tagged as "QA" and placed the ticket number
at the corresponding locations in the source
2011-09-25 19:16:33 +02:00

197 lines
5.6 KiB
C

/*
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 "include/logging.h"
#include "lib/safeclib.h"
#include "lib/tmpbuf.h"
#include "lib/mpool.h"
#include "backend/backend.h"
#include "common/config.h"
#include "backend/filehandlecache.h"
#include "backend/filedescriptor.h"
#include "backend/filedescriptorregistry.h"
#include "backend/mmapcache.h"
#include "backend/threadpool.h"
#include "backend/resourcecollector.h"
#include <unistd.h>
#include <sys/resource.h>
//NOBUG_DEFINE_FLAG_PARENT (backend, lumiera); TODO
//NOBUG_DEFINE_FLAG (backend);
//NOBUG_DEFINE_FLAG_PARENT (file_all, backend);
//NOBUG_DEFINE_FLAG_PARENT (filehandle, file_all);
//NOBUG_DEFINE_FLAG_PARENT (mmapings, mmap_all);
//NOBUG_DECLARE_FLAG (file);
//NOBUG_DECLARE_FLAG (mmap_all);
//NOBUG_DECLARE_FLAG (mmap);
//NOBUG_DECLARE_FLAG (mmapings);
//NOBUG_DECLARE_FLAG (mmapcache);
static enum lumiera_resource_try
lumiera_backend_mpool_purge (enum lumiera_resource_try itr, void* data, void* context);
static void
lumiera_backend_resourcecollector_register_mpool (MPool self);
static void
lumiera_backend_resourcecollector_unregister_mpool (MPool self);
size_t lumiera_backend_pagesize;
int
lumiera_backend_init (void)
{
//NOBUG_INIT_FLAG (backend);
//NOBUG_INIT_FLAG (file_all);
//NOBUG_INIT_FLAG (file);
//NOBUG_INIT_FLAG (filehandle);
//NOBUG_INIT_FLAG (mmap_all);
//NOBUG_INIT_FLAG (mmap);
//NOBUG_INIT_FLAG (mmapings);
//NOBUG_INIT_FLAG (mmapcache);
TRACE (backend_dbg);
lumiera_mutex_init (&lumiera_filecreate_mutex, "fileaccess", &NOBUG_FLAG (mutex_dbg), NOBUG_CONTEXT);
lumiera_resourcecollector_init ();
/* hook the resourcecollector into the mpool*/
mpool_malloc_hook = lumiera_malloc;
mpool_free_hook = lumiera_free;
mpool_init_hook = lumiera_backend_resourcecollector_register_mpool;
mpool_destroy_hook = lumiera_backend_resourcecollector_unregister_mpool;
/* hook the resourcecollector into the safeclib allocation functions */
lumiera_safeclib_set_resourcecollector (lumiera_resourcecollector_run);
PLANNED("The resourcecollector aborts by default when there is no final strategy for recovery, TODO: initiate sane shutdown");
lumiera_threadpool_init ();
PLANNED ("hook threadpool into the resourcecollector (maybe in threadpool_init() instead here");
lumiera_filedescriptorregistry_init ();
lumiera_backend_pagesize = sysconf(_SC_PAGESIZE);
/////////////////////////////////////////////////////////////////////TICKET #838 add config options to override following defaults"
const char* filehandles = lumiera_tmpbuf_snprintf (SIZE_MAX,
"backend.file.max_handles = %d",
/* roughly 2/3 of all availables filehandles are managed by the backend */
(sysconf (_SC_OPEN_MAX)-10)*2/3);
lumiera_config_setdefault (filehandles);
long long max_entries;
lumiera_config_number_get ("backend.file.max_handles", &max_entries);
lumiera_filehandlecache_new (max_entries);
#if SIZE_MAX <= 4294967295UL
lumiera_config_setdefault ("backend.mmap.as_limit = 3221225469");
#else
lumiera_config_setdefault ("backend.mmap.as_limit = 211106232532992");
#endif
struct rlimit as_rlimit;
getrlimit (RLIMIT_AS, &as_rlimit);
long long as_limit = (long long)as_rlimit.rlim_cur;
if (as_rlimit.rlim_cur == RLIM_INFINITY)
{
lumiera_config_number_get ("backend.mmap.as_limit", &as_limit);
}
else
{
INFO (backend, "address space limited to %luMiB", as_rlimit.rlim_cur/1024/1024);
}
lumiera_mmapcache_new (as_limit);
return 0;
}
void
lumiera_backend_destroy (void)
{
TRACE (backend_dbg);
lumiera_mmapcache_delete ();
lumiera_filehandlecache_delete ();
lumiera_filedescriptorregistry_destroy ();
lumiera_threadpool_destroy ();
lumiera_safeclib_set_resourcecollector (NULL);
mpool_init_hook = NULL;
mpool_destroy_hook = NULL;
mpool_malloc_hook = malloc;
mpool_free_hook = free;
lumiera_resourcecollector_destroy ();
lumiera_mutex_destroy (&lumiera_filecreate_mutex, &NOBUG_FLAG (mutex_dbg), NOBUG_CONTEXT);
}
static enum lumiera_resource_try
lumiera_backend_mpool_purge (enum lumiera_resource_try itr, void* data, void* context)
{
(void) context;
(void) data;
(void) itr;
///////////////////////////////////////////////////////////TICKET #837 actually implement mpool purging
return LUMIERA_RESOURCE_NONE;
}
static void
lumiera_backend_resourcecollector_register_mpool (MPool self)
{
self->udata =
lumiera_resourcecollector_register_handler (LUMIERA_RESOURCE_MEMORY, lumiera_backend_mpool_purge, self);
}
static void
lumiera_backend_resourcecollector_unregister_mpool (MPool self)
{
lumiera_resourcehandler_unregister ((LumieraResourcehandler) self->udata);
}
/*
// Local Variables:
// mode: C
// c-file-style: "gnu"
// indent-tabs-mode: nil
// End:
*/