1 | //
|
---|
2 | // Simulation de memoire partagee pour mac
|
---|
3 | //
|
---|
4 |
|
---|
5 | #include <stdio.h>
|
---|
6 | #include "macshm.h"
|
---|
7 |
|
---|
8 | int 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 |
|
---|
25 | void* 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 |
|
---|
42 | int 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 | }
|
---|
62 | int 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 |
|
---|