add front demo in this project

This commit is contained in:
lnk
2025-06-20 16:20:59 +08:00
parent 768eebbc2b
commit e14e3f9678
208 changed files with 54655 additions and 114 deletions

View File

@@ -0,0 +1,35 @@
// -*- C++ -*-
// Copyright (C) 2013-2017, Vaclav Zeman. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modifica-
// tion, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
// DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//! @file
//! This file contains implementations of synchronization
//! primitives using the C++11 API. It does not contain any include
//! guards because it is only a fragment to be included by
//! syncprims.h.
namespace log4cplus { namespace thread { namespace impl {
#include "log4cplus/thread/impl/syncprims-pmsm.h"
} } } // namespace log4cplus { namespace thread { namespace impl {

View File

@@ -0,0 +1,90 @@
// -*- C++ -*-
// Copyright (C) 2009-2017, Vaclav Haisman. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modifica-
// tion, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
// DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef LOG4CPLUS_THREAD_SYNCPRIMS_IMPL_H
#define LOG4CPLUS_THREAD_SYNCPRIMS_IMPL_H
#include <log4cplus/config.hxx>
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
#pragma once
#endif
#if ! defined (INSIDE_LOG4CPLUS)
# error "This header must not be be used outside log4cplus' implementation files."
#endif
#include <stdexcept>
#include <log4cplus/thread/syncprims.h>
#include <mutex>
#include <thread>
#include <condition_variable>
namespace log4cplus { namespace thread { namespace impl {
LOG4CPLUS_EXPORT void LOG4CPLUS_ATTRIBUTE_NORETURN
syncprims_throw_exception (char const * const msg,
char const * const file, int line);
class SharedMutex
: public SharedMutexImplBase
{
public:
SharedMutex ();
~SharedMutex ();
void rdlock () const;
void wrlock () const;
void rdunlock () const;
void wrunlock () const;
private:
Mutex m1;
Mutex m2;
Mutex m3;
Semaphore w;
mutable unsigned writer_count;
Semaphore r;
mutable unsigned reader_count;
SharedMutex (SharedMutex const &);
SharedMutex & operator = (SharedMutex const &);
};
} } } // namespace log4cplus { namespace thread { namespace impl {
// Include the appropriate implementations of the classes declared
// above.
#include <log4cplus/thread/impl/syncprims-cxx11.h>
#undef LOG4CPLUS_THROW_RTE
#endif // LOG4CPLUS_THREAD_SYNCPRIMS_IMPL_H

View File

@@ -0,0 +1,119 @@
// -*- C++ -*-
// Copyright (C) 2010-2017, Vaclav Haisman. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modifica-
// tion, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
// DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//! @file
//! This file contains implementations of reader-writer locking
//! primitive using other primitives, IOW poor man's rwlock.
//! It does not contain any include guards because it is only a fragment
//! to be included by syncprims-{pthreads,win32}.h.
#if ! defined (INSIDE_LOG4CPLUS)
# error "This header must not be be used outside log4cplus' implementation files."
#endif
// This implements algorithm described in "Concurrent Control with "Readers"
// and "Writers"; P.J. Courtois, F. Heymans, and D.L. Parnas;
// MBLE Research Laboratory; Brussels, Belgium"
inline
SharedMutex::SharedMutex ()
: m1 ()
, m2 ()
, m3 ()
, w (1, 1)
, writer_count (0)
, r (1, 1)
, reader_count (0)
{ }
inline
SharedMutex::~SharedMutex ()
{ }
inline
void
SharedMutex::rdlock () const
{
MutexGuard m3_guard (m3);
SemaphoreGuard r_guard (r);
MutexGuard m1_guard (m1);
if (reader_count + 1 == 1)
w.lock ();
reader_count += 1;
}
inline
void
SharedMutex::rdunlock () const
{
MutexGuard m1_guard (m1);
if (reader_count - 1 == 0)
w.unlock ();
reader_count -= 1;
}
inline
void
SharedMutex::wrlock () const
{
{
MutexGuard m2_guard (m2);
if (writer_count + 1 == 1)
r.lock ();
writer_count += 1;
}
try
{
w.lock ();
}
catch (...)
{
MutexGuard m2_guard (m2);
writer_count -= 1;
throw;
}
}
inline
void
SharedMutex::wrunlock () const
{
w.unlock ();
MutexGuard m2_guard (m2);
if (writer_count - 1 == 0)
r.unlock ();
writer_count -= 1;
}

View File

