xref: /illumos-gate/usr/src/cmd/ipf/lib/mutex_emul.c (revision f3ac678143127d4c6c1793fadabb5ded04e127b6)
1*f3ac6781SToomas Soome #include "ipf.h"
2*f3ac6781SToomas Soome 
3*f3ac6781SToomas Soome #define	EMM_MAGIC	0x9d7adba3
4*f3ac6781SToomas Soome 
eMmutex_enter(mtx,file,line)5*f3ac6781SToomas Soome void eMmutex_enter(mtx, file, line)
6*f3ac6781SToomas Soome eMmutex_t *mtx;
7*f3ac6781SToomas Soome char *file;
8*f3ac6781SToomas Soome int line;
9*f3ac6781SToomas Soome {
10*f3ac6781SToomas Soome 	if (mtx->eMm_magic != EMM_MAGIC) {
11*f3ac6781SToomas Soome 		fprintf(stderr, "%s:eMmutex_enter(%p): bad magic: %#x\n",
12*f3ac6781SToomas Soome 			mtx->eMm_owner, mtx, mtx->eMm_magic);
13*f3ac6781SToomas Soome 		abort();
14*f3ac6781SToomas Soome 	}
15*f3ac6781SToomas Soome 	if (mtx->eMm_held != 0) {
16*f3ac6781SToomas Soome 		fprintf(stderr, "%s:eMmutex_enter(%p): already locked: %d\n",
17*f3ac6781SToomas Soome 			mtx->eMm_owner, mtx, mtx->eMm_held);
18*f3ac6781SToomas Soome 		abort();
19*f3ac6781SToomas Soome 	}
20*f3ac6781SToomas Soome 	mtx->eMm_held++;
21*f3ac6781SToomas Soome 	mtx->eMm_heldin = file;
22*f3ac6781SToomas Soome 	mtx->eMm_heldat = line;
23*f3ac6781SToomas Soome }
24*f3ac6781SToomas Soome 
25*f3ac6781SToomas Soome 
eMmutex_exit(mtx)26*f3ac6781SToomas Soome void eMmutex_exit(mtx)
27*f3ac6781SToomas Soome eMmutex_t *mtx;
28*f3ac6781SToomas Soome {
29*f3ac6781SToomas Soome 	if (mtx->eMm_magic != EMM_MAGIC) {
30*f3ac6781SToomas Soome 		fprintf(stderr, "%s:eMmutex_exit(%p): bad magic: %#x\n",
31*f3ac6781SToomas Soome 			mtx->eMm_owner, mtx, mtx->eMm_magic);
32*f3ac6781SToomas Soome 		abort();
33*f3ac6781SToomas Soome 	}
34*f3ac6781SToomas Soome 	if (mtx->eMm_held != 1) {
35*f3ac6781SToomas Soome 		fprintf(stderr, "%s:eMmutex_exit(%p): not locked: %d\n",
36*f3ac6781SToomas Soome 			mtx->eMm_owner, mtx, mtx->eMm_held);
37*f3ac6781SToomas Soome 		abort();
38*f3ac6781SToomas Soome 	}
39*f3ac6781SToomas Soome 	mtx->eMm_held--;
40*f3ac6781SToomas Soome 	mtx->eMm_heldin = NULL;
41*f3ac6781SToomas Soome 	mtx->eMm_heldat = 0;
42*f3ac6781SToomas Soome }
43*f3ac6781SToomas Soome 
44*f3ac6781SToomas Soome 
eMmutex_init(mtx,who)45*f3ac6781SToomas Soome void eMmutex_init(mtx, who)
46*f3ac6781SToomas Soome eMmutex_t *mtx;
47*f3ac6781SToomas Soome char *who;
48*f3ac6781SToomas Soome {
49*f3ac6781SToomas Soome 	if (mtx->eMm_magic == EMM_MAGIC) {	/* safe bet ? */
50*f3ac6781SToomas Soome 		fprintf(stderr,
51*f3ac6781SToomas Soome 			"%s:eMmutex_init(%p): already initialised?: %#x\n",
52*f3ac6781SToomas Soome 			mtx->eMm_owner, mtx, mtx->eMm_magic);
53*f3ac6781SToomas Soome 		abort();
54*f3ac6781SToomas Soome 	}
55*f3ac6781SToomas Soome 	mtx->eMm_magic = EMM_MAGIC;
56*f3ac6781SToomas Soome 	mtx->eMm_held = 0;
57*f3ac6781SToomas Soome 	if (who != NULL)
58*f3ac6781SToomas Soome 		mtx->eMm_owner = strdup(who);
59*f3ac6781SToomas Soome 	else
60*f3ac6781SToomas Soome 		mtx->eMm_owner = NULL;
61*f3ac6781SToomas Soome }
62*f3ac6781SToomas Soome 
63*f3ac6781SToomas Soome 
eMmutex_destroy(mtx)64*f3ac6781SToomas Soome void eMmutex_destroy(mtx)
65*f3ac6781SToomas Soome eMmutex_t *mtx;
66*f3ac6781SToomas Soome {
67*f3ac6781SToomas Soome 	if (mtx->eMm_magic != EMM_MAGIC) {
68*f3ac6781SToomas Soome 		fprintf(stderr, "%s:eMmutex_destroy(%p): bad magic: %#x\n",
69*f3ac6781SToomas Soome 			mtx->eMm_owner, mtx, mtx->eMm_magic);
70*f3ac6781SToomas Soome 		abort();
71*f3ac6781SToomas Soome 	}
72*f3ac6781SToomas Soome 	if (mtx->eMm_held != 0) {
73*f3ac6781SToomas Soome 		fprintf(stderr, "%s:eMmutex_enter(%p): still locked: %d\n",
74*f3ac6781SToomas Soome 			mtx->eMm_owner, mtx, mtx->eMm_held);
75*f3ac6781SToomas Soome 		abort();
76*f3ac6781SToomas Soome 	}
77*f3ac6781SToomas Soome 	memset(mtx, 0xa5, sizeof(*mtx));
78*f3ac6781SToomas Soome }
79