source: Sophya/trunk/SophyaLib/UnixMac/src/macshm.cc@ 4024

Last change on this file since 4024 was 683, checked in by ansari, 26 years ago

Compilation Mac pour CodeWarrior PRO 5

File size: 1.6 KB
Line 
1//
2// Simulation de memoire partagee pour mac
3//
4
5#include <stdio.h>
6#include "macshm.h"
7
8int shmget(int key, size_t size, int flags)
9{
10 char fn[256];
11 sprintf(fn, "shm.%d", key);
12 c2pstr(fn);
13 OSErr err = 0;
14 if (flags & IPC_CREAT) err = Create((StringPtr)fn, 0,'MMCC','TEXT');
15 if ((flags & IPC_EXCL) && (err == dupFNErr)) return -1;
16 short fRefNum;
17 FSOpen((StringPtr)fn, 0, &fRefNum);
18 long sz;
19 GetEOF(fRefNum, &sz);
20 if (size > sz) SetEOF(fRefNum, size);
21 FSClose(fRefNum);
22 return key;
23}
24
25void* shmat(int shmid, void*, int)
26{
27 char fn[256];
28 sprintf(fn, "shm.%d", shmid);
29 c2pstr(fn);
30 short fRefNum;
31 FSOpen((StringPtr)fn, 0, &fRefNum);
32 long sz;
33 GetEOF(fRefNum, &sz);
34 char* p = new char[sz + sizeof(int)];
35 *(int*)p = shmid;
36 p += sizeof(int);
37 FSRead(fRefNum, &sz, p);
38 FSClose(fRefNum);
39 return (void*) p;
40}
41
42int shmctl(int shmid, int cmd, struct shmid_ds* buf)
43{
44 char fn[256];
45 sprintf(fn, "shm.%d", shmid);
46 c2pstr(fn);
47 switch(cmd) {
48 case IPC_STAT:
49 short fRefNum;
50 FSOpen((StringPtr)fn, 0, &fRefNum);
51 long sz;
52 GetEOF(fRefNum, &sz);
53 buf->shm_segsz = sz;
54 FSClose(fRefNum);
55 return 0;
56 case IPC_RMID:
57 FSDelete((StringPtr)fn, 0);
58 return 0;
59 }
60 return -1;
61}
62int shmdt(const void *addr)
63{
64 char* p = (char*)addr - sizeof(int);
65 int shmid = *(int*)p;
66
67 char fn[256];
68 sprintf(fn, "shm.%d", shmid);
69 c2pstr(fn);
70 short fRefNum;
71 FSOpen((StringPtr)fn, 0, &fRefNum);
72 long sz;
73 GetEOF(fRefNum, &sz);
74 FSWrite(fRefNum, &sz, addr);
75 FSClose(fRefNum);
76
77 delete[] p;
78 return 0;
79}
80
Note: See TracBrowser for help on using the repository browser.