>> Here is a patch for the beos port (All regression tests are OK).

>>     xlog.c : special case for beos to avoid 'link' which does not work yet
>>     beos/sem.c : implementation of new sem_ctl call (GETPID) and a new
>sem_op
>> flag (IPCNOWAIT)
>>     dynloader/beos.c : add a verification of symbol validity (seem that
the
>> loader sometime return OK with an invalid symbol)
>>     postmaster.c :  add beos forking support for the new checkpoint
process
>>     postgres.c : remove beos special case for getrusage
>>     beos.h : Correction of a bas definition of AF_UNIX, misc defnitions
>>
>>
>>     thanks
>>
>>
>>             cyril

Cyril VELTER
This commit is contained in:
Bruce Momjian 2000-12-18 18:45:05 +00:00
parent 5491233f52
commit 1f159e562b
6 changed files with 110 additions and 25 deletions

View File

@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.43 2000/12/18 00:44:45 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.44 2000/12/18 18:45:03 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -874,7 +874,11 @@ XLogFileInit(uint32 log, uint32 seg, bool *usexistent)
close(fd);
#ifndef __BEOS__
if (link(tpath, path) < 0)
#else
if (rename(tpath, path) < 0)
#endif
elog(STOP, "InitRelink(logfile %u seg %u) failed: %m",
logId, logSeg);

View File

