Skip to content

Commit

Permalink
Sync the loggers with DDNet
Browse files Browse the repository at this point in the history
  • Loading branch information
Kaffeine committed Dec 31, 2023
1 parent 2116f02 commit e5949ec
Show file tree
Hide file tree
Showing 18 changed files with 571 additions and 166 deletions.
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,7 @@ set(BASE
src/base/hash_ctxt.h
src/base/hash_libtomcrypt.cpp
src/base/hash_openssl.cpp
src/base/lock.h
src/base/lock_scope.h
src/base/log.cpp
src/base/log.h
Expand Down Expand Up @@ -652,6 +653,8 @@ set_glob(ENGINE_INTERFACE GLOB src/engine
warning.h
)
set_glob(ENGINE_SHARED GLOB src/engine/shared
assertion_logger.cpp
assertion_logger.h
compression.cpp
compression.h
config.cpp
Expand Down
9 changes: 9 additions & 0 deletions autoexec.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ sv_port 8303
# Server name
sv_name "My InfClass server"

# Password for joining the server, empty for no password
password ""

# rcon (F2) passwords for admin. If you don't set one, a random one will be
# created and shown in the terminal window of the server.
sv_rcon_password ""
Expand All @@ -30,12 +33,18 @@ sv_server_info_per_second 100
# File where server log will be stored
logfile infclassr.log

# Log level (-3 = None, -2 = Error, -1 = Warn, 0 = Info, 1 = Debug, 2 = Trace)
loglevel 0

# Max players on server
sv_max_clients 64

# Max players with the same IP address
sv_max_clients_per_ip 4

# Tournament mode - when enabled players joins the server as spectator
sv_tournament_mode 0


# SERVER CUSTOMIZATION
# --------------------
Expand Down
135 changes: 135 additions & 0 deletions src/base/lock.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
#ifndef BASE_LOCK_H
#define BASE_LOCK_H

#include <mutex>

// Enable thread safety attributes only with clang.
// The attributes can be safely erased when compiling with other compilers.
#if defined(__clang__) && (!defined(SWIG))
#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
#else
#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op
#endif

#define CAPABILITY(x) \
THREAD_ANNOTATION_ATTRIBUTE__(capability(x))

#define SCOPED_CAPABILITY \
THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)

#define GUARDED_BY(x) \
THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))

#define PT_GUARDED_BY(x) \
THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))

#define ACQUIRED_BEFORE(...) \
THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__))

#define ACQUIRED_AFTER(...) \
THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__))

#define REQUIRES(...) \
THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(__VA_ARGS__))

#define REQUIRES_SHARED(...) \
THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(__VA_ARGS__))

#define ACQUIRE(...) \
THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(__VA_ARGS__))

#define ACQUIRE_SHARED(...) \
THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(__VA_ARGS__))

#define RELEASE(...) \
THREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__))

#define RELEASE_SHARED(...) \
THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(__VA_ARGS__))

#define RELEASE_GENERIC(...) \
THREAD_ANNOTATION_ATTRIBUTE__(release_generic_capability(__VA_ARGS__))

#define TRY_ACQUIRE(...) \
THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__))

#define TRY_ACQUIRE_SHARED(...) \
THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(__VA_ARGS__))

#define EXCLUDES(...) \
THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__))

#define ASSERT_CAPABILITY(x) \
THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x))

#define ASSERT_SHARED_CAPABILITY(x) \
THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x))

#define RETURN_CAPABILITY(x) \
THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))

#define NO_THREAD_SAFETY_ANALYSIS \
THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis)

/**
* @defgroup Locks
* @see Threads
*/

/**
* Wrapper for `std::mutex`.
*
* @ingroup Locks
*
* @remark This wrapper is only necessary because the clang thread-safety attributes
* are not available for `std::mutex` except when explicitly using libc++.
*/
class CAPABILITY("mutex") CLock
{
public:
CLock() = default;

void lock() ACQUIRE()
{
m_Mutex.lock();
}

void unlock() RELEASE()
{
m_Mutex.unlock();
}

// To support negative capabilities, otherwise EXCLUDES(m_Lock) must be used instead of REQUIRES(!m_Lock)
const CLock &operator!() const { return *this; }

private:
std::mutex m_Mutex;
};

/**
* RAII-style wrapper for owning a `CLock`.
*
* @ingroup Locks
*
* @remark This wrapper is only necessary because the clang thread-safety attributes
* are not available for `std::lock_guard` except when explicitly using libc++.
*/
class SCOPED_CAPABILITY CLockScope
{
public:
explicit CLockScope(CLock &Lock) ACQUIRE(Lock, m_Lock) :
m_Lock(Lock)
{
m_Lock.lock();
}

~CLockScope() RELEASE() REQUIRES(m_Lock)
{
m_Lock.unlock();
}

private:
CLock &m_Lock;
};

#endif
Loading

0 comments on commit e5949ec

Please sign in to comment.