various tweaks.

This commit is contained in:
rsc 2003-12-06 18:05:27 +00:00
parent c715a6127a
commit e97ceade5e
10 changed files with 74 additions and 8 deletions

View file

@ -1,7 +1,7 @@
#ifndef _FCALL_H_ #ifndef _FCALL_H_
#define _FCALL_H_ 1 #define _FCALL_H_ 1
#if defined(__cplusplus) #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* /*
#pragma src "/sys/src/libc/9sys" #pragma src "/sys/src/libc/9sys"
@ -9,7 +9,6 @@ extern "C" {
*/ */
#define VERSION9P "9P2000" #define VERSION9P "9P2000"
#define MAXWELEM 16 #define MAXWELEM 16
typedef typedef
@ -123,7 +122,8 @@ int read9pmsg(int, void*, uint);
#pragma varargck type "M" ulong #pragma varargck type "M" ulong
#pragma varargck type "D" Dir* #pragma varargck type "D" Dir*
*/ */
#if defined(__cplusplus)
#ifdef __cplusplus
} }
#endif #endif
#endif #endif

View file

@ -88,6 +88,7 @@ int send(Channel *c, void *v);
int sendp(Channel *c, void *v); int sendp(Channel *c, void *v);
int sendul(Channel *c, unsigned long v); int sendul(Channel *c, unsigned long v);
int threadcreate(void (*f)(void *arg), void *arg, unsigned int stacksize); int threadcreate(void (*f)(void *arg), void *arg, unsigned int stacksize);
int threadcreateidle(void (*f)(void*), void*, unsigned int);
void** threaddata(void); void** threaddata(void);
void threadexits(char *); void threadexits(char *);
void threadexitsall(char *); void threadexitsall(char *);

View file

