proc.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * proc.h
  4.  *
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: proc.h,v 1.24.2.1 1999/07/30 17:07:17 scrappy Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef _PROC_H_
  14. #define _PROC_H_
  15. #include "storage/lock.h"
  16. typedef struct
  17. {
  18. int sleeplock;
  19. int semNum;
  20. IpcSemaphoreId semId;
  21. IpcSemaphoreKey semKey;
  22. } SEMA;
  23. /*
  24.  * Each backend has:
  25.  */
  26. typedef struct proc
  27. {
  28. /* proc->links MUST BE THE FIRST ELEMENT OF STRUCT (see ProcWakeup()) */
  29. SHM_QUEUE links; /* proc can be waiting for one event(lock) */
  30. SEMA sem; /* ONE semaphore to sleep on */
  31. int errType; /* error code tells why we woke up */
  32. int critSects; /* If critSects > 0, we are in sensitive
  33.  * routines that cannot be recovered when
  34.  * the process fails. */
  35. int prio; /* priority for sleep queue */
  36. TransactionId xid; /* transaction currently being executed by
  37.  * this proc */
  38. TransactionId xmin; /* minimal running XID as it was when we
  39.  * were starting our xact: vacuum must not
  40.  * remove tuples deleted by xid >= xmin ! */
  41. LOCK    *waitLock; /* Lock we're sleeping on ... */
  42. int token; /* type of lock we sleeping for */
  43. int holdLock; /* while holding these locks */
  44. int pid; /* This procs process id */
  45. short sLocks[MAX_SPINS]; /* Spin lock stats */
  46. SHM_QUEUE lockQueue; /* locks associated with current
  47.  * transaction */
  48. } PROC;
  49. /*
  50.  * PROC_NSEMS_PER_SET is the number of semaphores in each sys-V semaphore set
  51.  * we allocate.  It must be *less than* 32 (or however many bits in an int
  52.  * on your machine), or our free-semaphores bitmap won't work.  You also must
  53.  * not set it higher than your kernel's SEMMSL (max semaphores per set)
  54.  * parameter, which is often around 25.
  55.  * MAX_PROC_SEMS is the maximum number of per-process semaphores (those used
  56.  * by the lock mgr) we can keep track of.  It must be a multiple of
  57.  * PROC_NSEMS_PER_SET.
  58.  */
  59. #define  PROC_NSEMS_PER_SET 16
  60. #define  MAX_PROC_SEMS (((MAXBACKENDS-1)/PROC_NSEMS_PER_SET+1)*PROC_NSEMS_PER_SET)
  61. typedef struct procglobal
  62. {
  63. SHMEM_OFFSET freeProcs;
  64. IPCKey currKey;
  65. int32 freeSemMap[MAX_PROC_SEMS / PROC_NSEMS_PER_SET];
  66. /*
  67.  * In each freeSemMap entry, the PROC_NSEMS_PER_SET lsbs flag whether
  68.  * individual semaphores are in use, and the next higher bit is set to
  69.  * show that the entire set is allocated.
  70.  */
  71. } PROC_HDR;
  72. extern PROC *MyProc;
  73. #define PROC_INCR_SLOCK(lock) 
  74. do { 
  75. if (MyProc) (MyProc->sLocks[(lock)])++; 
  76. } while (0)
  77. #define PROC_DECR_SLOCK(lock) 
  78. do { 
  79. if (MyProc) (MyProc->sLocks[(lock)])--; 
  80. } while (0)
  81. /*
  82.  * flags explaining why process woke up
  83.  */
  84. #define NO_ERROR 0
  85. #define ERR_TIMEOUT 1
  86. #define ERR_BUFFER_IO 2
  87. #define MAX_PRIO 50
  88. #define MIN_PRIO (-1)
  89. extern SPINLOCK ProcStructLock;
  90. /*
  91.  * Function Prototypes
  92.  */
  93. extern void InitProcess(IPCKey key);
  94. extern void ProcReleaseLocks(void);
  95. extern bool ProcRemove(int pid);
  96. /* extern bool ProcKill(int exitStatus, int pid); */
  97. /* make static in storage/lmgr/proc.c -- jolly */
  98. extern void ProcQueueInit(PROC_QUEUE *queue);
  99. extern int ProcSleep(PROC_QUEUE *queue, LOCKMETHODCTL *lockctl, int token,
  100.   LOCK *lock);
  101. extern PROC *ProcWakeup(PROC *proc, int errType);
  102. extern int ProcLockWakeup(PROC_QUEUE *queue, LOCKMETHOD lockmethod,
  103.    LOCK *lock);
  104. extern void ProcAddLock(SHM_QUEUE *elem);
  105. extern void ProcReleaseSpins(PROC *proc);
  106. #endif  /* PROC_H */