1 /*-
2  * Copyright (c) 2009, 2020 Oracle and/or its affiliates.  All rights reserved.
3  *
4  * See the file LICENSE for license information.
5  *
6  */
7 using System;
8 using System.Collections.Generic;
9 using System.Text;
10 using BerkeleyDB.Internal;
11 
12 namespace BerkeleyDB {
13     /// <summary>
14     /// A class to represent what lock request(s) should be rejected during
15     /// deadlock resolution.
16     /// </summary>
17     public class DeadlockPolicy {
18         private uint flag;
19         internal uint policy { get { return flag; } }
20 
DeadlockPolicy(uint val)21         private DeadlockPolicy(uint val) {
22             flag = val;
23         }
24 
fromPolicy(uint val)25         internal static DeadlockPolicy fromPolicy(uint val) {
26             switch (val) {
27                 case DbConstants.DB_LOCK_DEFAULT:
28                     return DEFAULT;
29                 case DbConstants.DB_LOCK_EXPIRE:
30                     return EXPIRE;
31                 case DbConstants.DB_LOCK_MAXLOCKS:
32                     return MAX_LOCKS;
33                 case DbConstants.DB_LOCK_MAXWRITE:
34                     return MAX_WRITE;
35                 case DbConstants.DB_LOCK_MINLOCKS:
36                     return MIN_LOCKS;
37                 case DbConstants.DB_LOCK_MINWRITE:
38                     return MIN_WRITE;
39                 case DbConstants.DB_LOCK_OLDEST:
40                     return OLDEST;
41                 case DbConstants.DB_LOCK_RANDOM:
42                     return RANDOM;
43                 case DbConstants.DB_LOCK_YOUNGEST:
44                     return YOUNGEST;
45             }
46             throw new ArgumentException("Invalid deadlock policy.");
47         }
48 
49         /// <summary>
50         /// If no DeadlockPolicy has yet been specified, use
51         /// <see cref="RANDOM"/>.
52         /// </summary>
53         public static DeadlockPolicy DEFAULT =
54             new DeadlockPolicy(DbConstants.DB_LOCK_DEFAULT);
55         /// <summary>
56         /// Reject lock requests which have timed out. No other deadlock
57         /// detection is performed.
58         /// </summary>
59         public static DeadlockPolicy EXPIRE =
60             new DeadlockPolicy(DbConstants.DB_LOCK_EXPIRE);
61         /// <summary>
62         /// Reject the lock request for the locker ID with the most locks.
63         /// </summary>
64         public static DeadlockPolicy MAX_LOCKS =
65             new DeadlockPolicy(DbConstants.DB_LOCK_MAXLOCKS);
66         /// <summary>
67         /// Reject the lock request for the locker ID with the most write locks.
68         /// </summary>
69         public static DeadlockPolicy MAX_WRITE =
70             new DeadlockPolicy(DbConstants.DB_LOCK_MAXWRITE);
71         /// <summary>
72         /// Reject the lock request for the locker ID with the fewest locks.
73         /// </summary>
74         public static DeadlockPolicy MIN_LOCKS =
75             new DeadlockPolicy(DbConstants.DB_LOCK_MINLOCKS);
76         /// <summary>
77         /// Reject the lock request for the locker ID with the fewest write
78         /// locks.
79         /// </summary>
80         public static DeadlockPolicy MIN_WRITE =
81             new DeadlockPolicy(DbConstants.DB_LOCK_MINWRITE);
82         /// <summary>
83         /// Reject the lock request for the locker ID with the oldest lock.
84         /// </summary>
85         public static DeadlockPolicy OLDEST =
86             new DeadlockPolicy(DbConstants.DB_LOCK_OLDEST);
87         /// <summary>
88         /// Reject the lock request for a random locker ID.
89         /// </summary>
90         public static DeadlockPolicy RANDOM =
91             new DeadlockPolicy(DbConstants.DB_LOCK_RANDOM);
92         /// <summary>
93         /// Reject the lock request for the locker ID with the youngest lock.
94         /// </summary>
95         public static DeadlockPolicy YOUNGEST =
96             new DeadlockPolicy(DbConstants.DB_LOCK_YOUNGEST);
97     }
98 }
99