@@ -0,0 +1,96 @@
// -*- C++ -*-
// Module: Log4CPLUS
// File: threads.h
// Created: 6/2001
// Author: Tad E. Smith
//
//
// Copyright 2001-2017 Tad E. Smith
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/** @file */
#ifndef LOG4CPLUS_IMPL_THREADS_IMPL_HEADER_
#define LOG4CPLUS_IMPL_THREADS_IMPL_HEADER_
#include <log4cplus/config.hxx>
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
#pragma once
#endif
#if defined (_WIN32)
#include <log4cplus/config/windowsh-inc.h>
#endif
#include <log4cplus/tstring.h>
#include <log4cplus/helpers/pointer.h>
#include <log4cplus/thread/threads.h>
#if ! defined (INSIDE_LOG4CPLUS)
# error "This header must not be be used outside log4cplus' implementation files."
#endif
namespace log4cplus { namespace thread { namespace impl {
#if defined (LOG4CPLUS_USE_PTHREADS)
typedef pthread_t os_handle_type;
typedef pthread_t os_id_type;
inline
pthread_t
getCurrentThreadId ()
{
return pthread_self ();
}
#elif defined (LOG4CPLUS_USE_WIN32_THREADS)
typedef HANDLE os_handle_type;
typedef DWORD os_id_type;
inline
DWORD
getCurrentThreadId ()
{
return GetCurrentThreadId ();
}
#elif defined (LOG4CPLUS_SINGLE_THREADED)
typedef void * os_handle_type;
typedef int os_id_type;
inline
int
getCurrentThreadId ()
{
return 1;
}
#endif
} } } // namespace log4cplus { namespace thread { namespace impl {
#endif // LOG4CPLUS_IMPL_THREADS_IMPL_HEADER_

View File

@@ -0,0 +1,193 @@
// -*- C++ -*-
// Copyright (C) 2010-2017, Vaclav Haisman. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modifica-
// tion, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
// DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef LOG4CPLUS_THREAD_IMPL_TLS_H
#define LOG4CPLUS_THREAD_IMPL_TLS_H
#include <log4cplus/config.hxx>
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
#pragma once
#endif
#include <new>
#include <cassert>
#include <system_error>
#if ! defined (INSIDE_LOG4CPLUS)
# error "This header must not be be used outside log4cplus' implementation files."
#endif
#ifdef LOG4CPLUS_USE_PTHREADS
# include <pthread.h>
#elif defined (LOG4CPLUS_USE_WIN32_THREADS)
# include <log4cplus/config/windowsh-inc.h>
#elif defined (LOG4CPLUS_SINGLE_THREADED)
# include <vector>
#endif
namespace log4cplus { namespace thread { namespace impl {
typedef void * tls_value_type;
#ifdef LOG4CPLUS_USE_PTHREADS
typedef pthread_key_t * tls_key_type;
typedef void (* tls_init_cleanup_func_type)(void *);
#elif defined (LOG4CPLUS_USE_WIN32_THREADS)
typedef DWORD tls_key_type;
typedef PFLS_CALLBACK_FUNCTION tls_init_cleanup_func_type;
#elif defined (LOG4CPLUS_SINGLE_THREADED)
typedef std::size_t tls_key_type;
typedef void (* tls_init_cleanup_func_type)(void *);
#endif
inline tls_key_type tls_init (tls_init_cleanup_func_type);
inline tls_value_type tls_get_value (tls_key_type);
inline void tls_set_value (tls_key_type, tls_value_type);
inline void tls_cleanup (tls_key_type);
#if defined (LOG4CPLUS_USE_PTHREADS)
tls_key_type
tls_init (tls_init_cleanup_func_type cleanupfunc)
{
pthread_key_t * key = new pthread_key_t;
int ret = pthread_key_create (key, cleanupfunc);
if (LOG4CPLUS_UNLIKELY (ret != 0))
throw std::system_error(ret, std::system_category (),
"pthread_key_create() failed");
return key;
}
tls_value_type
tls_get_value (tls_key_type key)
{
return pthread_getspecific (*key);
}
void
tls_set_value (tls_key_type key, tls_value_type value)
{
pthread_setspecific(*key, value);
}
void
tls_cleanup (tls_key_type key)
{
pthread_key_delete (*key);
delete key;
}
#elif defined (LOG4CPLUS_USE_WIN32_THREADS)
tls_key_type
tls_init (tls_init_cleanup_func_type cleanupfunc)
{
DWORD const slot = FlsAlloc (cleanupfunc);
if (LOG4CPLUS_UNLIKELY (slot == FLS_OUT_OF_INDEXES))
{
DWORD const eno = GetLastError ();
throw std::system_error (static_cast<int>(eno),
std::system_category (), "FlsAlloc() failed");
}
return slot;
}
tls_value_type tls_get_value (tls_key_type k)
{
return FlsGetValue (k);
}
void
tls_set_value (tls_key_type k, tls_value_type value)
{
FlsSetValue (k, value);
}
void
tls_cleanup (tls_key_type k)
{
FlsFree (k);
}
#elif defined (LOG4CPLUS_SINGLE_THREADED)
extern std::vector<tls_value_type> * tls_single_threaded_values;
tls_key_type
tls_init (tls_init_cleanup_func_type)
{
if (! tls_single_threaded_values)
tls_single_threaded_values = new std::vector<tls_value_type>;
tls_key_type key = tls_single_threaded_values->size ();
tls_single_threaded_values->resize (key + 1);
return key;
}
tls_value_type
tls_get_value (tls_key_type k)
{
assert (k < tls_single_threaded_values->size ());
return (*tls_single_threaded_values)[k];
}
void
tls_set_value (tls_key_type k, tls_value_type val)
{
assert (k < tls_single_threaded_values->size ());
(*tls_single_threaded_values)[k] = val;
}
void
tls_cleanup (tls_key_type k)
{
assert (k < tls_single_threaded_values->size ());
(*tls_single_threaded_values)[k] = 0;
}
#endif
} } } // namespace log4cplus { namespace thread { namespace impl {
#endif // LOG4CPLUS_THREAD_IMPL_TLS_H