/* * 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; }
/* * 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; }