aqhome: more work on new event/ipc interface.

This commit is contained in:
Martin Preuss
2025-02-26 20:59:20 +01:00
parent f63079af11
commit 8968f14122
34 changed files with 1233 additions and 126 deletions

View File

@@ -1,6 +1,6 @@
/****************************************************************************
* This file is part of the project Gwenhywfar.
* Gwenhywfar (c) by 2025 Martin Preuss, all rights reserved.
* This file is part of the project AqHome.
* AqHome (c) by 2025 Martin Preuss, all rights reserved.
*
* The license for this file can be found in the file COPYING which you
* should have received along with this file.
@@ -66,6 +66,9 @@ void GWENHYWFAR_CB _freeData(GWEN_UNUSED void *bp, void *p)
AQH_FDOBJECT *xo;
xo=(AQH_FDOBJECT*)p;
if (xo->fd>=0)
close(xo->fd);
xo->fd=-1;
GWEN_FREE_OBJECT(xo);
}
@@ -175,6 +178,7 @@ int AQH_FdObject_Read(AQH_OBJECT *o, uint8_t *ptrBuffer, uint32_t lenBuffer)
}
else {
DBG_ERROR(AQH_LOGDOMAIN, "Error on read: %s (%d)", strerror(errno), errno);
close(xo->fd);
xo->fd=-1;
return GWEN_ERROR_IO;
}
@@ -217,6 +221,7 @@ int AQH_FdObject_FlushInput(AQH_OBJECT *o)
else if (rv<0) {
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
DBG_ERROR(AQH_LOGDOMAIN, "Error on read: %s (%d)", strerror(errno), errno);
close(xo->fd);
xo->fd=-1;
return GWEN_ERROR_IO;
}
@@ -253,6 +258,7 @@ int AQH_FdObject_Write(AQH_OBJECT *o, const uint8_t *ptrBuffer, uint32_t lenBuff
}
else {
DBG_ERROR(AQH_LOGDOMAIN, "Error on write: %s (%d)", strerror(errno), errno);
close(xo->fd);
xo->fd=-1;
return GWEN_ERROR_IO;
}

View File

@@ -1,6 +1,6 @@
/****************************************************************************
* This file is part of the project Gwenhywfar.
* Gwenhywfar (c) by 2023 Martin Preuss, all rights reserved.
* This file is part of the project AqHome.
* AqHome (c) by 2025 Martin Preuss, all rights reserved.
*
* The license for this file can be found in the file COPYING which you
* should have received along with this file.
@@ -28,7 +28,10 @@ typedef int (*AQH_FDOBJECT_STARTMSG_FN)(AQH_OBJECT *o);
typedef void (*AQH_FDOBJECT_ENDMSG_FN)(AQH_OBJECT *o);
/**
* Create object for given file descriptor (takes over ownership of the given file descriptor, use dup() if
* fd used in another object).
*/
AQHOME_API AQH_OBJECT *AQH_FdObject_new(AQH_EVENT_LOOP *eventLoop, int fd, int mode);
AQHOME_API int AQH_FdObject_GetFdMode(const AQH_OBJECT *o);

View File

