Re-add the shared memory module to the Dyninst source repository. I've
[dyninst.git] / valueAdded / sharedMem / src / shmSegment.C
1 /*
2  * Copyright (c) 1996-2004 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41 //----------------------------------------------------------------------------
42 // $Id: shmSegment.C,v 1.1 2006/11/22 21:45:04 bernat Exp $
43 //----------------------------------------------------------------------------
44
45 #include "shmSegment.h"
46 #include "../h/SharedMem.h"
47 #include "sharedMemInternal.h"
48 #include "BPatch_process.h"
49
50 const unsigned ShmSegment::cookie = 0xdeadbeef;
51
52
53 // Cross-platform shmSegment definitions
54 bool ShmSegment::attach(BPatch_process *appProc, Address baseAddr) {
55     BPatch_Vector<BPatch_snippet *>init_args;
56     BPatch_constExpr init_key(GetKey());
57     BPatch_constExpr init_size(GetSize());
58     BPatch_constExpr addr(baseAddr);
59     init_args.push_back(&init_key);
60     init_args.push_back(&init_size);
61     init_args.push_back(&addr);
62
63     assert(appProc->isStopped());
64     BPatch_Vector<BPatch_function *>init_func;
65     if ((NULL == appProc->getImage()->findFunction("RTsharedAttach",
66                                                      init_func)) ||
67         init_func.size() == 0) {
68         fprintf(stderr, "Failed to find shared init function\n");
69         return false;
70     }
71     assert(appProc->isStopped());
72     BPatch_funcCallExpr init_expr(*(init_func[0]), init_args);
73     assert(appProc->isStopped());
74     
75     // We return the address attached to by the child -- set up
76     // argument grabbing
77
78     assert(appProc->isStopped());
79     baseAddrInApplic = (Address) appProc->oneTimeCode(init_expr);
80     assert(appProc->isStopped());
81
82     if (baseAddrInApplic != (Address) -1) {
83         if (baseAddr &&
84             (baseAddrInApplic != baseAddr)) {
85             // We were given a base address, but didn't get it. This is bad.
86             fprintf(stderr, "Error: attached to incorrect address\n");
87             return false;
88         }
89         attached = true;
90         return true;
91     }
92     fprintf(stderr, "Attach failed!\n");
93     assert(appProc->isStopped());
94     
95     return false;
96 }
97
98 bool ShmSegment::detach(BPatch_process *appProc) {
99     BPatch_Vector<BPatch_snippet *>init_args;
100     BPatch_constExpr init_key(GetKey());
101     BPatch_constExpr init_size(GetSize());
102     BPatch_constExpr addr(baseAddrInApplic);
103     init_args.push_back(&init_key);
104     init_args.push_back(&init_size);
105     init_args.push_back(&addr);
106
107     BPatch_Vector<BPatch_function *>init_func;
108     if ((NULL == appProc->getImage()->findFunction("RTsharedDetach",
109                                                      init_func)) ||
110         init_func.size() == 0) {
111         fprintf(stderr, "Failed to find shared init function\n");
112         return false;
113     }
114     BPatch_funcCallExpr init_expr(*(init_func[0]), init_args);
115     
116     // We return the address attached to by the child -- set up
117     // argument grabbing
118
119     baseAddrInApplic = (Address) appProc->oneTimeCode(init_expr);
120     
121     if (baseAddrInApplic != (Address) -1) {
122         attached = true;
123         return true;
124     }
125     return false;
126 }
127
128 Address ShmSegment::malloc(unsigned size) {
129     if (!attached) {
130         // Could try to attach here...
131         return 0;
132     }
133     if (freespace < size) return 0;
134     
135     // Just carve a chunk off and update local variables
136     Address ret = highWaterMark + baseAddrInDaemon;
137     highWaterMark += size;
138     freespace -= size;
139     return ret;
140 }
141
142 void ShmSegment::free(Address /*addr*/) {
143     // We need more sophisticated tracking before this
144     // will work
145 }
146
147
148
149