Merge from vendor branch OPENSSL:
[dragonfly.git] / contrib / perl5 / XSlock.h
1 #ifndef __XSlock_h__
2 #define __XSlock_h__
3
4 class XSLockManager
5 {
6 public:
7         XSLockManager() { InitializeCriticalSection(&cs); };
8         ~XSLockManager() { DeleteCriticalSection(&cs); };
9         void Enter(void) { EnterCriticalSection(&cs); };
10         void Leave(void) { LeaveCriticalSection(&cs); };
11 protected:
12         CRITICAL_SECTION cs;
13 };
14
15 XSLockManager g_XSLock;
16 CPerlObj* pPerl;
17
18 class XSLock
19 {
20 public:
21         XSLock(CPerlObj *p) {
22             g_XSLock.Enter();
23             ::pPerl = p;
24         };
25         ~XSLock() { g_XSLock.Leave(); };
26 };
27
28 /* PERL_CAPI does its own locking in xs_handler() */
29 #if defined(PERL_OBJECT) && !defined(PERL_CAPI)
30 #undef dXSARGS
31 #define dXSARGS \
32         XSLock localLock(pPerl);                        \
33         dSP; dMARK;                                     \
34         I32 ax = mark - PL_stack_base + 1;              \
35         I32 items = sp - mark
36 #endif  /* PERL_OBJECT && !PERL_CAPI */
37
38 #endif