Work in progress in the implementation of a version of the message_queue_create/2 compliant with the ISO Threads DTR.

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@2085 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
pmoura 2008-02-09 13:04:32 +00:00
parent 458bdd890d
commit d39002c271
1 changed files with 27 additions and 15 deletions

View File

@ -509,29 +509,41 @@ message_queue_create(Id, Options) :-
message_queue_create(Id, Options) :- message_queue_create(Id, Options) :-
var(Options), !, var(Options), !,
'$do_error'(instantiation_error, message_queue_create(Id, Options)). '$do_error'(instantiation_error, message_queue_create(Id, Options)).
message_queue_create(Cond). message_queue_create(Id, []) :- !,
'$global_queue_mutex'(QMutex),
'$new_mutex'(Mutex),
'$cond_create'(Cond),
'$thread_new_qid'(Id),
recorda('$queue',q(Id,Mutex,Cond,Id), _),
'$unlock_mutex'(QMutex).
message_queue_create(Id, [alias(Alias)]) :- message_queue_create(Id, [alias(Alias)]) :-
var(Alias), !, var(Alias), !,
'$do_error'(instantiation_error, message_queue_create(Id, Options)). '$do_error'(instantiation_error, message_queue_create(Id, [alias(Alias)])).
message_queue_create(Id, [alias(Alias)]) :- message_queue_create(Id, [alias(Alias)]) :-
atom(Alias), \+ atom(Alias), !,
( recorded('$thread_alias', [_,Alias], _), '$do_error'(type_error(atom,Alias), message_queue_create(Id, [alias(Alias)])).
; recorded('$queue', q(Alias,_,_,_), _)
), !,
'$do_error'(permission_error(create,queue,Alias), message_queue_create(Id, [alias(Alias)])).
message_queue_create(Id, [alias(Alias)]) :- message_queue_create(Id, [alias(Alias)]) :-
mutex_create(Mutex), '$global_queue_mutex'(QMutex),
'$cond_create'(Id), '$lock_mutex'(QMutex),
'$mq_iname'(Id, CName), '$new_mutex'(Mutex),
recorda('$queue',q(Alias,Mutex,Id,CName), _). '$cond_create'(Cond),
'$thread_new_qid'(Id),
( recorded('$queue', q(Alias,_,_,_), _) ->
'$unlock_mutex'(QMutex),
'$do_error'(permission_error(create,queue,alias(Alias)),message_queue_create(Id, [alias(Alias)]))
; recorded('$thread_alias', [_,Alias], _) ->
'$unlock_mutex'(QMutex),
'$do_error'(permission_error(create,queue,alias(Alias)),message_queue_create(Id, [alias(Alias)]))
; recorda('$queue',q(Alias,Mutex,Cond,Id), _),
'$unlock_mutex'(QMutex)
).
message_queue_create(Id) :- message_queue_create(Id) :-
( var(Id) -> ( var(Id) -> % ISO DTR
message_queue_create(Id, []) message_queue_create(Id, [])
; atom(Id) -> ; atom(Id) -> % old behavior
message_queue_create(_, [alias(Id)]) message_queue_create(_, [alias(Id)])
;
). ).
*/ */
message_queue_create(_, [alias(Alias)]) :- % TEMPORARY FIX message_queue_create(_, [alias(Alias)]) :- % TEMPORARY FIX