xref: /XiangShan/scripts/utils/lock-emu.c (revision f320e0f01bd645f0a3045a8a740e60dd770734a9)
1c6d43980SLemover /***************************************************************************************
2c6d43980SLemover * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3*f320e0f0SYinan Xu * Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover *
5c6d43980SLemover * XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover * You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover * You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover *          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover *
10c6d43980SLemover * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover *
14c6d43980SLemover * See the Mulan PSL v2 for more details.
15c6d43980SLemover ***************************************************************************************/
16c6d43980SLemover 
17ba6bb9d6SLinJiawei #include<unistd.h>
18ba6bb9d6SLinJiawei #include<stdio.h>
19ba6bb9d6SLinJiawei #include<stdlib.h>
20ba6bb9d6SLinJiawei #include<sys/stat.h>
21ba6bb9d6SLinJiawei #include<fcntl.h>
225bcf051aSLinJiawei #include<string.h>
235bcf051aSLinJiawei 
245bcf051aSLinJiawei #define BUF_SIZE 32
25ba6bb9d6SLinJiawei 
tryLock(char * file)26ba6bb9d6SLinJiawei int tryLock(char * file){
275bcf051aSLinJiawei     return open(file, O_CREAT | O_EXCL | O_WRONLY, 0666);
28ba6bb9d6SLinJiawei }
29ba6bb9d6SLinJiawei 
main(int argc,char * argv[])30ba6bb9d6SLinJiawei int main(int argc, char* argv[]){
31ba6bb9d6SLinJiawei     int fd;
325bcf051aSLinJiawei 	char user[BUF_SIZE];
33ba6bb9d6SLinJiawei 	if(argc < 2){
34ba6bb9d6SLinJiawei 	    printf("arguments are not right!\n");
35ba6bb9d6SLinJiawei 		exit(-1);
36ba6bb9d6SLinJiawei 	}
37ba6bb9d6SLinJiawei 
38ba6bb9d6SLinJiawei     do{
39ba6bb9d6SLinJiawei         fd = tryLock(argv[1]);
405bcf051aSLinJiawei         if(fd > 0){
415bcf051aSLinJiawei             getlogin_r(user, BUF_SIZE);
42392c1d91SZhangZifei             int len = strlen(user);
43392c1d91SZhangZifei             user[len] = '\0';
44392c1d91SZhangZifei             write(fd, user, len+1);
455bcf051aSLinJiawei             break;
465bcf051aSLinJiawei         } else {
475bcf051aSLinJiawei             // someone is holding the lock...
485bcf051aSLinJiawei             fd = open(argv[1], O_RDONLY);
495bcf051aSLinJiawei             if(fd > 0){
505bcf051aSLinJiawei                 read(fd, user, BUF_SIZE);
515bcf051aSLinJiawei                 printf("%s is holding the lock, waiting ...\n", user);
525bcf051aSLinJiawei             }
535bcf051aSLinJiawei         }
54ba6bb9d6SLinJiawei         sleep(10);
55ba6bb9d6SLinJiawei     } while(1);
56ba6bb9d6SLinJiawei 
57ba6bb9d6SLinJiawei     return 0;
58ba6bb9d6SLinJiawei }
59ba6bb9d6SLinJiawei 
60