Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include "deps/domaci1.h"
- #define UNLOCKED 0
- #define WAITING 1
- #define TIMED_OUT 2
- typedef struct Node{
- int flag;
- struct Node * next;
- } Node;
- Node* tail = NULL;
- double startTime[80];
- double maxDelta = 0.0;
- double minDelta = 10;
- int lock_n_threads_with_timeout(int id, int* local, int timeout)
- {
- double start = get_time();
- // startTime[id] = start;
- double dTimeout = (double)timeout/1000.0;
- Node* node = (Node*) malloc(sizeof(Node));
- //if(node->flag != 0)
- node->flag = WAITING;
- node->next = NULL;
- *local = node;
- Node* old = (Node*) get_and_set(&tail, node);
- if(old != NULL){
- old->next = node;
- while(node->flag == WAITING)
- {
- sleep(2);
- if(node->flag == UNLOCKED) break;
- double delta = get_time() - start;
- if(delta > dTimeout)
- {
- if(get_and_set(&node->flag,TIMED_OUT) == UNLOCKED)
- {
- printf("omg!!!");
- fflush(stdout);
- return 1;
- }
- //node->flag = TIMED_OUT;
- if(minDelta > delta) minDelta = delta;
- if(maxDelta < delta) maxDelta = delta;
- //free(node);
- return 0;
- }
- }
- }
- node->flag = UNLOCKED;
- // printf("NORMALAN!");
- // fflush(stdout);
- return 1;
- }
- void unlock_n_threads_with_timeout(int id, int* local)
- {
- // printf("UNLOCK!");
- // fflush(stdout);
- Node* node = (Node*) *local;
- if(node->next == NULL){
- if(compare_and_set((int*)&tail, (int)node, (int)NULL)){
- }
- else{
- while(node->next == NULL){
- printf("sleep2");
- fflush(stdout);
- sleep(1);
- }
- node->next->flag = UNLOCKED;
- }
- } else{
- Node* myNext = node->next;
- //da li je next timeoutovao, odnosno next->next pa next-next-next
- while(1)
- {
- if(compare_and_set(&myNext->flag, WAITING, UNLOCKED))
- {
- //return;
- break;
- }
- else
- {
- if(myNext->next == NULL)
- {
- if(compare_and_set((int*)&tail, (int)myNext, (int)NULL))
- {
- break;
- }
- else
- {
- while(myNext->next == NULL)
- {
- printf("sleepTO");
- fflush(stdout);
- sleep(1);
- }
- myNext = myNext->next;
- }
- }
- else
- {
- myNext = myNext->next;
- }
- }
- sleep(1);
- }
- // myNext = myNext->next; //i to mora u taj cas
- //dal ispala iz liste
- //moze doci do context switcha, pa mora cas ovde negde
- // myNext->flag = 0;//ovo mora u cas
- //proveriti da li je sledeci timeoutovao
- // free(node);
- }
- // double finalDelta = get_time() - startTime[id];
- // if(finalDelta > maxDelta) maxDelta = finalDelta;
- // if(finalDelta < minDelta) minDelta = finalDelta;
- }
- int main()
- {
- start_timeout_mutex_n_threads_test();
- printf("MAX DELTA = %.5lf\n", maxDelta);
- printf("MIN DELTA = %.5lf", minDelta);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement