/****************************************************************************
* *
* * This file is part of GAP , a system for computational discrete algebra .
* *
* * Copyright of GAP belongs to its developers , whose names are too numerous
* * to list here . Please refer to the COPYRIGHT file for details .
* *
* * SPDX - License - Identifier : GPL - 2 . 0 - or - later
*/
#ifndef GAP_THREAD_H
#define GAP_THREAD_H
#include "../common.h"
#if !defined (HPCGAP)
/*
* HPC - GAP stubs .
*/
#define HashLock(obj) do { } while (0 )
#define HashLockShared(obj) do { } while (0 )
#define HashUnlock(obj) do { } while (0 )
#define HashUnlockShared(obj) do { } while (0 )
#else
#include "tlsconfig.h"
#include "region.h"
// Maximum number of threads excluding the main thread
#define MAX_THREADS 1023
extern int PreThreadCreation;
#ifndef USE_NATIVE_TLS
void *AllocateTLS(void );
void FreeTLS(void *address);
#endif
void AddGCRoots(void );
void RemoveGCroots(void );
void RunThreadedMain(
int (*mainFunction)(int , const char **),
int argc,
const char **argv );
void CreateMainRegion(void );
Obj RunThread(void (*start)(void *), void *arg);
int JoinThread(int id);
void RegionWriteLock(Region *region);
int RegionTryWriteLock(Region *region);
void RegionWriteUnlock(Region *region);
void RegionReadLock(Region *region);
int RegionTryReadLock(Region *region);
void RegionReadUnlock(Region *region);
void RegionUnlock(Region *region);
Region *CurrentRegion(void );
Region *GetRegionOf(Obj obj);
extern Region *LimboRegion, *ReadOnlyRegion;
extern Obj PublicRegionName;
void SetRegionName(Region *region, Obj name);
Obj GetRegionName(Region *region);
Obj GetRegionLockCounters(Region *region);
void ResetRegionLockCounters(Region *region);
void LockThreadControl(int modify);
void UnlockThreadControl(void );
void GCThreadHandler(void );
void InitMainThread(void );
typedef enum LockQual {
LOCK_QUAL_NONE = 0 ,
LOCK_QUAL_READONLY = 1 ,
LOCK_QUAL_READWRITE = 2 ,
} LockQual;
typedef enum LockStatus {
LOCK_STATUS_UNLOCKED = 0 ,
LOCK_STATUS_READWRITE_LOCKED = 1 ,
LOCK_STATUS_READONLY_LOCKED = 2 ,
} LockStatus;
LockStatus IsLocked(Region *region);
void GetLockStatus(int count, Obj *objects, LockStatus *status);
typedef enum LockMode {
LOCK_MODE_READONLY = 0 ,
LOCK_MODE_READWRITE = 1 ,
LOCK_MODE_DEFAULT = LOCK_MODE_READWRITE,
} LockMode;
int LockObject(Obj obj, LockMode mode);
int LockObjects(int count, Obj * objects, const LockMode * mode);
int TryLockObjects(int count, Obj * objects, const LockMode * mode);
void PushRegionLock(Region *region);
void PopRegionLocks(int newSP);
int RegionLockSP(void );
void HashLock(void *obj);
void HashLockShared(void *obj);
void HashUnlock(void *obj);
void HashUnlockShared(void *obj);
// Thread state constants and functions
#define TSTATE_SHIFT 3
#define TSTATE_MASK ((1 << TSTATE_SHIFT) - 1 )
#define TSTATE_RUNNING 0
#define TSTATE_TERMINATED 1
#define TSTATE_BLOCKED 2
#define TSTATE_SYSCALL 3
#define TSTATE_INTERRUPT 4
#define TSTATE_PAUSED 4
#define TSTATE_INTERRUPTED 5
#define TSTATE_KILLED 6
int GetThreadState(int threadID);
int UpdateThreadState(int threadID, int oldState, int newState);
void KillThread(int threadID);
void PauseThread(int threadID);
void InterruptThread(int threadID, int handler);
void ResumeThread(int threadID);
void HandleInterrupts(int locked, Stat stat);
int PauseAllThreads(void );
void ResumeAllThreads(void );
void SetInterruptHandler(int handler, Obj func);
#define MAX_INTERRUPT 100
#endif // HPCGAP
#endif // GAP_THREAD_H
Messung V0.5 in Prozent C=96 H=85 G=90
¤ Dauer der Verarbeitung: 0.8 Sekunden
(vorverarbeitet am 2026-10-12)
¤
*© Formatika GbR, Deutschland