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

数据库系统

开发平台:

Unix_Linux

  1. /*
  2.  * user_locks.c --
  3.  *
  4.  * This loadable module, together with my user-lock.patch applied to the
  5.  * backend, provides support for user-level long-term cooperative locks.
  6.  *
  7.  * Copyright (c) 1998, Massimo Dal Zotto <dz@cs.unitn.it>
  8.  *
  9.  * This file is distributed under the GNU General Public License
  10.  * either version 2, or (at your option) any later version.
  11.  */
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <unistd.h>
  15. #include "postgres.h"
  16. #include "miscadmin.h"
  17. #include "storage/lmgr.h"
  18. #include "storage/proc.h"
  19. #include "utils/elog.h"
  20. #include "user_locks.h"
  21. int
  22. user_lock(uint32 id1, uint32 id2, LOCKMODE lockmode)
  23. {
  24. LOCKTAG tag;
  25. memset(&tag, 0, sizeof(LOCKTAG));
  26. tag.dbId = MyDatabaseId;
  27. tag.relId = 0;
  28. tag.objId.blkno = (BlockNumber) id2;
  29. tag.offnum = (OffsetNumber) (id1 & 0xffff);
  30. return LockAcquire(USER_LOCKMETHOD, &tag, lockmode);
  31. }
  32. int
  33. user_unlock(uint32 id1, uint32 id2, LOCKMODE lockmode)
  34. {
  35. LOCKTAG tag;
  36. memset(&tag, 0, sizeof(LOCKTAG));
  37. tag.dbId = MyDatabaseId;
  38. tag.relId = 0;
  39. tag.objId.blkno = (BlockNumber) id2;
  40. tag.offnum = (OffsetNumber) (id1 & 0xffff);
  41. return LockRelease(USER_LOCKMETHOD, &tag, lockmode);
  42. }
  43. int
  44. user_write_lock(uint32 id1, uint32 id2)
  45. {
  46. return user_lock(id1, id2, ExclusiveLock);
  47. }
  48. int
  49. user_write_unlock(uint32 id1, uint32 id2)
  50. {
  51. return user_unlock(id1, id2, ExclusiveLock);
  52. }
  53. int
  54. user_write_lock_oid(Oid oid)
  55. {
  56. return user_lock(0, oid, ExclusiveLock);
  57. }
  58. int
  59. user_write_unlock_oid(Oid oid)
  60. {
  61. return user_unlock(0, oid, ExclusiveLock);
  62. }
  63. int
  64. user_unlock_all()
  65. {
  66. PROC    *proc;
  67. SHMEM_OFFSET location;
  68. ShmemPIDLookup(MyProcPid, &location);
  69. if (location == INVALID_OFFSET)
  70. {
  71. elog(NOTICE, "UserUnlockAll: unable to get proc ptr");
  72. return -1;
  73. }
  74. proc = (PROC *) MAKE_PTR(location);
  75. return LockReleaseAll(USER_LOCKMETHOD, &proc->lockQueue);
  76. }
  77. /* end of file */
  78. /*
  79.  * Local Variables:
  80.  *  tab-width: 4
  81.  *  c-indent-level: 4
  82.  *  c-basic-offset: 4
  83.  * End:
  84.  */