9 #include "stb_ctk_mutex.h"
11 static chain_list
*ALL_MUTEX
=NULL
;
12 static unsigned int NB_MUTEX
=0;
19 tabmtx
* STB_CTK_TAB_MTX
= NULL
;
21 static void __CtkMutexInit(ttvfig_list
*tvf
, int num
, long level
)
25 chain_list
*chain
, *head
, *chainsig
, *cl
, *ch
;
39 {INF_CROSSTALKMUXU
, 'u', MUTEX_ONLY_ONE
},
40 {INF_CROSSTALKMUXD
, 'd', MUTEX_ONLY_ONE
}
43 ifl
=getinffig(tvf
->INFO
->FIGNAME
);
44 lf
=rcx_getlofig(tvf
->INFO
->FIGNAME
, NULL
);
46 for (i
=0; i
<sizeof(annot
)/sizeof(*annot
); i
++)
48 if (inf_GetPointer(ifl
, annot
[i
].section
, "", (void **)&head
))
50 for (chain
=head
; chain
; chain
=chain
->NEXT
)
53 for (ch
=(chain_list
*)chain
->DATA
; ch
!=NULL
; ch
=ch
->NEXT
)
55 cl
= addchain(NULL
,ch
->DATA
) ;
56 chainsig
= ttv_getsigbytype_and_netname(tvf
,NULL
,TTV_SIG_TYPEALL
,cl
) ;
58 for (cl
=chainsig
; cl
!=NULL
; cl
=cl
->NEXT
)
60 tvs
=(ttvsig_list
*)cl
->DATA
;
61 ls
=rcx_gethtrcxsig( NULL
, lf
, tvs
->NETNAME
);
63 tvs
=ttv_getttvsig_sub(tvf
, ls
, level
, TTV_FIND_LINE
| TTV_FIND_MIN
| TTV_FIND_MAX
);
65 if (annot
[i
].edge
=='u') tvn
=&tvs
->NODE
[1];
66 else if (annot
[i
].edge
=='d') tvn
=&tvs
->NODE
[0];
67 else { tvn
=&tvs
->NODE
[0]; exit(1);}
68 if ((pt
=getptype(tvn
->USER
, CTK_MUTEX_PTYPE
))!=NULL
)
70 if (((one_mutex
*)pt
->DATA
)->mutexnum
!=num
)
72 /* avt_error("stbctk", 1, AVT_ERR, "signal '%s' %s in multiple crosstalk mutex\n", tvs->NETNAME, annot[i].edge=='u'?"rising":"falling"),
81 om
=(one_mutex
*)mbkalloc(sizeof(one_mutex
));
83 om
->mutextype
=annot
[i
].mutextype
;
84 om
->allttvevents
=NULL
;
85 ALL_MUTEX
=addchain(ALL_MUTEX
, om
);
87 tvn
->USER
=addptype(tvn
->USER
, CTK_MUTEX_PTYPE
, om
);
88 om
->allttvevents
=addchain(om
->allttvevents
, tvn
);
100 mbkfree( STB_CTK_TAB_MTX
);
102 STB_CTK_TAB_MTX
= mbkalloc( sizeof( tabmtx
) * NB_MUTEX
);
103 for( i
=0 ; i
<NB_MUTEX
; i
++ ) {
104 STB_CTK_TAB_MTX
[i
].HEAD
= NULL
;
105 STB_CTK_TAB_MTX
[i
].MTX
= NULL
;
108 // recursive call for the sons
109 for(chain
= tvf
->INS
; chain
!= NULL
; chain
= chain
->NEXT
)
111 __CtkMutexInit((ttvfig_list
*)chain
->DATA
, num
, level
) ;
115 void CtkMutexInit(ttvfig_list
*tvf
)
117 __CtkMutexInit(tvf
, 0, tvf
->INFO
->LEVEL
);
120 void CtkMutexFree(ttvfig_list
*tvf
)
125 for (cl
=ALL_MUTEX
; cl
!=NULL
; cl
=cl
->NEXT
)
127 om
=(one_mutex
*)cl
->DATA
;
128 for (ch
=om
->allttvevents
; ch
!=NULL
; ch
=ch
->NEXT
)
130 tev
=(ttvevent_list
*)ch
->DATA
;
131 if (getptype(tev
->USER
, CTK_MUTEX_PTYPE
)==NULL
) exit(8); // temporaire
132 tev
->USER
=delptype(tev
->USER
, CTK_MUTEX_PTYPE
);
134 freechain(om
->allttvevents
);
137 freechain(ALL_MUTEX
);
141 if( STB_CTK_TAB_MTX
)
142 mbkfree( STB_CTK_TAB_MTX
);
143 STB_CTK_TAB_MTX
= NULL
;
147 one_mutex
*GetCtkMutex(ttvfig_list
*tvf
, ttvevent_list
*tev
)
150 if ((pt
=getptype(tev
->USER
, CTK_MUTEX_PTYPE
))!=NULL
)
151 return (one_mutex
*)pt
->DATA
;
156 int GetCtkMutexType(one_mutex
*om
)
158 return om
->mutextype
;
161 int GetCtkMutexIdent(one_mutex
*om
)
166 chain_list
* GetCtkMutexEventList(one_mutex
*om
)
168 return om
->allttvevents
;
171 int GetCtkMutexNumber(ttvfig_list
*tvf
)
177 sortedmutex
* stb_ctk_sort_by_mutex( ttvfig_list
*tvf
, ttvevent_list
*victim
, chain_list
*eventlist
)
181 sortedmutexlist
*ml
;
186 ttvevent_list
*event
;
190 if (ALL_MUTEX
!=NULL
) {
191 for( chain
= eventlist
; chain
; chain
= chain
->NEXT
) {
193 event
= (ttvevent_list
*)chain
->DATA
;
195 m
= GetCtkMutex( tvf
, event
) ;
198 n
= GetCtkMutexIdent( m
) ;
199 if( STB_CTK_TAB_MTX
[n
].MTX
== NULL
)
200 todo
= addnum( todo
, n
) ;
201 STB_CTK_TAB_MTX
[n
].HEAD
= addchain( STB_CTK_TAB_MTX
[n
].HEAD
, event
) ;
202 STB_CTK_TAB_MTX
[n
].MTX
= m
;
210 mutex
= (sortedmutex
*)addptype( NULL
, 0l, NULL
);
212 mutex
->MUTEX
= GetCtkMutex( tvf
, victim
);
213 mutex
->NOMUTEX
= NULL
;
215 for( chain
= eventlist
; chain
; chain
= chain
->NEXT
) {
216 event
= (ttvevent_list
*)chain
->DATA
;
217 m
= GetCtkMutex( tvf
, event
) ;
219 mutex
->NOMUTEX
= addchain( mutex
->NOMUTEX
, event
);
223 for( num
= todo
; num
; num
= num
->NEXT
) {
224 ml
= ( sortedmutexlist
* ) addptype( NULL
, 0l, NULL
);
225 ml
->NEXT
= mutex
->LIST
;
227 ml
->MUTEX
= STB_CTK_TAB_MTX
[num
->DATA
].MTX
;
228 ml
->LIST
= STB_CTK_TAB_MTX
[num
->DATA
].HEAD
;
229 STB_CTK_TAB_MTX
[num
->DATA
].MTX
= NULL
;
230 STB_CTK_TAB_MTX
[num
->DATA
].HEAD
= NULL
;
238 void stb_ctk_free_sortedmutex( ttvfig_list
*tvf
, sortedmutex
*mutex
)
240 sortedmutexlist
*ml
;
242 for( ml
= mutex
->LIST
; ml
; ml
= ml
->NEXT
)
243 freechain( ml
->LIST
);
244 freeptype( (ptype_list
*)mutex
->LIST
);
245 freechain( mutex
->NOMUTEX
);
247 ((ptype_list
*)mutex
)->NEXT
= NULL
;
248 freeptype( (ptype_list
*)mutex
);