|
@@ -50,6 +50,7 @@ VAR
|
|
processList : Unix.Mutex_t;
|
|
processList : Unix.Mutex_t;
|
|
createProcess : Unix.Mutex_t;
|
|
createProcess : Unix.Mutex_t;
|
|
startProcess : Unix.Mutex_t;
|
|
startProcess : Unix.Mutex_t;
|
|
|
|
+ startEventLock : Unix.Mutex_t;
|
|
lockMutex : Unix.Mutex_t;
|
|
lockMutex : Unix.Mutex_t;
|
|
childrunning : Unix.Condition_t;
|
|
childrunning : Unix.Condition_t;
|
|
|
|
|
|
@@ -302,8 +303,10 @@ TYPE
|
|
ASSERT( bodyProc # NIL );
|
|
ASSERT( bodyProc # NIL );
|
|
body := bodyProc;
|
|
body := bodyProc;
|
|
Unix.MtxLock( startProcess );
|
|
Unix.MtxLock( startProcess );
|
|
|
|
+ Unix.MtxLock( startEventLock ); (* the cond wait below opens this lock again! *)
|
|
threadId := Unix.ThrStart( BodyStarter, stacksize );
|
|
threadId := Unix.ThrStart( BodyStarter, stacksize );
|
|
- Unix.CondWait( childrunning, startProcess );
|
|
|
|
|
|
+ Unix.CondWait( childrunning, startEventLock );
|
|
|
|
+ Unix.MtxUnlock( startEventLock );
|
|
Unix.MtxUnlock( startProcess );
|
|
Unix.MtxUnlock( startProcess );
|
|
RegisterFinalizer( SELF, FinalizeProcess );
|
|
RegisterFinalizer( SELF, FinalizeProcess );
|
|
ELSE
|
|
ELSE
|
|
@@ -335,13 +338,11 @@ TYPE
|
|
cur.state.SP := S.GetStackPointer();
|
|
cur.state.SP := S.GetStackPointer();
|
|
cur.state.BP := S.GetFramePointer();
|
|
cur.state.BP := S.GetFramePointer();
|
|
cur.state.PC := ADDRESSOF( GCLoop );
|
|
cur.state.PC := ADDRESSOF( GCLoop );
|
|
-
|
|
|
|
SuspendActivities;
|
|
SuspendActivities;
|
|
Heaps.CollectGarbage( Modules.root );
|
|
Heaps.CollectGarbage( Modules.root );
|
|
-
|
|
|
|
|
|
+ ResumeActivities;
|
|
Machine.Release( Machine.Heaps );
|
|
Machine.Release( Machine.Heaps );
|
|
Machine.Release( Machine.Objects );
|
|
Machine.Release( Machine.Objects );
|
|
- ResumeActivities;
|
|
|
|
finalizerCaller.Activate;
|
|
finalizerCaller.Activate;
|
|
END;
|
|
END;
|
|
END SetgcOngoing;
|
|
END SetgcOngoing;
|
|
@@ -353,7 +354,7 @@ TYPE
|
|
PROCEDURE BodyStarter;
|
|
PROCEDURE BodyStarter;
|
|
VAR p: Process; res: WORD; prevBP, sp: ADDRESS;
|
|
VAR p: Process; res: WORD; prevBP, sp: ADDRESS;
|
|
BEGIN
|
|
BEGIN
|
|
- Unix.MtxLock( startProcess );
|
|
|
|
|
|
+ Unix.MtxLock( startEventLock );
|
|
p := newProcess; newProcess := NIL;
|
|
p := newProcess; newProcess := NIL;
|
|
Unix.WriteKey( processPointer, p );
|
|
Unix.WriteKey( processPointer, p );
|
|
p.id := nextPID; INC( nextPID );
|
|
p.id := nextPID; INC( nextPID );
|
|
@@ -364,7 +365,7 @@ TYPE
|
|
p.nextProcess := root; root := p;
|
|
p.nextProcess := root; root := p;
|
|
Unix.MtxUnlock( processList );
|
|
Unix.MtxUnlock( processList );
|
|
Unix.CondSignal( childrunning );
|
|
Unix.CondSignal( childrunning );
|
|
- Unix.MtxUnlock( startProcess );
|
|
|
|
|
|
+ Unix.MtxUnlock( startEventLock );
|
|
|
|
|
|
p.SetPriority( p.priority );
|
|
p.SetPriority( p.priority );
|
|
|
|
|
|
@@ -766,19 +767,22 @@ TYPE
|
|
PROCEDURE SuspendActivities;
|
|
PROCEDURE SuspendActivities;
|
|
VAR t, me: Process;
|
|
VAR t, me: Process;
|
|
BEGIN
|
|
BEGIN
|
|
|
|
+ Unix.MtxLock( processList ); (* no process should silently quit during global thread suspension *)
|
|
me := CurrentProcess();
|
|
me := CurrentProcess();
|
|
t := root;
|
|
t := root;
|
|
WHILE t # NIL DO
|
|
WHILE t # NIL DO
|
|
- IF t # me THEN
|
|
|
|
|
|
+ IF t # me THEN
|
|
Unix.ThrSuspend( t.threadId, t.mode = Running );
|
|
Unix.ThrSuspend( t.threadId, t.mode = Running );
|
|
END;
|
|
END;
|
|
t := t.nextProcess
|
|
t := t.nextProcess
|
|
END;
|
|
END;
|
|
|
|
+ Unix.MtxUnlock( processList );
|
|
END SuspendActivities;
|
|
END SuspendActivities;
|
|
|
|
|
|
PROCEDURE ResumeActivities;
|
|
PROCEDURE ResumeActivities;
|
|
VAR t, me: Process;
|
|
VAR t, me: Process;
|
|
BEGIN
|
|
BEGIN
|
|
|
|
+ Unix.MtxLock( processList ); (* no process should silently quit during global thread suspension *)
|
|
me := CurrentProcess();
|
|
me := CurrentProcess();
|
|
t := root;
|
|
t := root;
|
|
WHILE t # NIL DO
|
|
WHILE t # NIL DO
|
|
@@ -787,6 +791,7 @@ TYPE
|
|
END;
|
|
END;
|
|
t := t.nextProcess
|
|
t := t.nextProcess
|
|
END;
|
|
END;
|
|
|
|
+ Unix.MtxUnlock( processList );
|
|
END ResumeActivities;
|
|
END ResumeActivities;
|
|
|
|
|
|
|
|
|
|
@@ -874,8 +879,9 @@ TYPE
|
|
Unix.suspendHandler := GetContext;
|
|
Unix.suspendHandler := GetContext;
|
|
|
|
|
|
createProcess := Unix.NewMtx( ); processList := Unix.NewMtx( );
|
|
createProcess := Unix.NewMtx( ); processList := Unix.NewMtx( );
|
|
- startProcess := Unix.NewMtx( ); childrunning := Unix.NewCond( );
|
|
|
|
|
|
+ startEventLock := Unix.NewMtx( ); childrunning := Unix.NewCond( );
|
|
lockMutex := Unix.NewMtx( );
|
|
lockMutex := Unix.NewMtx( );
|
|
|
|
+ startProcess := Unix.NewMtx( );
|
|
|
|
|
|
processPointer := Unix.NewKey( );
|
|
processPointer := Unix.NewKey( );
|
|
|
|
|