Esempio n. 1
0
/*
 * allocate and initialize each branch.
 */
int
Branch_Init(Bank *bank, int numBranches, int numAccounts,
            AccountAmount initialAmount)
{
  bank->numberBranches = numBranches;
  bank->branches = malloc(numBranches * sizeof(Branch));
  if (bank->branches == NULL) {
    return -1;
  }

  int accountsPerBranch = numAccounts /  numBranches;

  for (int i = 0; i < numBranches; i++) {
    Branch *branch = &bank->branches[i];

    branch->branchID = i;
    branch->balance = 0;
    branch->numberAccounts = accountsPerBranch;
    branch->accounts = (Account *) malloc(accountsPerBranch * sizeof(Account));
    if (branch->accounts == NULL) {
      return -1;
    }

    for (int a = 0; a < accountsPerBranch; a++) {
      Account_Init(bank, &branch->accounts[a], a, i, initialAmount);
      branch->balance += branch->accounts[a].balance;
    }
	pthread_mutex_init(&(branch->branchLock), NULL);
  }

  return 0;
}
Esempio n. 2
0
/*
 * allocate and initialize each branch.
 */
int
Branch_Init(Bank *bank, int numBranches, int numAccounts,
            AccountAmount initialAmount)
{
  bank->numberBranches = numBranches;
  bank->branches = malloc(numBranches * sizeof(Branch));
  if (bank->branches == NULL) {
    return -1;
  }

  int accountsPerBranch = numAccounts /  numBranches;

   // Recursive lock attribute
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);

  for (int i = 0; i < numBranches; i++) {
    Branch *branch = &bank->branches[i];
    
    // One lock per branch
    //pthread_mutex_t *lock = malloc(sizeof(pthread_mutex_t));
    pthread_mutex_t lock;
    int success = pthread_mutex_init(&lock, &attr);
    // Return -1 on error
    if (success != 0)return -1;
    branch->lock = lock;
	
    branch->branchID = i;
    branch->balance = 0;
    branch->numberAccounts = accountsPerBranch;
    branch->accounts = (Account *) malloc(accountsPerBranch * sizeof(Account));
    if (branch->accounts == NULL) {
      return -1;
    }

    for (int a = 0; a < accountsPerBranch; a++) {
      Account_Init(bank, &branch->accounts[a], a, i, initialAmount);
      branch->balance += branch->accounts[a].balance;
    }
  }

  return 0;
}