aboutsummaryrefslogtreecommitdiffstats
path: root/libparc/parc/concurrent/parc_Thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'libparc/parc/concurrent/parc_Thread.c')
-rw-r--r--libparc/parc/concurrent/parc_Thread.c232
1 files changed, 0 insertions, 232 deletions
diff --git a/libparc/parc/concurrent/parc_Thread.c b/libparc/parc/concurrent/parc_Thread.c
deleted file mode 100644
index 50be042d..00000000
--- a/libparc/parc/concurrent/parc_Thread.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (c) 2017 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- */
-#include <config.h>
-#include <pthread.h>
-#include <stdio.h>
-
-#include <parc/algol/parc_Object.h>
-#include <parc/algol/parc_DisplayIndented.h>
-#include <parc/algol/parc_Memory.h>
-
-#include <parc/concurrent/parc_Thread.h>
-
-struct PARCThread {
- void *(*run)(PARCThread *, PARCObject *param);
- PARCObject *argument;
- bool isCancelled;
- bool isRunning;
- pthread_t thread;
-};
-
-static bool
-_parcThread_Destructor(PARCThread **instancePtr)
-{
- parcAssertNotNull(instancePtr, "Parameter must be a non-null pointer to a PARCThread pointer.");
- PARCThread *thread = *instancePtr;
-
- if (thread->argument != NULL) {
- parcObject_Release(&thread->argument);
- }
-
- thread->isCancelled = true;
- parcThread_Join(thread);
-
- return true;
-}
-
-parcObject_ImplementAcquire(parcThread, PARCThread);
-
-parcObject_ImplementRelease(parcThread, PARCThread);
-
-parcObject_Override(PARCThread, PARCObject,
- .isLockable = true,
- .destructor = (PARCObjectDestructor *) _parcThread_Destructor,
- .copy = (PARCObjectCopy *) parcThread_Copy,
- .toString = (PARCObjectToString *) parcThread_ToString,
- .equals = (PARCObjectEquals *) parcThread_Equals,
- .compare = (PARCObjectCompare *) parcThread_Compare,
- .hashCode = (PARCObjectHashCode *) parcThread_HashCode,
- .display = (PARCObjectDisplay *) parcThread_Display
- );
-
-void
-parcThread_AssertValid(const PARCThread *instance)
-{
- parcAssertTrue(parcThread_IsValid(instance),
- "PARCThread is not valid.");
-}
-
-PARCThread *
-parcThread_Create(void *(*runFunction)(PARCThread *, PARCObject *), PARCObject *restrict parameter)
-{
- parcAssertNotNull(parameter, "Parameter cannot be NULL.");
-
- PARCThread *result = parcObject_CreateAndClearInstance(PARCThread);
-
- if (result) {
- result->run = runFunction;
- result->argument = parcObject_Acquire(parameter);
- result->isCancelled = false;
- result->isRunning = false;
- }
-
- return result;
-}
-
-int
-parcThread_Compare(const PARCThread *instance, const PARCThread *other)
-{
- int result = 0;
- return result;
-}
-
-PARCThread *
-parcThread_Copy(const PARCThread *original)
-{
- PARCThread *result = parcThread_Create(original->run, original->argument);
- result->isCancelled = original->isCancelled;
- result->isRunning = original->isRunning;
-
- return result;
-}
-
-void
-parcThread_Display(const PARCThread *instance, int indentation)
-{
- parcDisplayIndented_PrintLine(indentation, "PARCThread@%p {", instance);
- /* Call Display() functions for the fields here. */
- parcDisplayIndented_PrintLine(indentation, "}");
-}
-
-bool
-parcThread_Equals(const PARCThread *x, const PARCThread *y)
-{
- bool result = false;
-
- if (x == y) {
- result = true;
- } else if (x == NULL || y == NULL) {
- result = false;
- } else {
- result = pthread_equal(x->thread, y->thread);
- }
-
- return result;
-}
-
-PARCHashCode
-parcThread_HashCode(const PARCThread *instance)
-{
- PARCHashCode result = 0;
-
- return result;
-}
-
-bool
-parcThread_IsValid(const PARCThread *thread)
-{
- bool result = false;
-
- if (thread != NULL) {
- result = true;
- }
-
- return result;
-}
-
-PARCJSON *
-parcThread_ToJSON(const PARCThread *thread)
-{
- PARCJSON *result = parcJSON_Create();
-
- return result;
-}
-
-char *
-parcThread_ToString(const PARCThread *thread)
-{
- char *result = parcMemory_Format("PARCThread@%p{.id=%p, .isCancelled=%s}", thread, thread->thread, thread->isCancelled ? "true" : "false");
-
- return result;
-}
-
-static void *
-_parcThread_Run(PARCThread *thread)
-{
- thread->isRunning = true;
- thread->run(thread, thread->argument);
- thread->isRunning = false;
-
- // The thread is done, release the reference to the argument acquired when this PARCThread was created.
- // This prevents the reference from lingering leading to memory leaks if the thread is not properly joined.
- if (thread->argument != NULL) {
- parcObject_Release(&thread->argument);
- }
- // Release the thread reference that was acquired *before* this thread was started.
- parcThread_Release(&thread);
-
- return NULL;
-}
-
-void
-parcThread_Start(PARCThread *thread)
-{
- PARCThread *parameter = parcThread_Acquire(thread);
- pthread_create(&thread->thread, NULL, (void *(*)(void *))_parcThread_Run, parameter);
-}
-
-PARCObject *
-parcThread_GetParameter(const PARCThread *thread)
-{
- return thread->argument;
-}
-
-bool
-parcThread_Cancel(PARCThread *thread)
-{
- if (parcThread_Lock(thread)) {
- thread->isCancelled = true;
- parcThread_Notify(thread);
- parcThread_Unlock(thread);
- }
- return true;
-}
-
-int
-parcThread_GetId(const PARCThread *thread)
-{
- return (int) thread->thread;
-}
-
-bool
-parcThread_IsRunning(const PARCThread *thread)
-{
- return thread->isRunning;
-}
-
-bool
-parcThread_IsCancelled(const PARCThread *thread)
-{
- return thread->isCancelled;
-}
-
-void
-parcThread_Join(PARCThread *thread)
-{
- pthread_join(thread->thread, NULL);
-}