33MemClient * memc_open ()
44{
55 MemClient * ret = (MemClient * )malloc (sizeof (MemClient ));
6- /* create semaphore */
7- ret -> socket_lock_server = sem_open (DEFAULT_SERVER_SEMAPHORE_NAME , O_CREAT /* only open if it exists*/ , 0644 , 1 );
8- if (ret -> socket_lock_server == SEM_FAILED ) {
9- perror ("sem_open" );
10- exit (-1 );
11- }
126 /* create shared memory */
13- ret -> shm_id = shmget (ftok (DEFAULT_CONNECTION_SHM , 0 ), DEFAULT_CONNECTION_BUFFER_SIZE , 0666 ); // create shared memory
7+ ret -> con . shm_id = shmget (ftok (DEFAULT_CONNECTION_SHM , 0 ), DEFAULT_CONNECTION_BUFFER_SIZE , 0666 ); // create shared memory
148
159 /* check if shared memory was created successfully */
16- if (ret -> shm_id == -1 )
10+ if (ret -> con . shm_id == -1 )
1711 {
1812 perror ("Check if server is running, Error creating shared memory" );
19- if (sem_unlink (DEFAULT_SERVER_SEMAPHORE_NAME ) == -1 )
20- perror ("sem_unlink" );
2113 _Exit (-1 );
2214 }
2315
2416 /* attach shared memory to the process's address space */
25- ret -> socket = shmat (ret -> shm_id , (void * ) 0 , 0 );
26- if (ret -> socket == (char * ) -1 )
17+ ret -> con . socket = shmat (ret -> con . shm_id , (void * ) 0 , 0 );
18+ if (ret -> con . socket == (char * ) -1 )
2719 {
2820 perror ("Error attaching shared memory" );
2921 return 1 ;
3022 }
3123
32- ret -> socket += 3 ;
24+ ret -> con . socket += 3 ;
3325
3426 if (memcon_getState (ret ) == MCON_UNVAIL )
3527 {
3628 printf ("Error: Server not running.\n" );
37- /* unlink, since no server running and shared memory not needed */
38- if (sem_unlink (DEFAULT_SERVER_SEMAPHORE_NAME ) == -1 )
39- perror ("sem_unlink" );
40- if (shmdt (ret -> socket ) == -1 )
29+
30+ if (shmdt (ret -> con .socket ) == -1 )
4131 perror ("Error detaching shared memory" );
4232 /* mark shared memory for removal */
43- if (shmctl (ret -> shm_id , IPC_RMID , NULL ) == -1 )
33+ if (shmctl (ret -> con . shm_id , IPC_RMID , NULL ) == -1 )
4434 perror ("Error removing shared memory" );
4535 free (ret );
4636 _Exit (-1 );
@@ -50,31 +40,33 @@ MemClient* memc_open()
5040
5141void memc_send (MemClient * client , void * data , _nmap_size size )
5242{
43+ client -> active = CLIENT_ACTIVE ;
5344 // printf("MemClient.c:53 wait\n");
54- memcon_awaitAndSetState (MCON_EMPTY , MCON_TRANSFER , client );
55- memcpy (client -> socket + 3 , data , size );
56- memcon_updateState (MCON_WAITING , client );
57- sem_post (client -> socket_lock_server );
45+ memcon_awaitAndSetState (MCON_EMPTY , MCON_TRANSFER , & client -> con );
46+ memcpy (client -> con .socket , data , size );
47+ memcon_updateState (MCON_WAITING , & client -> con );
5848 // printf("MemClient.c:58 wait\n");
59- memcon_awaitState (MCON_RESPONSED , client );
49+ memcon_awaitState (MCON_RESPONSED , & client -> con );
6050 // printf("MemClient.c:60 done\n");
6151}
6252
6353extern inline void memc_cleanbuf (MemClient * client )
6454{
65- memset (client -> socket + 3 , 0 , DEFAULT_CONNECTION_BUFFER_SIZE );
55+ memset (client -> con . socket , 0 , DEFAULT_CONNECTION_BUFFER_SIZE );
6656}
6757
6858extern inline void memc_accept (MemClient * client )
6959{
70- memcon_updateState (MCON_EMPTY , client );
60+ memcon_updateState (MCON_EMPTY , & client -> con );
61+ client -> active = CLIENT_INACTIVE ;
7162}
7263
7364void memc_close (MemClient * client )
7465{
75- sem_close (client -> socket_lock_server );
66+ if (client -> active == CLIENT_ACTIVE )
67+ memcon_updateState (MCON_EMPTY , & client -> con );
7668 /* detach shared memory */
77- if (shmdt (client -> socket - 3 ) == -1 )
69+ if (shmdt (client -> con . socket - 3 ) == -1 )
7870 {
7971 perror ("Error detaching shared memory" );
8072 _Exit (-1 );
0 commit comments