@ -318,7 +318,8 @@ aselect(uint *q0, uint *q1, Image *color)
} }
/* clicked inside previous selection */ /* clicked inside previous selection */
if(oldq0 <= newq0 && newq0 < oldq1){ /* the "<=" in newq0 <= oldq1 allows us to click the right edge */
if(oldq0 <= newq0 && newq0 <= oldq1){
*q0 = oldq0; *q0 = oldq0;
*q1 = oldq1; *q1 = oldq1;
return 0; return 0;

View file

@ -230,7 +230,6 @@ execcmd(int cmd)
if(debug && doall && cmd == 'a') if(debug && doall && cmd == 'a')
Bprint(bout, "%d entries, cur=%d\n", dot->n, cur+1); Bprint(bout, "%d entries, cur=%d\n", dot->n, cur+1);
for(;;){ for(;;){
print("execcmd dot->n %d\n", dot->n);
if(cur >= dot->n) if(cur >= dot->n)
break; break;
if(doall) { if(doall) {

View file

@ -2,7 +2,7 @@ PLAN9=../..
<$PLAN9/src/mkhdr <$PLAN9/src/mkhdr
TARG=`ls *.c | sed 's/\.c//'` TARG=`ls *.c | sed 's/\.c//'`
LDFLAGS=$LDFLAGS -lsec -lregexp9 -l9 -lbio -lfmt -lutf LDFLAGS=$LDFLAGS -lthread -lsec -lfs -lmux -lregexp9 -l9 -lbio -lfmt -lutf
<$PLAN9/src/mkmany <$PLAN9/src/mkmany

View file

@ -17,6 +17,10 @@ OFILES=\
cistrncmp.$O\ cistrncmp.$O\
cistrstr.$O\ cistrstr.$O\
cleanname.$O\ cleanname.$O\
convD2M.$O\
convM2D.$O\
convM2S.$O\
convS2M.$O\
create.$O\ create.$O\
ctime.$O\ ctime.$O\
date.$O\ date.$O\
@ -31,6 +35,7 @@ OFILES=\
encodefmt.$O\ encodefmt.$O\
errstr.$O\ errstr.$O\
exec.$O\ exec.$O\
fcallfmt.$O\
ffork-$SYSNAME.$O\ ffork-$SYSNAME.$O\
getcallerpc-$OBJTYPE.$O\ getcallerpc-$OBJTYPE.$O\
getenv.$O\ getenv.$O\

View file

@ -2,6 +2,8 @@
Pqueue _threadpq; Pqueue _threadpq;
int _threadmultiproc;
static int nextID(void); static int nextID(void);
/* /*
@ -81,6 +83,14 @@ procrfork(void (*f)(void *), void *arg, uint stacksize, int rforkflag)
int int
proccreate(void (*f)(void*), void *arg, uint stacksize) proccreate(void (*f)(void*), void *arg, uint stacksize)
{ {
Proc *p;
p = _threadgetproc();
if(p->idle){
werrstr("cannot create procs once there is an idle thread");
return -1;
}
_threadmultiproc = 1;
return procrfork(f, arg, stacksize, 0); return procrfork(f, arg, stacksize, 0);
} }
@ -110,6 +120,20 @@ threadcreate(void (*f)(void *arg), void *arg, uint stacksize)
return newthread(_threadgetproc(), f, arg, stacksize, nil, threadgetgrp()); return newthread(_threadgetproc(), f, arg, stacksize, nil, threadgetgrp());
} }
int
threadcreateidle(void (*f)(void *arg), void *arg, uint stacksize)
{
int id;
if(_threadmultiproc){
werrstr("cannot have idle thread in multi-proc program");
return -1;
}
id = newthread(_threadgetproc(), f, arg, stacksize, nil, threadgetgrp());
_threadidle();
return id;
}
/* /*
* Create and initialize a new Proc structure with a single Thread * Create and initialize a new Proc structure with a single Thread
* running inside it. Add the Proc to the global process list. * running inside it. Add the Proc to the global process list.

View file

@ -12,6 +12,8 @@ threadexits(char *exitstr)
p = _threadgetproc(); p = _threadgetproc();
t = p->thread; t = p->thread;
if(t == p->idle)
p->idle = nil;
t->moribund = 1; t->moribund = 1;
_threaddebug(DBGSCHED, "threadexits %s", exitstr); _threaddebug(DBGSCHED, "threadexits %s", exitstr);
if(exitstr==nil) if(exitstr==nil)

View file

@ -93,12 +93,21 @@ runthread(Proc *p)
Thread *t; Thread *t;
Tqueue *q; Tqueue *q;
if(p->nthreads==0) if(p->nthreads==0 || (p->nthreads==1 && p->idle))
return nil; return nil;
q = &p->ready; q = &p->ready;
lock(&p->readylock); lock(&p->readylock);
if(q->head == nil){ if(q->head == nil){
q->asleep = 1; q->asleep = 1;
if(p->idle){
if(p->idle->state != Ready){
fprint(2, "everyone is asleep\n");
exits("everyone is asleep");
}
unlock(&p->readylock);
return p->idle;
}
_threaddebug(DBGSCHED, "sleeping for more work (%d threads)", p->nthreads); _threaddebug(DBGSCHED, "sleeping for more work (%d threads)", p->nthreads);
unlock(&p->readylock); unlock(&p->readylock);
while(rendezvous((ulong)q, 0) == ~0){ while(rendezvous((ulong)q, 0) == ~0){
@ -167,6 +176,9 @@ _threadready(Thread *t)
{ {
Tqueue *q; Tqueue *q;
if(t == t->proc->idle)
return;
assert(t->state == Ready); assert(t->state == Ready);
_threaddebug(DBGSCHED, "readying %d.%d", t->proc->pid, t->id); _threaddebug(DBGSCHED, "readying %d.%d", t->proc->pid, t->id);
q = &t->proc->ready; q = &t->proc->ready;
@ -190,6 +202,25 @@ _threadready(Thread *t)
unlock(&t->proc->readylock); unlock(&t->proc->readylock);
} }
void
_threadidle(void)
{
Tqueue *q;
Thread *t;
Proc *p;
p = _threadgetproc();
q = &p->ready;
lock(&p->readylock);
assert(q->head);
t = q->head;
q->head = t->next;
if(q->tail == t)
q->tail = nil;
p->idle = t;
unlock(&p->readylock);
}
void void
yield(void) yield(void)
{ {

View file

@ -115,6 +115,7 @@ struct Proc
int pid; /* process id */ int pid; /* process id */
int splhi; /* delay notes */ int splhi; /* delay notes */
Thread *thread; /* running thread */ Thread *thread; /* running thread */
Thread *idle; /* idle thread */
int needexec; int needexec;
Execargs exec; /* exec argument */ Execargs exec; /* exec argument */
@ -185,6 +186,7 @@ void _threadinitstack(Thread*, void(*)(void*), void*);
void* _threadmalloc(long, int); void* _threadmalloc(long, int);
void _threadnote(void*, char*); void _threadnote(void*, char*);
void _threadready(Thread*); void _threadready(Thread*);
void _threadidle(void);
ulong _threadrendezvous(ulong, ulong); ulong _threadrendezvous(ulong, ulong);
void _threadsignal(void); void _threadsignal(void);
void _threadsysfatal(char*, va_list); void _threadsysfatal(char*, va_list);
@ -192,6 +194,7 @@ long _xdec(long*);
void _xinc(long*); void _xinc(long*);
void _threadremove(Proc*, Thread*); void _threadremove(Proc*, Thread*);
extern int _threadmultiproc;
extern int _threaddebuglevel; extern int _threaddebuglevel;
extern char* _threadexitsallstatus; extern char* _threadexitsallstatus;
extern Pqueue _threadpq; extern Pqueue _threadpq;