snp-lab-code/P08_Sync/work/Sync/banking/a1/banking.c

104 lines
2.8 KiB
C
Raw Permalink Normal View History

2022-02-17 11:45:11 +01:00
//******************************************************************************
// Course: BSy
// File: banking.c
// Author: M. Thaler, ZHAW
// Purpose: locking mechanisms
// Version: v.fs20
//******************************************************************************
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include "banking.h"
//******************************************************************************
typedef struct account_struct_ {
long int balance;
pthread_mutex_t acntLock;
} Account;
typedef struct branch_struct {
Account *accounts;
pthread_mutex_t branchLock;
} Branch;
//******************************************************************************
static Branch *Bank;
static int nBranches, nAccounts;
//******************************************************************************
// banking functions
void makeBank(int num_branches, int num_accounts) {
nBranches = num_branches;
nAccounts = num_accounts;
Bank = (Branch *)malloc(nBranches * sizeof(Branch));
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
for (int i = 0; i < nBranches; i++) {
Bank[i].accounts = (Account *)malloc(nAccounts * sizeof(Account));
pthread_mutex_init(&(Bank[i].branchLock), &attr);
for (int j = 0; j < nAccounts; j++) {
Bank[i].accounts[j].balance = 0;
pthread_mutex_init((&(Bank[i].accounts[j].acntLock)), &attr);
}
}
}
void deleteBank(void) {
for (int i = 0; i < nBranches; i++)
free(Bank[i].accounts);
free(Bank);
nBranches = nAccounts = 0;
}
long int withdraw(int branchNr, int accountNr, long int value) {
int rv, tmp;
rv = 0;
tmp = Bank[branchNr].accounts[accountNr].balance - value;
if (tmp >= 0) {
Bank[branchNr].accounts[accountNr].balance = tmp;
rv = value;
}
return rv;
}
void deposit(int branchNr, int accountNr, long int value) {
Bank[branchNr].accounts[accountNr].balance += value;
}
void transfer(int fromB, int toB, int accountNr, long int value) {
int money = withdraw(fromB, accountNr, value);
if (money >= 0)
deposit(toB, accountNr, money);
}
void checkAssets(void) {
static long assets = 0;
long sum = 0;
for (int i = 0; i < nBranches; i++) {
for (int j = 0; j < nAccounts; j++) {
sum += (long)Bank[i].accounts[j].balance;
}
}
if (assets == 0) {
assets = sum;
printf("Balance of accounts is: %ld\n", sum);
}
else {
if (sum != assets)
printf("Balance of accounts is: %ld ... not correct\n", sum);
else
printf("Balance of accounts is: %ld ... correct\n", assets);
}
}
//******************************************************************************