@@ -49,6 +49,7 @@ AQH_OBJECT *AQH_Object_new(AQH_EVENT_LOOP *eventLoop)
AQH_OBJECT *o;
GWEN_NEW_OBJECT(AQH_OBJECT, o);
o->refCount=1;
GWEN_INHERIT_INIT(AQH_OBJECT, o);
GWEN_LIST_INIT(AQH_OBJECT, o);
o->eventLoop=eventLoop;
@@ -59,15 +60,25 @@ AQH_OBJECT *AQH_Object_new(AQH_EVENT_LOOP *eventLoop)
void AQH_Object_IncRefCount(AQH_OBJECT *o)
{
if (o && o->refCount>0)
o->refCount++;
}
void AQH_Object_free(AQH_OBJECT *o)
{
if (o) {
GWEN_INHERIT_FINI(AQH_OBJECT, o);
GWEN_LIST_FINI(AQH_OBJECT, o);
if (o && o->refCount>0) {
if (--(o->refCount)==0) {
GWEN_INHERIT_FINI(AQH_OBJECT, o);
GWEN_LIST_FINI(AQH_OBJECT, o);
AQH_Link_List_free(o->linkList);
AQH_Link_List_free(o->linkList);
GWEN_FREE_OBJECT(o);
GWEN_FREE_OBJECT(o);
}
}
}
@@ -75,14 +86,14 @@ void AQH_Object_free(AQH_OBJECT *o)
uint32_t AQH_Object_GetFlags(const AQH_OBJECT *o)
{
return o?o->flags:0;
return (o && o->refCount)?o->flags:0;
}
void AQH_Object_SetFlags(AQH_OBJECT *o, uint32_t i)
{
if (o)
if (o && o->refCount)
o->flags=i;
}
@@ -90,7 +101,7 @@ void AQH_Object_SetFlags(AQH_OBJECT *o, uint32_t i)
void AQH_Object_AddFlags(AQH_OBJECT *o, uint32_t i)
{
if (o)
if (o && o->refCount)
o->flags|=i;
}
@@ -98,7 +109,7 @@ void AQH_Object_AddFlags(AQH_OBJECT *o, uint32_t i)
void AQH_Object_SubFlags(AQH_OBJECT *o, uint32_t i)
{
if (o)
if (o && o->refCount)
o->flags&=~i;
}
@@ -106,14 +117,14 @@ void AQH_Object_SubFlags(AQH_OBJECT *o, uint32_t i)
AQH_EVENT_LOOP *AQH_Object_GetEventLoop(const AQH_OBJECT *o)
{
return o?o->eventLoop:NULL;
return (o && o->refCount)?o->eventLoop:NULL;
}
AQH_LINK *_findLink(AQH_OBJECT *o, uint32_t signalId, uint32_t slotId, AQH_OBJECT *targetObject)
{
if (o) {
if (o && o->refCount) {
AQH_LINK *ln;
ln=AQH_Link_List_First(o->linkList);
@@ -163,7 +174,7 @@ int AQH_Object_EmitSignal(AQH_OBJECT *o, uint32_t signalId, int param1, void *pa
{
int signalWasHandled=0;
if (o) {
if (o && o->refCount) {
AQH_LINK *ln;
ln=AQH_Link_List_First(o->linkList);
@@ -182,7 +193,7 @@ int AQH_Object_EmitSignal(AQH_OBJECT *o, uint32_t signalId, int param1, void *pa
int AQH_Object_HandleSignal(AQH_OBJECT *o, uint32_t slotId, AQH_OBJECT *senderObject, int param1, void *param2)
{
if (o && o->signalHandlerFn)
if (o && o->refCount && o->signalHandlerFn)
return o->signalHandlerFn(o, slotId, senderObject, param1, param2);
return 0;
}
@@ -191,7 +202,7 @@ int AQH_Object_HandleSignal(AQH_OBJECT *o, uint32_t slotId, AQH_OBJECT *senderOb
void AQH_Object_Enable(AQH_OBJECT *o)
{
if (o && o->enableFn)
if (o && o->refCount && o->enableFn)
o->enableFn(o);
}
@@ -199,7 +210,7 @@ void AQH_Object_Enable(AQH_OBJECT *o)
void AQH_Object_Disable(AQH_OBJECT *o)
{
if (o && o->disableFn)
if (o && o->refCount && o->disableFn)
o->disableFn(o);
}
@@ -207,7 +218,7 @@ void AQH_Object_Disable(AQH_OBJECT *o)
AQH_OBJECT_SIGNALHANDLER_FN AQH_Object_SetSignalHandlerFn(AQH_OBJECT *o, AQH_OBJECT_SIGNALHANDLER_FN f)
{
if (o) {
if (o && o->refCount) {
AQH_OBJECT_SIGNALHANDLER_FN oldFn;
oldFn=o->signalHandlerFn;
@@ -221,7 +232,7 @@ AQH_OBJECT_SIGNALHANDLER_FN AQH_Object_SetSignalHandlerFn(AQH_OBJECT *o, AQH_OBJ
AQH_OBJECT_ENABLE_FN AQH_Object_SetEnableFn(AQH_OBJECT *o, AQH_OBJECT_ENABLE_FN f)
{
if (o) {
if (o && o->refCount) {
AQH_OBJECT_ENABLE_FN oldFn;
oldFn=o->enableFn;
@@ -235,7 +246,7 @@ AQH_OBJECT_ENABLE_FN AQH_Object_SetEnableFn(AQH_OBJECT *o, AQH_OBJECT_ENABLE_FN
AQH_OBJECT_DISABLE_FN AQH_Object_SetDisableFn(AQH_OBJECT *o, AQH_OBJECT_DISABLE_FN f)
{
if (o) {
if (o && o->refCount) {
AQH_OBJECT_DISABLE_FN oldFn;
oldFn=o->disableFn;

View File

@@ -9,7 +9,7 @@
#ifndef AQH_OBJECT_H
#define AQH_OBJECT_H
#include "aqhome/api.h"
#include <aqhome/api.h>
#include <gwenhywfar/inherit.h>
#include <gwenhywfar/list.h>
@@ -60,6 +60,7 @@ typedef void (*AQH_OBJECT_DISABLE_FN)(AQH_OBJECT *o);
*/
/*@{*/
AQHOME_API AQH_OBJECT *AQH_Object_new(AQH_EVENT_LOOP *eventLoop);
AQHOME_API void AQH_Object_IncRefCount(AQH_OBJECT *o);
AQHOME_API void AQH_Object_free(AQH_OBJECT *o);
/*@}*/

View File

@@ -40,6 +40,8 @@ struct AQH_OBJECT {
AQH_OBJECT_SIGNALHANDLER_FN signalHandlerFn;
AQH_OBJECT_ENABLE_FN enableFn;
AQH_OBJECT_DISABLE_FN disableFn;
int refCount;
};