@ -12,9 +12,20 @@
#include "postgres.h"
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <OS.h>
#include "utils/elog.h"
/*#define TDBG*/
#ifdef TDBG
#define TRACEDBG(x) printf(x);printf("\n")
#define TRACEDBGP(x,y) printf(x,y);printf("\n")
#define TRACEDBGPP(x,y,z) printf(x,y,z);printf("\n")
#else
#define TRACEDBG(x)
#define TRACEDBGP(x,y)
#define TRACEDBGPP(x,y,z)
#endif
/* Control of a semaphore pool. The pool is an area in which we stored all
the semIds of the pool. The first 4 bytes are the number of semaphore allocated
@ -25,16 +36,19 @@ int semctl(int semId,int semNum,int flag,union semun semun)
int32* Address;
area_info info;
TRACEDBG("->semctl");
/* Try to find the pool */
if (get_area_info(semId,&info)!=B_OK)
{
/* pool is invalid (BeOS area id is invalid) */
errno=EINVAL;
TRACEDBG("<-semctl invalid pool");
return -1;
}
/* Get the pool address */
Address=(int32*)info.address;
TRACEDBGP("--semctl address %d",Address);
/* semNum might be 0 */
@ -44,18 +58,22 @@ int semctl(int semId,int semNum,int flag,union semun semun)
if (flag==SETALL)
{
long i;
TRACEDBG("--semctl setall");
for (i=0;i<Address[0];i++)
{
int32 cnt;
/* Get the current count */
get_sem_count(Address[i+1],&cnt);
get_sem_count(Address[2*i+1],&cnt);
TRACEDBGP("--semctl setall %d",semun.array[i]);
/* Compute and set the new count (relative to the old one) */
cnt-=semun.array[i];
TRACEDBGPP("--semctl acquire id : %d cnt : %d",Address[2*i+1],cnt);
if (cnt > 0)
while(acquire_sem_etc(Address[i+1],cnt,0,0)==B_INTERRUPTED);
while(acquire_sem_etc(Address[2*i+1],cnt,0,0)==B_INTERRUPTED);
if (cnt < 0)
release_sem_etc(Address[i+1],-cnt,0);
release_sem_etc(Address[2*i+1],-cnt,0);
}
return 1;
}
@ -64,37 +82,49 @@ int semctl(int semId,int semNum,int flag,union semun semun)
if (flag==SETVAL)
{
int32 cnt;
TRACEDBGP("--semctl setval %d",semun.val);
/* Get the current count */
get_sem_count(Address[semNum+1],&cnt);
get_sem_count(Address[2*semNum+1],&cnt);
/* Compute and set the new count (relative to the old one) */
cnt-=semun.val;
TRACEDBGPP("--semctl acquire id : %d cnt : %d",Address[2*semNum+1],cnt);
if (cnt > 0)
while(acquire_sem_etc(Address[semNum+1],cnt,0,0)==B_INTERRUPTED);
while(acquire_sem_etc(Address[2*semNum+1],cnt,0,0)==B_INTERRUPTED);
if (cnt < 0)
release_sem_etc(Address[semNum+1],-cnt,0);
release_sem_etc(Address[2*semNum+1],-cnt,0);
return 1;
}
/* Get the last pid which accesed the sem */
if (flag==GETPID)
{
TRACEDBG("->semctl getpid");
return Address[2*semNum+2];
}
/* Delete the pool */
if (flag==IPC_RMID)
{
long i;
thread_info ti;
TRACEDBG("->semctl rmid");
get_thread_info(find_thread(NULL),&ti);
/* Loop over all semaphore to delete them */
TRACEDBGP("->semctl nmbre %d",Address[0]);
for (i=0;i<Address[0];i++)
{
/* Don't remember why I do that */
set_sem_owner(Address[i+1],ti.team);
/* Make sure to have ownership of the semaphore (if created by another team) */
TRACEDBGP("->semctl id %d",Address[2*i+1]);
set_sem_owner(Address[2*i+1],ti.team);
/* Delete the semaphore */
delete_sem(Address[i+1]);
delete_sem(Address[2*i+1]);
/* Reset to an invalid semId (in case other process try to get the infos from a cloned area */
Address[i+1]=0;
Address[2*i+1]=0;
}
/* Set the semaphore count to 0 */
@ -111,6 +141,7 @@ int semctl(int semId,int semNum,int flag,union semun semun)
if (flag==GETNCNT)
{
/* TO BE IMPLEMENTED */
TRACEDBG("--semctl getncnt");
elog(ERROR,"beos : semctl error : GETNCNT not implemented");
return 0;
}
@ -119,12 +150,15 @@ int semctl(int semId,int semNum,int flag,union semun semun)
if (flag==GETVAL)
{
int32 cnt;
get_sem_count(Address[semNum+1],&cnt);
TRACEDBG("--semctl getval");
get_sem_count(Address[2*semNum+1],&cnt);
TRACEDBGP("--semctl val %d",cnt);
return cnt;
}
elog(ERROR,"beos : semctl error : unknown flag");
TRACEDBG("<-semctl unknown flag");
return 0;
}
@ -135,6 +169,7 @@ int semget(int semKey, int semNum, int flags)
area_id parea;
void* Address;
TRACEDBGPP("->semget key : %d num : %d",semKey,semNum);
/* Name of the area to find */
sprintf(Nom,"SYSV_IPC_SEM : %d",semKey);
@ -165,8 +200,9 @@ int semget(int semKey, int semNum, int flags)
void* Ad;
long i;
/* Limit to 500 semaphore in a pool */
if (semNum>500)
/* Limit to 250 (8 byte per sem : 4 for the semid and 4 for the last pid
which acceced the semaphore in a pool */
if (semNum>250)
{
errno=ENOSPC;
return -1;
@ -183,12 +219,12 @@ int semget(int semKey, int semNum, int flags)
/* fill up informations (sem number and sem ids) */
Address=(int32*)Ad;
Address[0]=semNum;
for (i=1;i<=Address[0];i++)
for (i=0;i<Address[0];i++)
{
/* Create the semaphores */
Address[i]=create_sem(0,Nom);
Address[2*i+1]=create_sem(0,Nom);
if ((Address[i]==B_BAD_VALUE)|| (Address[i]==B_NO_MEMORY)||(Address[i]==B_NO_MORE_SEMS))
if ((Address[2*i+1]==B_BAD_VALUE)|| (Address[2*i+1]==B_NO_MEMORY)||(Address[2*i+1]==B_NO_MORE_SEMS))
{
errno=ENOMEM;
return -1;
@ -212,6 +248,7 @@ int semop(int semId, struct sembuf *sops, int nsops)
int32* Address; /*Pool address*/
area_info info;
long i;
long ret;
/* Get the pool address (semId IS an area id) */
get_area_info(semId,&info);
@ -227,16 +264,32 @@ int semop(int semId, struct sembuf *sops, int nsops)
/* Perform acquire or release */
for(i=0;i<nsops;i++)
{
/* remember the PID */
Address[2*(sops[i].sem_num)+2]=getpid();
/* For each sem in the pool, check the operation to perform */
if (sops[i].sem_op < 0)
{
/* Try acuiring the semaphore till we are not inteerupted by a signal */
while (acquire_sem_etc(Address[sops[i].sem_num+1],-sops[i].sem_op,0,0)==B_INTERRUPTED);
if (sops[i].sem_flg==IPC_NOWAIT)
{
/* Try to lock ... */
while ((ret=acquire_sem_etc(Address[2*(sops[i].sem_num)+1],-sops[i].sem_op,B_RELATIVE_TIMEOUT,0))==B_INTERRUPTED);
if (ret!=B_OK)
{
return EWOULDBLOCK;
}
}
else
{
while (acquire_sem_etc(Address[2*(sops[i].sem_num)+1],-sops[i].sem_op,0,0)==B_INTERRUPTED);
}
}
if (sops[i].sem_op > 0)
{
release_sem_etc(Address[sops[i].sem_num+1],sops[i].sem_op,0);
release_sem_etc(Address[2*(sops[i].sem_num)+1],sops[i].sem_op,0);
}
}
return 0;
}

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/port/dynloader/Attic/beos.c,v 1.3 2000/10/07 14:39:11 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/port/dynloader/Attic/beos.c,v 1.4 2000/12/18 18:45:04 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -51,6 +51,11 @@ pg_dlsym(void *handle, char *funcname)
/* Loading symbol */
if(get_image_symbol(*((int*)(handle)),funcname,B_SYMBOL_TYPE_TEXT,(void**)&fpt)==B_OK);
{
/* Sometime the loader return B_OK for an inexistant function with an invalid address !!!
Check that the return address is in the image range */
image_info info;
get_image_info(*((int*)(handle)),&info);
if ((fpt<info.text) || (fpt>=(info.text+info.text_size))) return NULL;
return fpt;
}
elog(NOTICE, "loading symbol '%s' failed ",funcname);

View File

@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.199 2000/12/18 17:33:40 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.200 2000/12/18 18:45:04 momjian Exp $
*
* NOTES
*
@ -2181,6 +2181,11 @@ SSDataBase(int xlop)
fflush(stdout);
fflush(stderr);
#ifdef __BEOS__
/* Specific beos actions before backend startup */
beos_before_backend_startup();
#endif
if ((pid = fork()) == 0) /* child */
{
char *av[ARGV_SIZE * 2];
@ -2189,6 +2194,11 @@ SSDataBase(int xlop)
char dbbuf[ARGV_SIZE];
char xlbuf[ARGV_SIZE];
#ifdef __BEOS__
/* Specific beos actions after backend startup */
beos_backend_startup();
#endif
/* Lose the postmaster's on-exit routines and port connections */
on_exit_reset();
@ -2234,6 +2244,11 @@ SSDataBase(int xlop)
/* in parent */
if (pid < 0)
{
#ifdef __BEOS__
/* Specific beos actions before backend startup */
beos_backend_startup_failed();
#endif
fprintf(stderr, "%s Data Base: fork failed: %s\n",
((xlop == BS_XLOG_STARTUP) ? "Startup" :
((xlop == BS_XLOG_CHECKPOINT) ? "CheckPoint" :

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.196 2000/12/18 17:33:41 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.197 2000/12/18 18:45:05 momjian Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@ -1649,7 +1649,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface ");
puts("$Revision: 1.196 $ $Date: 2000/12/18 17:33:41 $\n");
puts("$Revision: 1.197 $ $Date: 2000/12/18 18:45:05 $\n");
}
/*
@ -1950,7 +1950,7 @@ ShowUsage(void)
(long int) sys.tv_sec,
(long int) sys.tv_usec);
/* BeOS has rusage but only has some fields, and not these... */
#if defined(HAVE_GETRUSAGE) && !defined(__BEOS__)
#if defined(HAVE_GETRUSAGE)
fprintf(StatFp,
"!\t%ld/%ld [%ld/%ld] filesystem blocks in/out\n",
r.ru_inblock - Save_r.ru_inblock,

View File

@ -5,7 +5,13 @@
typedef unsigned char slock_t;
#define AF_UNIX 1 /* no domain sockets on BeOS */
#define AF_UNIX 10 /* no domain sockets on BeOS */
/* Beos doesn't have sysnerr but strerror should works on every error */
extern int sys_nerr;
/* Beos doesn't have all the required getrusage fields */
#undef HAVE_GETRUSAGE
/* SYS V emulation */
@ -16,6 +22,7 @@ typedef unsigned char slock_t;
#define IPC_CREAT 512
#define IPC_EXCL 1024
#define IPC_PRIVATE 234564
#define IPC_NOWAIT 2048
#define EACCESS 2048
#define EIDRM 4096
@ -24,6 +31,7 @@ typedef unsigned char slock_t;
#define GETNCNT 16384
#define GETVAL 65536
#define SETVAL 131072
#define GETPID 262144
union semun
{