removed experimental code on error exceptionization.
made the sp method of the Process class a primitive method for accuracy fixed omission of some fields when initializing a nil_process. wrote a macro to inspect a receiver and changed the receiver inspect code to use the macro corrected the order between return value setting and process suspension/temrination/activation in some primitive functions
This commit is contained in:
@ -289,15 +289,6 @@ extend Apex
|
||||
self primitiveFailed
|
||||
}
|
||||
|
||||
## -------------------------------------------------------
|
||||
## -------------------------------------------------------
|
||||
|
||||
method exceptionizeError: trueOrFalse
|
||||
{
|
||||
<primitive: #_exceptionize_error>
|
||||
self class cannotExceptionizeError
|
||||
}
|
||||
|
||||
(* ------------------------------------------------------------------
|
||||
* COMMON ERROR/EXCEPTION HANDLERS
|
||||
* ------------------------------------------------------------------ *)
|
||||
|
@ -507,10 +507,4 @@ extend Apex
|
||||
class_name := if (self class == Class) { self name } else { self class name }.
|
||||
ProhibitedMessageException signal: (method_name & ' not allowed for ' & class_name).
|
||||
}
|
||||
|
||||
method(#dual) cannotExceptionizeError
|
||||
{
|
||||
## todo: accept the object
|
||||
ErrorExceptionizationFailureException signal: 'Cannot exceptionize an error'
|
||||
}
|
||||
}
|
||||
|
@ -2,16 +2,19 @@
|
||||
class(#pointer,#final,#limited) Process(Object)
|
||||
{
|
||||
var(#get) initialContext, currentContext, id, state.
|
||||
var(#get) sp, ps_prev, ps_next, sem_wait_prev, sem_wait_next.
|
||||
var sp.
|
||||
var(#get) ps_prev, ps_next, sem_wait_prev, sem_wait_next.
|
||||
var sem, perr, perrmsg.
|
||||
|
||||
method primError { ^self.perr }
|
||||
method primErrorMessage { ^self.perrmsg }
|
||||
|
||||
method(#primitive) sp.
|
||||
|
||||
method(#primitive) resume.
|
||||
method(#primitive) yield.
|
||||
method(#primitive) suspend.
|
||||
method(#primitive) _terminate.
|
||||
method(#primitive) _suspend.
|
||||
|
||||
method terminate
|
||||
{
|
||||
@ -38,8 +41,8 @@ class(#pointer,#final,#limited) Process(Object)
|
||||
## the process must not be scheduled.
|
||||
## ----------------------------------------------------------------------------------------------------------
|
||||
|
||||
##if (Processor activeProcess ~~ self) { self _suspend }.
|
||||
if (thisProcess ~~ self) { self _suspend }.
|
||||
##if (Processor activeProcess ~~ self) { self suspend }.
|
||||
if (thisProcess ~~ self) { self suspend }.
|
||||
self.currentContext unwindTo: self.initialContext return: nil.
|
||||
^self _terminate
|
||||
}
|
||||
@ -191,6 +194,7 @@ class SemaphoreGroup(Object)
|
||||
size := 0,
|
||||
pos := 0,
|
||||
semarr := nil.
|
||||
var(#get,#set) signaledSemaphore := nil.
|
||||
|
||||
(* TODO: good idea to a shortcut way to prohibit a certain method in the heirarchy chain?
|
||||
|
||||
@ -204,7 +208,7 @@ method(#class,#abstract) xxx. => method(#class) xxx { self subclassResponsibilit
|
||||
|
||||
method(#class,#variadic) with()
|
||||
{
|
||||
| i x arr |
|
||||
| i x arr sem |
|
||||
|
||||
i := 0.
|
||||
x := thisContext vargCount.
|
||||
@ -212,7 +216,13 @@ method(#class,#abstract) xxx. => method(#class) xxx { self subclassResponsibilit
|
||||
arr := Array new: x.
|
||||
while (i < x)
|
||||
{
|
||||
arr at: i put: (thisContext vargAt: i).
|
||||
sem := thisContext vargAt: i.
|
||||
if (sem _group notNil)
|
||||
{
|
||||
System.Exception signal: 'Cannot add a semaphore in a group to another group'
|
||||
}.
|
||||
|
||||
arr at: i put: sem.
|
||||
i := i + 1.
|
||||
}.
|
||||
|
||||
@ -514,7 +524,7 @@ class(#final,#limited) ProcessScheduler(Object)
|
||||
## -----------------------------------------------------
|
||||
| s |
|
||||
s := Semaphore new.
|
||||
self signal: s after: secs and: nanosecs
|
||||
self signal: s after: secs and: nanosecs.
|
||||
s wait.
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user